Redis適用場景:php
- 取出最新N個數據的操做
- 排行榜應用,取出Top N操做
- 須要精確設定過時時間的應用
- 計數器應用
- uniq操做,獲取某段時間全部數據排除重複值
- 實時系統,反垃圾系統
- Pub/Sub構建實時消息系統。Redis獨有功能,發佈/訂閱
- 構建隊列系統
- 緩存
[root@ying01 ~]# cd /usr/local/src/ [root@ying01 src]# wget http://download.redis.io/releases/redis-4.0.9.tar.gz [root@ying01 src]# tar zxf redis-4.0.9.tar.gz [root@ying01 src]# cd redis-4.0.9/ [root@ying01 redis-4.0.9]# [root@ying01 redis-4.0.9]# make && make install [root@ying01 redis-4.0.9]# echo $? 0
[root@ying01 redis-4.0.9]# vim /etc/redis.conf 如下爲redis.conf配置內容的一些設置: # Examples: # # bind 192.168.1.100 10.0.0.1 //此處配置監聽IP # bind 127.0.0.1 ::1 protected-mode yes //定義保護模式 # Accept connections on the specified port, default is 6379 (IANA #815344). # If port 0 is specified Redis will not listen on a TCP socket. port 6379 //監聽端口 daemonize no //默認值爲no,表明前臺啓動,yes表示後臺啓動 pidfile /var/run/redis_6379.pid //定義redis的PID logfile "" //此處定義redis的log存放路徑,默認爲空 dir ./ //定義rdb的存放位置(aof也是存在這個位置),默認爲根下 slave-priority 100 //此爲設置權重,相似於負責均衡 appendonly no //只增文件的名稱,默認爲 no ,不指定 # The name of the append only file (default: "appendonly.aof") appendfilename "appendonly.aof" //只增文件的名稱爲 appendonly.aof # appendfsync always // 每次更新數據都寫入僅增日誌文件。慢,可是最安全。 appendfsync everysec //每秒調用一次。折中。(默認狀況) # appendfsync no ///不調用,等待操做系統來清空緩衝區當操做系統要輸出數據時。很快。
大概瞭解以上設置含義,如今把配置文件中部份內容按下面設置;html
[root@ying01 ~]# vim /etc/redis.conf daemonize yes //默認爲no,現設置爲yes logfile "/var/log/redis.log" //默認爲空 dir /data/redis //從新設置目錄,原來爲根下,等下須要建立定義的目錄 appendonly yes //原爲no
[root@ying01 redis-4.0.9]# mkdir /data/redis [root@ying01 redis-4.0.9]# redis-server /etc/redis.conf [root@ying01 redis-4.0.9]# netstat -lntp |grep redis tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 1285/redis-server 1
查看redis.log,發現有記下警告信息:node
[root@ying01 redis-4.0.9]# less /var/log/redis.log
第一條 警告信息mysql
WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128. #警告:沒法強制執行TCP的積壓設置511,由於/ proc / sys / net / core / somaxconn設置爲較低的值128。第二條 警告信息linux
WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect. #overcommit_memory設置爲0!在低內存條件下,後臺保存可能會失敗。要解決此問題,請將「vm.overcommit_memory = 1」添加到/etc/sysctl.conf,而後從新啓動或運行命令「sysctl vm.overcommit_memory = 1」以使其生效。第三條警告信息git
WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled. # 警告您在內核中啓用了透明大頁面(THP)支持。這將致使Redis的延遲和內存使用問題。要解決此問題,請以root身份運行命令「echo never> / sys / kernel / mm / transparent_hugepage / enabled」,並將其添加到/etc/rc.local中,以便在從新啓動後保留設置。禁用THP後必須從新啓動Redis。
解決方法:(安裝日誌說明來解決)github
在此文件中,先添加如下語句redis
[root@ying01 redis-4.0.9]# vim /etc/rc.local sysctl vm.overcommit_memory=1 echo never > /sys/kernel/mm/transparent_hugepage/enable
使用命令行,讓其生效;算法
[root@ying01 redis-4.0.9]# sysctl vm.overcommit_memory=1 vm.overcommit_memory = 1 [root@ying01 redis-4.0.9]# echo never > /sys/kernel/mm/transparent_hugepage/enabled
重啓redis服務sql
[root@ying01 redis-4.0.9]# redis-cli -h 127.0.0.1 -p 6379 shutdown //中止服務 [root@ying01 redis-4.0.9]# netstat -lntp |grep redis [root@ying01 redis-4.0.9]# redis-server /etc/redis.conf //開啓服務 [root@ying01 redis-4.0.9]# netstat -lntp |grep redis tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 1285/redis-server 1
再次查看redis.log,發現2個警告已經解除
[root@ying01 redis-4.0.9]# less /var/log/redis.log _._ _.-``__ ''-._ _.-`` `. `_. ''-._ Redis 4.0.9 (00000000/0) 64 bit .-`` .-```. ```\/ _.,_ ''-._ ( ' , .-` | `, ) Running in standalone mode |`-._`-...-` __...-.``-._|'` _.-'| Port: 6379 | `-._ `._ / _.-' | PID: 1394 `-._ `-._ `-./ _.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | http://redis.io `-._ `-._`-.__.-'_.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | `-._ `-._`-.__.-'_.-' _.-' `-._ `-.__.-' _.-' `-._ _.-' `-.__.-' 1394:M 24 Aug 01:35:48.787 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is s et to the lower value of 128. 1394:M 24 Aug 01:35:48.787 # Server initialized 1394:M 24 Aug 01:35:48.787 * Ready to accept connections (END)
https://www.cnblogs.com/GoQC/p/5764201.html
https://www.cnblogs.com/pqchao/p/6549510.html
和Memcached服務同樣,若是關閉RDB和aof數據就會存儲在內存中,當重啓服務或者重啓機器 存儲的數據就會丟失。若是數據很重要,咱們就須要作持久化。
Redis的兩種持久化方式:RDB(Redis DataBase)和AOF(Append Only File)。
RDB:在不一樣的時間點,將redis存儲的數據生成快照並保存到磁盤等介質上。默認狀況下,RDB是開啓的。
AOF:將Redis執行過的全部指令記錄下來,下次Redis從新啓動時,只要把這些指令從前到後再重複執行一遍,就能夠實現數據恢復了。默認狀況,AOF是關閉的。
這兩種方式能夠同時使用。
若是你沒有數據持久化的需求,就能夠關閉RDB、AOF,這樣就跟memcache同樣,變成了一個純內存數據庫。
再次進入redis.conf配置文件
[root@ying01 redis-4.0.9]# vim /etc/redis.conf #注意下面的演示: # In the example below the behaviour will be to save: # after 900 sec (15 min) if at least 1 key changed # after 300 sec (5 min) if at least 10 keys changed # after 60 sec if at least 10000 keys changed # # Note: you can disable saving completely by commenting out all "save" lines. # # It is also possible to remove all the previously configured save # points by adding a save directive with a single empty string argument # like in the following example: # # save "" //開啓持久化 save 900 1 //表示每(900s)15分鐘且至少有1個key改變,就觸發一次持久化 save 300 10 //表示每(300s)5分鐘且至少有10個key改變,就觸發一次持久化 save 60 10000 //表示每(60s)5分鐘且至少有10個key改變,就觸發一次持久化
關閉持久化:把#去掉則關閉持久化
save "" //關閉持久化 #save 900 1 //表示每(900s)15分鐘且至少有1個key改變,就觸發一次持久化 #save 300 10 //表示每(300s)5分鐘且至少有10個key改變,就觸發一次持久化 #save 60 10000
AOF格式中appendfsync三種形式解析:
# appendfsync always //一直寫,每次有變動就寫進去 appendfsync everysec //安全高效,每一秒記錄一次,把數據從內存刷新到磁盤中去 # appendfsync no //每隔一段時間,根據系統的算法,Linux系統不按期把內存的數據同步到磁盤上去,根據這個頻率走,容易丟數據
開啓AOF:appendonly yes,默認是appendonly no。
string爲最簡單的類型,與Memcached同樣的類型,一個key對應一個value,其支持的操做與Memcached的操做相似,它的功能更豐富。設置能夠存二進制的對象。
[root@ying01 redis-4.0.9]# redis-cli 127.0.0.1:6379> set mykey "abc" //s設置單個鍵值 OK 127.0.0.1:6379> get mykey //獲取鍵值 "abc" 127.0.0.1:6379> mset k1 a k2 b k3 c k4 d //設置多個鍵值 OK 127.0.0.1:6379> mget k2 mykey //獲取多個鍵值 1) "b" 2) "abc" 127.0.0.1:6379>
list是一個鏈表結構,主要功能是push、pop、獲取一個範圍的全部值等等。操做中key理解爲鏈表的名字。
應用場景:
使用 list 結構,咱們能夠輕鬆地實現最新消息排行等功能(好比新浪微博的 TimeLine )。list 的另外一個應用就是消息隊列,能夠利用 list 的 push操做,將任務存在 list 中,而後工做線程再用pop操做將任務取出進行執行。
127.0.0.1:6379> LPUSH list1 "8" (integer) 1 127.0.0.1:6379> LPUSH list1 "18" (integer) 2 127.0.0.1:6379> LPUSH list1 "28" (integer) 3 127.0.0.1:6379> LRANGE list1 0 -1 1) "28" 2) "18" 3) "8" 127.0.0.1:6379> LPOP list1 "28" 127.0.0.1:6379> LRANGE list1 0 -1 1) "18" 2) "8" 127.0.0.1:6379>
set是集合,和咱們數學中的集合概念類似,對集合的操做有添加刪除元素,有對多個集合求交併差等操做。操做中key理解爲集合的名字。
應用場景:
好比在微博應用中,能夠將一個用戶全部的關注人存在一個集合中,將其全部粉絲存在一個集合。由於 Redis 很是人性化的爲集合提供了求交集、並集、差集等操做,那麼就能夠很是方便的實現如共同關注、共同喜愛、二度好友等功能,對上面的全部集合操做,你還可使用不一樣的命令選擇將結果返回給客戶端仍是存集到一個新的集合中。
創建set一、set2集合元素
127.0.0.1:6379> SADD set1 8 (integer) 0 127.0.0.1:6379> SADD set1 28 (integer) 0 127.0.0.1:6379> SADD set1 58 (integer) 1 127.0.0.1:6379> SADD set2 28 (integer) 1 127.0.0.1:6379> SADD set2 58 (integer) 1 127.0.0.1:6379> SADD set2 88 (integer) 1
查看set一、set2集合
127.0.0.1:6379> SMEMBERS set1 1) "8" 2) "28" 3) "58" 127.0.0.1:6379> SMEMBERS set2 1) "28" 2) "58" 3) "88"
集合並集
127.0.0.1:6379> SUNION set1 set2 1) "8" 2) "28" 3) "58" 4) "88"
集合交集
127.0.0.1:6379> SINTER set1 set2 1) "28" 2) "58"
集合差集
127.0.0.1:6379> SDIFF set1 set2 1) "8"
刪除元素
127.0.0.1:6379> SREM set1 8 28 (integer) 2 127.0.0.1:6379> SMEMBERS set1 1) "58"
sorted set是有序集合,它比set多了一個權重參數score,使得集合中的元素可以按 score 進行有序排列。
應用場景:
好比一個存儲全班同窗成績的 Sorted Sets,其集合 value 能夠是同窗的學號,而 score 就能夠是其考試得分,這樣在數據插入集合的時候,就已經進行了自然的排序。
127.0.0.1:6379> ZADD score 18 A (integer) 1 127.0.0.1:6379> ZADD score 8 B (integer) 1 127.0.0.1:6379> ZADD score 58 ZQ (integer) 1 127.0.0.1:6379> ZADD score 88 Q (integer) 1 127.0.0.1:6379> ZRANGE score 0 -1 //正序 1) "B" 2) "A" 3) "ZQ" 4) "Q" 127.0.0.1:6379> ZREVRANGE score 0 -1 //倒序 1) "Q" 2) "ZQ" 3) "A" 4) "B" 127.0.0.1:6379>
在 Memcached 中,咱們常常將一些結構化的信息打包成 hashmap,在客戶端序列化後存儲爲一個字符串的值(通常是 JSON 格式),好比用戶的暱稱、年齡、性別、積分等
127.0.0.1:6379> HSET hash1 name zq //定義 (integer) 1 127.0.0.1:6379> HSET hash1 age 18 (integer) 1 127.0.0.1:6379> HSET hash1 job sing (integer) 1 127.0.0.1:6379> HSET hash1 home shanghai (integer) 1 127.0.0.1:6379> Hget hash1 job //查看 "sing" 127.0.0.1:6379> Hget hash1 name "zq" 127.0.0.1:6379> Hget hash1 home "shanghai" 127.0.0.1:6379> Hget hash1 age "18" 127.0.0.1:6379>
127.0.0.1:6379> set key1 18 OK 127.0.0.1:6379> set key2 58 OK 127.0.0.1:6379> set key1 88 OK 127.0.0.1:6379> get key1 "88" 127.0.0.1:6379>
127.0.0.1:6379> SETNX key1 zq (integer) 0 127.0.0.1:6379> get key1 "88" 127.0.0.1:6379> SETNX key3 zq (integer) 1 127.0.0.1:6379> get key3 "zq" 127.0.0.1:6379>
127.0.0.1:6379> set key3 zq01 ex 5 OK 127.0.0.1:6379> get key3 (nil) 127.0.0.1:6379> set key3 zq01 ex 50 OK 127.0.0.1:6379> get key3 "zq01" 127.0.0.1:6379> 127.0.0.1:6379> setex key3 10 zq02 //給key3設置過時時間爲10s,值爲zq02,若key已經存在,會覆蓋新的值 OK 127.0.0.1:6379> get key3 "zq02" 127.0.0.1:6379> get key3 (nil)
lpush lista a //從左側加入一個元素 lrange lista 0 -1 //取出從0開始到倒數第一個之間的元素 lpop lista //從左側取出第一個元素 rpush lista 1 //從右側加入一個元素 rpop lista //從右側取出第一個元素
127.0.0.1:6379> LPUSH lista 111 (integer) 1 127.0.0.1:6379> LPUSH lista 222 (integer) 2 127.0.0.1:6379> LPUSH lista 333 (integer) 3 127.0.0.1:6379> LPUSH lista 555 (integer) 4 127.0.0.1:6379> LRANGE lista 0 -1 1) "555" 2) "333" 3) "222" 4) "111" 127.0.0.1:6379> LPOP lista "555" 127.0.0.1:6379> LPOP lista "333" 127.0.0.1:6379> LRANGE lista 0 -1 1) "222" 2) "111" 127.0.0.1:6379> RPOP lista "111" 127.0.0.1:6379> LRANGE lista 0 -1 1) "222" 127.0.0.1:6379>
元素的修改:先在xxx清單增長 A B C D E ,而後更換第二位的數值
127.0.0.1:6379> LPUSH xxx A (integer) 1 127.0.0.1:6379> LPUSH xxx B (integer) 2 127.0.0.1:6379> LPUSH xxx C (integer) 3 127.0.0.1:6379> LPUSH xxx D (integer) 4 127.0.0.1:6379> LPUSH xxx E (integer) 5 127.0.0.1:6379> LSET xxx 2 W OK 127.0.0.1:6379> LINDEX xxx 2 "W" 127.0.0.1:6379> LINDEX xxx 3 "B" 127.0.0.1:6379> LINDEX xxx 4 "A" 127.0.0.1:6379> LINDEX xxx 5 (nil) 127.0.0.1:6379> LINDEX xxx 1 "D" 127.0.0.1:6379> LINDEX xxx 0 "E"
查看清單中元素的數量
127.0.0.1:6379> LLEN xxx (integer) 5
在某個元素前面(後面)插入一個元素:
127.0.0.1:6379> LINSERT xxx before D S (integer) 6 127.0.0.1:6379> LRANGE xxx 0 -1 1) "E" 2) "S" 3) "D" 4) "W" 5) "B" 6) "A" 127.0.0.1:6379>
前面已經演示過,下面set操做整理起來;
命令格式 | 釋義 |
---|---|
sadd 集合名 元素 | 向集合添加元素 |
smembers 集合名 | 查看集合中的所有元素 |
srem 集合名 元素 | 刪除元素 |
spop 集合名 | 取出一個元素,刪除 |
sdiff 集合1 集合2 | 以集合1爲標準,求差集 |
sdiffstore 集合1 集合2 集合3 | 求差集並儲存到集合1 |
sinter 集合1 集合2 | 求交集 |
sinterstore 集合1 集合2 集合3 | 求交集,並存儲到集合1 |
sunion 集合1 集合2 | 求並集 |
sunion 集合1 集合2 集合3 | 求並集並存儲到集合1 |
sismembaer 集合 元素 | 判斷一個元素是否屬於一個集合,是則返回1。 |
srandmember 集合 | 取出一個元素,但不刪除 |
zadd 集合 | 建立有序集合 |
zrange 集合 0 -1 | 顯示全部元素,按順序顯示 |
zrange 集合 0 -1 withscores | 帶上分值 |
zrem 集合 元素 | 刪除指定元素 |
zrank 集合 元素 | 返回元素的索引值 |
zrevrank 集合 元素 | 按score反向排列 |
zrevrange 集合 0 -1 | 反向顯示,並帶分值 |
zcard 集合 | 返回集合中的元素的個數 |
zrangebyscore 集合 1 10 | 返回1-10的元素個數 |
zremrangebyrank 集合 0 2 | 刪除索引0-2的元素,按分值正向排序 |
zremrangebyscore 集合 0 2 | 刪除分值0-2的元素 |
127.0.0.1:6379> HMSET hash2 a 1 b 2 c 3 d 4 e 5 OK 127.0.0.1:6379> Hgetall hash2 1) "a" 2) "1" 3) "b" 4) "2" 5) "c" 6) "3" 7) "d" 8) "4" 9) "e" 10) "5"
127.0.0.1:6379> hmget hash2 b c 1) "2" 2) "3"
HMGET 查詢一個鍵值
127.0.0.1:6379> hdel hash2 b (integer) 1 127.0.0.1:6379> Hgetall hash2 1) "a" 2) "1" 3) "c" 4) "3" 5) "d" 6) "4" 7) "e" 8) "5"
127.0.0.1:6379> hkeys hash2 1) "a" 2) "c" 3) "d" 4) "e"
127.0.0.1:6379> hvals hash2 1) "1" 2) "3" 3) "4" 4) "5"
127.0.0.1:6379> hlen hash2 (integer) 4 127.0.0.1:6379>
經常使用如下鍵值
- keys * :取出全部鍵
- exists 鍵名:存在返回1
- del 鍵:刪除鍵
- expire 鍵 100:設置鍵100秒後過時
- ttl 鍵:查看鍵的過時時間,單位是秒,當鍵不存在返回-2,鍵存在但沒設置過時時間返回-1
- select 0 :表明選擇當前數據庫,默認進入0數據庫
- move age 1 :把age移動到1數據庫
- persist 鍵:取消鍵的過時時間
- randomkey:返回一個鍵
- rename oldname newname:重命名
- type 鍵:返回鍵的類型
查看全部鍵值:
127.0.0.1:6379> keys * 1) "score" 2) "key1" 3) "set2" 4) "key2" 5) "xxx" 6) "k4" 7) "lista" 8) "list1" 9) "hash1" 10) "set1" 11) "k2" 12) "k1" 13) "k3" 14) "mykey" 15) "hash2"
模糊匹配鍵:
127.0.0.1:6379> keys ke* 1) "key1" 2) "key2"
判斷鍵是否存在:
127.0.0.1:6379> exists key1 (integer) 1 127.0.0.1:6379> exists key (integer) 0
刪除鍵
127.0.0.1:6379> get key1 "88" 127.0.0.1:6379> del key1 (integer) 1 127.0.0.1:6379> get key1 (nil)
設置過時時間:
127.0.0.1:6379> expire key2 50 (integer) 1
查看鍵的過時時間:
127.0.0.1:6379> ttl key2 (integer) 42
選擇當前數據庫:
127.0.0.1:6379> select 0 OK 127.0.0.1:6379> select 1 OK 127.0.0.1:6379[1]> keys * (empty list or set) 127.0.0.1:6379[1]> select 0 //表明選擇當前數據庫,默認進入0 數據庫 OK
將某個鍵移動到其餘數據庫:
127.0.0.1:6379> keys * 1) "score" 2) "set2" 3) "xxx" 4) "k4" 5) "lista" 6) "list1" 7) "hash1" 8) "set1" 9) "k2" 10) "k1" 11) "k3" 12) "mykey" 13) "hash2" 127.0.0.1:6379> move k1 3 (integer) 1
隨機返回一個鍵:
127.0.0.1:6379> randomkey "k2" 127.0.0.1:6379> randomkey "set2" 127.0.0.1:6379> randomkey "set2"
鍵重命名:
127.0.0.1:6379> rename k1 kx //k1不存在 (error) ERR no such key 127.0.0.1:6379> keys * 1) "score" 2) "set2" 3) "xxx" 4) "k4" 5) "lista" 6) "list1" 7) "hash1" 8) "set1" 9) "k2" 10) "k3" 11) "mykey" 12) "hash2" 127.0.0.1:6379> rename k2 k8 OK
鍵的類型:
127.0.0.1:6379> type score zset 127.0.0.1:6379> type k8 string 127.0.0.1
dbsize:返回當前數據的key數量
:6379> dbsize (integer) 12
如何解決redis漏洞
root@ying01 redis-4.0.9]# vim /etc/redis.conf port 18000 //更改端口 requirepass www123 //設置密碼 rename-command CONFIG ying //改成ying,自定義 # rename-command CONFIG "" //禁用
先不重啓服務,查看k8的值
[root@ying01 redis-4.0.9]# redis-cli 127.0.0.1:6379> get k6 (nil) 127.0.0.1:6379> get k8 "b" 127.0.0.1:6379> quit
重啓服務
[root@ying01 redis-4.0.9]# killall redis-server [root@ying01 redis-4.0.9]# redis-server /etc/redis.conf
嘗試登陸redis
[root@ying01 redis-4.0.9]# redis-cli //直接登陸不上 Could not connect to Redis at 127.0.0.1:6379: Connection refused not connected> quit [root@ying01 redis-4.0.9]# netstat -lntp |grep redis //端口變爲18000 tcp 0 0 127.0.0.1:18000 0.0.0.0:* LISTEN 1832/redis-server 1 [root@ying01 redis-4.0.9]# redis-cli -p 18000 //指定端口18000 仍是登陸不上 127.0.0.1:18000> get k8 (error) NOAUTH Authentication required. 127.0.0.1:18000> quit [root@ying01 redis-4.0.9]# redis-cli -p 18000 -a 'www123' //端口、密碼都指定,才能登陸 127.0.0.1:18000> get k8 "b" 127.0.0.1:18000>
慢查詢日誌,兩個參數:一個是執行時長,單位是微妙,另外一個是慢查詢日誌的長度。當一個新的命令被寫入日誌時,最老的一條會從命令日誌隊列中被移除。
在配置文件redis.conf中,查看慢日誌的定義:
[root@ying01 ~]# vim /etc/redis.conf slowlog-log-slower-than 1000:表示慢於1000ms則記錄日誌 slowlog-max-len 128:定義長度,最多存128條
使用命令行,查詢慢日誌
- slowlog get:列出 所有慢查詢日誌
- slowlog len:查看慢查詢日誌條數
先在配置文件中,定義慢於10ms,則記錄日誌,(爲了方便試驗,由於任何操做都會大於10ms)
[root@ying01 ~]# vim /etc/redis.conf slowlog-log-slower-than 10
啓動redis服務,開始作測試
[root@ying01 ~]# redis-server /etc/redis.conf [root@ying01 ~]# ps aux |grep redis root 1385 4.3 0.7 145304 7692 ? Ssl 23:36 0:00 redis-server 127.0.0.1:6379 root 1390 0.0 0.0 112720 984 pts/0 R+ 23:36 0:00 grep --color=auto redis [root@ying01 ~]# redis-cli -a 'www123' 127.0.0.1:6379> slowlog get //此時剛進入了,沒有 1) 1) (integer) 0 2) (integer) 1535125047 3) (integer) 283 4) 1) "COMMAND" 5) "127.0.0.1:34834" 6) "" 127.0.0.1:6379> keys * //試着執行一個命令 1) "set2" 2) "score" 3) "k8" 4) "xxx" 5) "lista" 6) "k4" 7) "k3" 8) "hash2" 9) "hash1" 10) "list1" 11) "set1" 12) "mykey" 127.0.0.1:6379> get k3 //再執行第二個命令 "c" 127.0.0.1:6379> SLOWLOG get //此時列出所有查詢日誌 1) 1) (integer) 2 2) (integer) 1535125090 3) (integer) 30 4) 1) "keys" 2) "*" 5) "127.0.0.1:34834" 6) "" 2) 1) (integer) 1 2) (integer) 1535125066 3) (integer) 34 4) 1) "slowlog" 2) "get" 5) "127.0.0.1:34834" 6) "" 3) 1) (integer) 0 2) (integer) 1535125047 3) (integer) 283 4) 1) "COMMAND" 5) "127.0.0.1:34834" 6) "" 127.0.0.1:6379> SLOWLOG get 1 //得到當前的日誌 1) 1) (integer) 3 2) (integer) 1535125141 3) (integer) 68 4) 1) "SLOWLOG" 2) "get" 5) "127.0.0.1:34834" 6) "" 127.0.0.1:6379> SLOWLOG get 2 //得到前二個日誌 1) 1) (integer) 4 2) (integer) 1535125219 3) (integer) 15 4) 1) "SLOWLOG" 2) "get" 3) "1" 5) "127.0.0.1:34834" 6) "" 2) 1) (integer) 3 2) (integer) 1535125141 3) (integer) 68 4) 1) "SLOWLOG" 2) "get" 5) "127.0.0.1:34834" 6) "" 127.0.0.1:6379> SLOWLOG len //得到慢日誌條數 (integer) 6 127.0.0.1:6379>
下載phpredis模塊源碼包,解壓
[root@ying01]# cd /usr/local/src/ [root@ying01 src]# wget https://codeload.github.com/phpredis/phpredis/zip/develop [root@ying01 src]# mv develop phpredis-develop.zip [root@ying01 src]# unzip phpredis-develop.zip
編譯,安裝php的redis模塊
[root@ying01 phpredis-develop]# cd phpredis-develop/ [root@ying01 phpredis-develop]# /usr/local/php-fpm/bin/phpize Configuring for: PHP Api Version: 20131106 Zend Module Api No: 20131226 Zend Extension Api No: 220131226 [root@ying01 phpredis-develop]# ./configure --with-php-config=/usr/local/php-fpm/bin/php-config [root@ying01 phpredis-develop]# make [root@ying01 phpredis-develop]# make install
在php.ini配置文件中添加 extension=redis.so
[root@ying01 phpredis-develop]# vim /usr/local/php-fpm/etc/php.ini extension=memcache.so //memcache模塊以前添加的 extension=redis.so //添加
查看php-fpm模塊中,是否有redis模塊;
[root@ying01 phpredis-develop]# /usr/local/php-fpm/bin/php -m|grep redis redis [root@ying01 phpredis-develop]# /etc/init.d/php-fpm restart Gracefully shutting down php-fpm . done Starting php-fpm done
** redis存儲session,有三種配置方法**:
一、/usr/local/php-fpm/etc/php.ini中添加:
session.save_handler = "redis"
session.save_path = "tcp://127.0.0.1:6379"
二、lamp中在Apache虛擬主機配置文件中添加:
php_value session.save_handler = "redis"
php_value session.save_path = "tcp://127.0.0.1:6379"
三、在php-fpm配置文件對應的pool:/usr/local/php-fpm/etc/php-fpm.d/ying.com.conf 中添加:
php_value[session.save_handler] = "redis"
php_value[session.save_path] = "tcp://127.0.0.1:6379"
把下面語句添加在 ying.com pool下
[root@ying01 ~]# vim /usr/local/php-fpm/etc/php-fpm.d/ying.com.conf 添加如下語句: php_value[session.save_handler] = redis php_value[session.save_path] = " tcp://127.0.0.1:6379 "
在redis配置文件中,取消密碼,方便試驗
[root@ying01 ~]# vim /etc/redis.conf #requirepass www123 //加上#,就表明此命令不執行
更改配置文件後,須要重啓redis服務
[root@ying01 ~]# killall redis-server [root@ying01 ~]# redis-server /etc/redis.conf
測試中,能夠看出來redis是能夠存儲ssion
[root@ying01 ~]# curl localhost/1.php 1535202678<br><br>1535202678<br><br>fb0tk0r5nnvgs1fhngten6kvf4 [root@ying01 ~]# curl localhost/1.php 1535202680<br><br>1535202680<br><br>d9u8oi1d0o1l2m6blm0gneb9p5 //注意 [root@ying01 ~]# curl localhost/1.php 1535202681<br><br>1535202681<br><br>ks2a20t9gikjbvhpevcrrts5r0 [root@ying01 ~]# curl localhost/1.php 1535202681<br><br>1535202681<br><br>26ff1ifkdi6s6vje10kl1ane36 [root@ying01 ~]# curl localhost/1.php 1535202682<br><br>1535202682<br><br>5setf9nc5ih8de5a8p6dda01r3 [root@ying01 ~]# curl localhost/1.php 1535202682<br><br>1535202682<br><br>phh916fl6s4fcl08agee13cqe6 [root@ying01 ~]# curl localhost/1.php 1535202683<br><br>1535202683<br><br>2467qf64g4j4rk4ac2o2ms4mm6 [root@ying01 ~]# curl localhost/1.php 1535202684<br><br>1535202684<br><br>cl3m6hpshf55unro62ccq4q5h6 [root@ying01 ~]# redis-cli 127.0.0.1:6379> keys * 1) "PHPREDIS_SESSION:d9u8oi1d0o1l2m6blm0gneb9p5" //注意 2) "score" 3) "PHPREDIS_SESSION:cl3m6hpshf55unro62ccq4q5h6" 4) "list1" 5) "k8" 6) "set1" 7) "PHPREDIS_SESSION:2467qf64g4j4rk4ac2o2ms4mm6" 8) "k3" 9) "PHPREDIS_SESSION:26ff1ifkdi6s6vje10kl1ane36" 10) "PHPREDIS_SESSION:phh916fl6s4fcl08agee13cqe6" 11) "mykey" 12) "PHPREDIS_SESSION:fb0tk0r5nnvgs1fhngten6kvf4" 13) "set2" 14) "hash1" 15) "lista" 16) "hash2" 17) "PHPREDIS_SESSION:ks2a20t9gikjbvhpevcrrts5r0" 18) "k4" 19) "PHPREDIS_SESSION:5setf9nc5ih8de5a8p6dda01r3" 20) "xxx" 127.0.0.1:6379> get PHPREDIS_SESSION:d9u8oi1d0o1l2m6blm0gneb9p5 //注意 "TEST|i:1535202680;TEST3|i:1535202680;" 127.0.0.1:6379> get PHPREDIS_SESSION:5setf9nc5ih8de5a8p6dda01r3 "TEST|i:1535202682;TEST3|i:1535202682;" 127.0.0.1:6379>
在master(ying01)上修改redis的配置文件,master上改動不大
[root@ying01 ~]# vim /etc/redis.conf bind 192.168.112.136 127.0.0.1 port 6379 pidfile /var/run/redis_6379.pid appendonly yes
在slave(ying02)上修改redis的配置文件
[root@ying02 ~]# vim /etc/redis.conf bind 127.0.0.1 192.168.112.138 port 6380 pidfile /var/run/redis_6380.pid slaveof 192.168.112.136 6379 appendonly yes
分別在master、slave機器上重啓redis服務
[root@ying01 ~]# killall redis-server [root@ying01 ~]# redis-server /etc/redis.conf
[root@ying02 ~]# killall redis-server [root@ying02 ~]# redis-server /etc/redis.conf
分別在master、slave機器上登陸redis,使用命令"info Replication"
[root@ying01 ~]# redis-cli -p 6379 127.0.0.1:6379> info Replication # Replication role:master connected_slaves:1 slave0:ip=192.168.112.138,port=6380,state=online,offset=14,lag=1 master_replid:87fc3ee31a10a84b042f74e896e060d3acbd9de2 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:14 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:14 127.0.0.1:6379>
slave上的信息
[root@ying02 ~]# redis-cli -p 6380 127.0.0.1:6380> info Replication # Replication role:slave master_host:192.168.112.136 master_port:6379 master_link_status:up master_last_io_seconds_ago:5 master_sync_in_progress:0 slave_repl_offset:28 slave_priority:100 slave_read_only:1 connected_slaves:0 master_replid:87fc3ee31a10a84b042f74e896e060d3acbd9de2 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:28 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:28 127.0.0.1:6380>
上面的信息代表:主從啓動成功
先看redis的集羣架構圖
在這個圖中,每個藍色的圈都表明着一個redis的服務器節點。它們任何兩個節點之間都是相互連通的。客戶端能夠與任何一個節點相鏈接,而後就能夠訪問集羣中的任何一個節點。對其進行存取和其餘操做。
redis集羣特色:
- 多個redis節點網絡互聯,數據共享
- 全部的節點都是一主一從(能夠是多個從),其中從不提供服務,僅做爲備用
- 不支持同時處理多個鍵(如mset/mget),由於redis須要把鍵均勻分佈在各個節點上,併發量很高的狀況下同時建立鍵值會下降性能並致使不可預測的行爲。
- 支持在線增長、刪除節點
- 客戶端能夠連任何一個主節點進行讀寫
參考資料:
ying01機器上
新建redis_7000.conf配置文件
[root@ying01 ~]# cd /etc/ [root@ying01 etc]# vim redis_7000.conf port 7000 bind 192.168.112.136 daemonize yes pidfile /var/run/redis_7000.pid dir /data/redis_data/7000 cluster-enabled yes cluster-config-file nodes_7000.conf cluster-node-timeout 10100 appendonly yes
新建redis_7002.conf配置文件
[root@ying01 etc]# vim redis_7002.conf port 7002 bind 192.168.112.136 daemonize yes pidfile /var/run/redis_7002.pid dir /data/redis_data/7002 cluster-enabled yes cluster-config-file nodes_7002.conf cluster-node-timeout 10100 appendonly yes
新建redis_7004.conf配置文件
[root@ying01 etc]# vim redis_7004.conf port 7004 bind 192.168.112.136 daemonize yes pidfile /var/run/redis_7004.pid dir /data/redis_data/7004 cluster-enabled yes cluster-config-file nodes_7004.conf cluster-node-timeout 10100 appendonly yes
建立目錄
[root@ying01 etc]# mkdir /data/redis_data [root@ying01 etc]# mkdir /data/redis_data/{7000,7002,7004}
分別開啓7000、700二、7004的redis服務
[root@ying01 etc]# redis-server /etc/redis_7000.conf 13835:C 27 Aug 00:20:59.978 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo 13835:C 27 Aug 00:20:59.978 # Redis version=4.0.9, bits=64, commit=00000000, modified=0, pid=13835, just started 13835:C 27 Aug 00:20:59.978 # Configuration loaded [root@ying01 etc]# redis-server /etc/redis_7002.conf 13840:C 27 Aug 00:21:08.133 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo 13840:C 27 Aug 00:21:08.133 # Redis version=4.0.9, bits=64, commit=00000000, modified=0, pid=13840, just started 13840:C 27 Aug 00:21:08.133 # Configuration loaded [root@ying01 etc]# redis-server /etc/redis_7004.conf 13845:C 27 Aug 00:21:13.131 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo 13845:C 27 Aug 00:21:13.131 # Redis version=4.0.9, bits=64, commit=00000000, modified=0, pid=13845, just started 13845:C 27 Aug 00:21:13.131 # Configuration loaded [root@ying01 etc]# netstat -lntp |grep redis tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 1741/redis-server 1 tcp 0 0 192.168.112.136:6379 0.0.0.0:* LISTEN 1741/redis-server 1 tcp 0 0 192.168.112.136:17004 0.0.0.0:* LISTEN 13846/redis-server tcp 0 0 192.168.112.136:7000 0.0.0.0:* LISTEN 13836/redis-server tcp 0 0 192.168.112.136:7002 0.0.0.0:* LISTEN 13841/redis-server tcp 0 0 192.168.112.136:7004 0.0.0.0:* LISTEN 13846/redis-server tcp 0 0 192.168.112.136:17000 0.0.0.0:* LISTEN 13836/redis-server tcp 0 0 192.168.112.136:17002 0.0.0.0:* LISTEN 13841/redis-server [root@ying01 etc]# ps aux |grep redis root 1741 0.1 0.5 147352 9840 ? Ssl 8月26 0:05 redis-server 192.168.112.136:6379 root 13836 0.0 0.4 145308 7580 ? Ssl 00:20 0:00 redis-server 192.168.112.136:7000 [cluster] root 13841 0.1 0.4 145308 7576 ? Ssl 00:21 0:00 redis-server 192.168.112.136:7002 [cluster] root 13846 0.0 0.4 145308 7576 ? Ssl 00:21 0:00 redis-server 192.168.112.136:7004 [cluster] root 13853 0.0 0.0 112720 984 pts/0 S+ 00:21 0:00 grep --color=auto redis
ying02 機器上
新建redis_7001.conf配置文件
[root@ying02 etc]# vim redis_7001.conf port 7001 bind 192.168.112.138 daemonize yes pidfile /var/run/redis_7001.pid dir /data/redis_data/7001 cluster-enabled yes cluster-config-file nodes_7001.conf cluster-node-timeout 10100 appendonly yes
新建redis_7003.conf配置文件
[root@ying02 etc]# vim redis_7003.conf port 7003 bind 192.168.112.138 daemonize yes pidfile /var/run/redis_7003.pid dir /data/redis_data/7003 cluster-enabled yes cluster-config-file nodes_7003.conf cluster-node-timeout 10100 appendonly yes
新建redis_7005.conf配置文件
[root@ying02 etc]# vim redis_7005.conf port 7005 bind 192.168.112.138 daemonize yes pidfile /var/run/redis_7005.pid dir /data/redis_data/7005 cluster-enabled yes cluster-config-file nodes_7005.conf cluster-node-timeout 10100 appendonly yes
建立目錄
[root@ying02 etc]# mkdir /data/redis_data [root@ying02 etc]# mkdir /data/redis_data/{7001,7003,7005}
分別開啓700一、700三、7005的redis服務
[root@ying02 etc]# redis-server /etc/redis_7001.conf 4535:C 27 Aug 00:22:55.023 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo 4535:C 27 Aug 00:22:55.023 # Redis version=4.0.9, bits=64, commit=00000000, modified=0, pid=4535, just started 4535:C 27 Aug 00:22:55.023 # Configuration loaded [root@ying02 etc]# redis-server /etc/redis_7003.conf 4544:C 27 Aug 00:22:59.103 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo 4544:C 27 Aug 00:22:59.103 # Redis version=4.0.9, bits=64, commit=00000000, modified=0, pid=4544, just started 4544:C 27 Aug 00:22:59.103 # Configuration loaded [root@ying02 etc]# redis-server /etc/redis_7005.conf 4552:C 27 Aug 00:23:03.193 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo 4552:C 27 Aug 00:23:03.193 # Redis version=4.0.9, bits=64, commit=00000000, modified=0, pid=4552, just started 4552:C 27 Aug 00:23:03.193 # Configuration loaded [root@ying02 etc]# netstat -lntp |grep redis tcp 0 0 192.168.112.138:17003 0.0.0.0:* LISTEN 4545/redis-server 1 tcp 0 0 192.168.112.138:6380 0.0.0.0:* LISTEN 2974/redis-server 1 tcp 0 0 127.0.0.1:6380 0.0.0.0:* LISTEN 2974/redis-server 1 tcp 0 0 192.168.112.138:17005 0.0.0.0:* LISTEN 4553/redis-server 1 tcp 0 0 192.168.112.138:7001 0.0.0.0:* LISTEN 4536/redis-server 1 tcp 0 0 192.168.112.138:7003 0.0.0.0:* LISTEN 4545/redis-server 1 tcp 0 0 192.168.112.138:7005 0.0.0.0:* LISTEN 4553/redis-server 1 tcp 0 0 192.168.112.138:17001 0.0.0.0:* LISTEN 4536/redis-server 1 [root@ying02 etc]# ps aux |grep redis root 2974 0.1 0.1 147352 2516 ? Ssl 8月26 0:05 redis-server 127.0.0.1:6380 root 4536 0.0 0.1 145308 2648 ? Ssl 00:22 0:00 redis-server 192.168.112.138:7001 [cluster] root 4545 0.1 0.1 145308 2652 ? Ssl 00:22 0:00 redis-server 192.168.112.138:7003 [cluster] root 4553 0.0 0.1 145308 2648 ? Ssl 00:23 0:00 redis-server 192.168.112.138:7005 [cluster] root 4565 0.0 0.0 112720 984 pts/0 R+ 00:23 0:00 grep --color=auto redis
在ying01機器上安裝ruby2.2(只須要在ying01上安裝)
[root@ying01 ~]# yum -y groupinstall "Development Tools" [root@ying01 ~]# yum -y install gdbm-devel libdb4-devel libffi-devel libyaml libyaml-devel ncurses-devel openssl-devel readline-devel tcl-deve
建立rpmbuild目錄及其子目錄
[root@ying01 ~]# mkdir -p rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS} [root@ying01 ~]# ls rpmbuild/ BUILD BUILDROOT RPMS SOURCES SPECS SRPMS
下載ruby的源碼包,存放在rpmbuild/SOURCES目錄下
[root@ying01 ~]# wget http://cache.ruby-lang.org/pub/ruby/2.2/ruby-2.2.3.tar.gz -P rpmbuild/SOURCES
下載ruby的spec的文件,目的rpmbuild把其生成rpm文件
[root@ying01 ~]# wget https://raw.githubusercontent.com/tjinjin/automate-ruby-rpm/master/ruby22x.spec -P rpmbuild/SPECS [root@ying01 ~]# rpmbuild -bb rpmbuild/SPECS/ruby22x.spec
安裝 ruby-2.2.3-1.el7.centos.x86_64.rpm ,並查看其版本號
[root@ying01 ~]# ls rpmbuild/RPMS/x86_64/ruby-2.2.3-1.el7.centos.x86_64.rpm rpmbuild/RPMS/x86_64/ruby-2.2.3-1.el7.centos.x86_64.rpm [root@ying01 ~]# du -sh !$ du -sh rpmbuild/RPMS/x86_64/ruby-2.2.3-1.el7.centos.x86_64.rpm 10M rpmbuild/RPMS/x86_64/ruby-2.2.3-1.el7.centos.x86_64.rpm [root@ying01 ~]# rpm -ivh rpmbuild/RPMS/x86_64/ruby-2.2.3-1.el7.centos.x86_64.rpm 準備中... ################################# [100%] 正在升級/安裝... 1:ruby-2.2.3-1.el7.centos ################################# [100%] [root@ying01 ~]# ruby -v //查看版本號 ruby 2.2.3p173 (2015-08-18 revision 51636) [x86_64-linux]
用gem安與redis中與ruby相關的文件 redis-trib.rb
[root@ying01 ~]# gem install redis Fetching: redis-4.0.2.gem (100%) Successfully installed redis-4.0.2 Parsing documentation for redis-4.0.2 Installing ri documentation for redis-4.0.2 Done installing documentation for redis after 1 seconds 1 gem installed
如今把redis-trib.rb 複製到/usr/bin/下,能夠直接使用這個命令
[root@ying01 ~]# cp /usr/local/src/redis-4.0.9/src/redis-trib.rb /usr/bin/
用redis-trib.rb 命令分配主、從端口
[root@ying01 ~]# redis-trib.rb create --replicas 1 192.168.112.136:7000 192.168.112.136:7002 192.168.112.136:7004 192.168.112.138:7001 192.168.112.138:7003 192.168.112.138:7005 >>> Creating cluster >>> Performing hash slots allocation on 6 nodes... Using 3 masters: 192.168.112.136:7000 192.168.112.138:7001 192.168.112.136:7002 Adding replica 192.168.112.138:7005 to 192.168.112.136:7000 Adding replica 192.168.112.136:7004 to 192.168.112.138:7001 Adding replica 192.168.112.138:7003 to 192.168.112.136:7002 M: 25cff1f2c0d7e296b8af969ac8c1de535e8ddf6c 192.168.112.136:7000 slots:0-5460 (5461 slots) master M: f2690645620ad4c4042536108e576158dec751b3 192.168.112.136:7002 slots:10923-16383 (5461 slots) master S: 022afc487ced1c543ee85c4f9ba591b377d5e9e1 192.168.112.136:7004 replicates 0ff8984070960a56f204d992d176ca7275e06c1d M: 0ff8984070960a56f204d992d176ca7275e06c1d 192.168.112.138:7001 slots:5461-10922 (5462 slots) master S: 578367da301f9d795854ce2ee3daf56d5971e7de 192.168.112.138:7003 replicates f2690645620ad4c4042536108e576158dec751b3 S: 0e107e02f89ef282470174bfa6bcf6cdfebc8271 192.168.112.138:7005 replicates 25cff1f2c0d7e296b8af969ac8c1de535e8ddf6c Can I set the above configuration? (type 'yes' to accept): yes //滿意就 yes >>> Nodes configuration updated >>> Assign a different config epoch to each node >>> Sending CLUSTER MEET messages to join the cluster Waiting for the cluster to join.... >>> Performing Cluster Check (using node 192.168.112.136:7000) M: 25cff1f2c0d7e296b8af969ac8c1de535e8ddf6c 192.168.112.136:7000 slots:0-5460 (5461 slots) master 1 additional replica(s) S: 578367da301f9d795854ce2ee3daf56d5971e7de 192.168.112.138:7003 slots: (0 slots) slave replicates f2690645620ad4c4042536108e576158dec751b3 M: 0ff8984070960a56f204d992d176ca7275e06c1d 192.168.112.138:7001 slots:5461-10922 (5462 slots) master 1 additional replica(s) S: 0e107e02f89ef282470174bfa6bcf6cdfebc8271 192.168.112.138:7005 slots: (0 slots) slave replicates 25cff1f2c0d7e296b8af969ac8c1de535e8ddf6c S: 022afc487ced1c543ee85c4f9ba591b377d5e9e1 192.168.112.136:7004 slots: (0 slots) slave replicates 0ff8984070960a56f204d992d176ca7275e06c1d M: f2690645620ad4c4042536108e576158dec751b3 192.168.112.136:7002 slots:10923-16383 (5461 slots) master 1 additional replica(s) [OK] All nodes agree about slots configuration. //成功的標誌 >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered. //成功的標誌 [root@ying01 ~]# echo $? 0
開始以集羣的方式登陸,建立不一樣的值,觀察存在哪一個服務器(端口)
[root@ying01 ~]# redis-cli -c -h 192.168.112.136 -p 7000 //-c 表示以集羣的方式登陸,不然就是單機登陸 192.168.112.136:7000> set key1 aaa -> Redirected to slot [9189] located at 192.168.112.138:7001 OK 192.168.112.138:7001> set key2 bbb -> Redirected to slot [4998] located at 192.168.112.136:7000 OK 192.168.112.136:7000> set key3 ccc OK 192.168.112.136:7000> set key4 ddd -> Redirected to slot [13120] located at 192.168.112.136:7002 OK 192.168.112.136:7002> set key5 eee -> Redirected to slot [9057] located at 192.168.112.138:7001 OK 192.168.112.138:7001> get key3 -> Redirected to slot [935] located at 192.168.112.136:7000 "ccc" 192.168.112.136:7000> get key4 -> Redirected to slot [13120] located at 192.168.112.136:7002 "ddd" 192.168.112.136:7002>
檢測集羣狀態 redis-trib.rb IP:port
[root@ying01 ~]# redis-trib.rb check 192.168.112.136:7000 //能夠跟任何端口 >>> Performing Cluster Check (using node 192.168.112.136:7000) M: 25cff1f2c0d7e296b8af969ac8c1de535e8ddf6c 192.168.112.136:7000 slots:0-5460 (5461 slots) master 1 additional replica(s) S: 578367da301f9d795854ce2ee3daf56d5971e7de 192.168.112.138:7003 slots: (0 slots) slave replicates f2690645620ad4c4042536108e576158dec751b3 M: 0ff8984070960a56f204d992d176ca7275e06c1d 192.168.112.138:7001 slots:5461-10922 (5462 slots) master 1 additional replica(s) S: 0e107e02f89ef282470174bfa6bcf6cdfebc8271 192.168.112.138:7005 slots: (0 slots) slave replicates 25cff1f2c0d7e296b8af969ac8c1de535e8ddf6c S: 022afc487ced1c543ee85c4f9ba591b377d5e9e1 192.168.112.136:7004 slots: (0 slots) slave replicates 0ff8984070960a56f204d992d176ca7275e06c1d M: f2690645620ad4c4042536108e576158dec751b3 192.168.112.136:7002 slots:10923-16383 (5461 slots) master 1 additional replica(s) [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered.
以集羣的方式登陸到redis下,一些重用操做:
192.168.112.136:7000> CLUSTER NODES 578367da301f9d795854ce2ee3daf56d5971e7de 192.168.112.138:7003@17003 slave f2690645620ad4c4042536108e576158dec751b3 0 1535304518521 5 connected 0ff8984070960a56f204d992d176ca7275e06c1d 192.168.112.138:7001@17001 master - 0 1535304516000 4 connected 5461-10922 25cff1f2c0d7e296b8af969ac8c1de535e8ddf6c 192.168.112.136:7000@17000 myself,master - 0 1535304516000 1 connected 0-5460 0e107e02f89ef282470174bfa6bcf6cdfebc8271 192.168.112.138:7005@17005 slave 25cff1f2c0d7e296b8af969ac8c1de535e8ddf6c 0 1535304518000 6 connected 022afc487ced1c543ee85c4f9ba591b377d5e9e1 192.168.112.136:7004@17004 slave 0ff8984070960a56f204d992d176ca7275e06c1d 0 1535304517513 4 connected f2690645620ad4c4042536108e576158dec751b3 192.168.112.136:7002@17002 master - 0 1535304519527 2 connected 10923-16383
192.168.112.136:7000> CLUSTER INFO cluster_state:ok cluster_slots_assigned:16384 cluster_slots_ok:16384 cluster_slots_pfail:0 cluster_slots_fail:0 cluster_known_nodes:6 cluster_size:3 cluster_current_epoch:6 cluster_my_epoch:1 cluster_stats_messages_ping_sent:1135 cluster_stats_messages_pong_sent:1094 cluster_stats_messages_sent:2229 cluster_stats_messages_ping_received:1089 cluster_stats_messages_pong_received:1135 cluster_stats_messages_meet_received:5 cluster_stats_messages_received:2229
在ying02機器上,新建一個7007的配置文件
[root@ying02 etc]# vim redis_7007.conf port 7007 bind 192.168.133.132 daemonize yes pidfile /var/run/redis_7007.pid dir /data/redis_data/7007 cluster-enabled yes cluster-config-file nodes_7007.conf cluster-node-timeout 10100 appendonly yes
建立目錄,並啓動
[root@ying02 etc]# mkdir /data/redis_data/7007 [root@ying02 etc]# redis-server /etc/redis_7007.conf 6060:C 27 Aug 01:37:20.129 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo 6060:C 27 Aug 01:37:20.129 # Redis version=4.0.9, bits=64, commit=00000000, modified=0, pid=6060, just started 6060:C 27 Aug 01:37:20.129 # Configuration loaded [root@ying02 etc]# ps aux |grep redis root 2974 0.1 0.1 147352 2516 ? Ssl 8月26 0:09 redis-server 127.0.0.1:6380 root 4536 0.0 0.1 147356 3184 ? Ssl 00:22 0:04 redis-server 192.168.112.138:7001 [cluster] root 4545 0.0 0.1 147356 3068 ? Ssl 00:22 0:04 redis-server 192.168.112.138:7003 [cluster] root 4553 0.0 0.1 147356 3064 ? Ssl 00:23 0:04 redis-server 192.168.112.138:7005 [cluster] root 6061 0.2 0.1 145308 2648 ? Ssl 01:37 0:00 redis-server 192.168.112.138:7007 [cluster] root 6071 0.0 0.0 112720 984 pts/0 S+ 01:37 0:00 grep --color=auto redis
再回到ying01上,添加這個節點
192.168.112.136:7000> CLUSTER MEET 192.168.112.138 7007 OK 192.168.112.136:7000> CLUSTER NODES //發現7007爲master 7bacdb18381ac0101abad973180a890cd2da2d39 192.168.112.138:7007@17007 master - 0 1535305180270 0 connected 578367da301f9d795854ce2ee3daf56d5971e7de 192.168.112.138:7003@17003 slave f2690645620ad4c4042536108e576158dec751b3 0 1535305182000 5 connected 0ff8984070960a56f204d992d176ca7275e06c1d 192.168.112.138:7001@17001 master - 0 1535305179263 4 connected 5461-10922 25cff1f2c0d7e296b8af969ac8c1de535e8ddf6c 192.168.112.136:7000@17000 myself,master - 0 1535305179000 1 connected 0-5460 0e107e02f89ef282470174bfa6bcf6cdfebc8271 192.168.112.138:7005@17005 slave 25cff1f2c0d7e296b8af969ac8c1de535e8ddf6c 0 1535305183291 6 connected 022afc487ced1c543ee85c4f9ba591b377d5e9e1 192.168.112.136:7004@17004 slave 0ff8984070960a56f204d992d176ca7275e06c1d 0 1535305182285 4 connected f2690645620ad4c4042536108e576158dec751b3 192.168.112.136:7002@17002 master - 0 1535305182000 2 connected 10923-16383 192.168.112.136:7000>
在ying01上新建7006配置文件
[root@ying01 etc]# vim redis_7006.conf port 7006 bind 192.168.112.136 daemonize yes pidfile /var/run/redis_7006.pid dir /data/redis_data/7006 cluster-enabled yes cluster-config-file nodes_7006.conf cluster-node-timeout 10100 appendonly yes
建立相應的數據目錄,並開啓7006的redis服務
[root@ying01 etc]# mkdir /data/redis_data/7006 [root@ying01 etc]# redis-server /etc/redis_7006.conf 29220:C 27 Aug 01:52:30.488 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo 29220:C 27 Aug 01:52:30.488 # Redis version=4.0.9, bits=64, commit=00000000, modified=0, pid=29220, just started 29220:C 27 Aug 01:52:30.488 # Configuration loaded
再次登陸到集羣下,增長7006的節點,此時7006也爲master
[root@ying01 etc]# redis-cli -c -h 192.168.112.136 -p 7000 192.168.112.136:7000> CLUSTER MEET 192.168.112.136 7006 OK 192.168.112.136:7000> CLUSTER NODES 7bacdb18381ac0101abad973180a890cd2da2d39 192.168.112.138:7007@17007 master - 0 1535306149035 0 connected 578367da301f9d795854ce2ee3daf56d5971e7de 192.168.112.138:7003@17003 slave f2690645620ad4c4042536108e576158dec751b3 0 1535306148026 5 connected 0ff8984070960a56f204d992d176ca7275e06c1d 192.168.112.138:7001@17001 master - 0 1535306147000 4 connected 5461-10922 25cff1f2c0d7e296b8af969ac8c1de535e8ddf6c 192.168.112.136:7000@17000 myself,master - 0 1535306142000 1 connected 0-5460 0e107e02f89ef282470174bfa6bcf6cdfebc8271 192.168.112.138:7005@17005 slave 25cff1f2c0d7e296b8af969ac8c1de535e8ddf6c 0 1535306147000 6 connected 022afc487ced1c543ee85c4f9ba591b377d5e9e1 192.168.112.136:7004@17004 slave 0ff8984070960a56f204d992d176ca7275e06c1d 0 1535306146000 4 connected 288a9bcba1d561ae4bdb016794b46b098c52ebb5 192.168.112.136:7006@17006 master - 0 1535306147000 0 connected f2690645620ad4c4042536108e576158dec751b3 192.168.112.136:7002@17002 master - 0 1535306147018 2 connected 10923-16383 192.168.112.136:7000>
[root@ying01 etc]# redis-cli -c -h 192.168.112.136 -p 7006 //以7006端口登陸到集羣 192.168.112.136:7006> CLUSTER REPLICATE 7bacdb18381ac0101abad973180a890cd2da2d39 //把7006設置7007的從,此id是7007的 OK 192.168.112.136:7006> CLUSTER NODES 25cff1f2c0d7e296b8af969ac8c1de535e8ddf6c 192.168.112.136:7000@17000 master - 0 1535306375000 1 connected 0-5460 0e107e02f89ef282470174bfa6bcf6cdfebc8271 192.168.112.138:7005@17005 slave 25cff1f2c0d7e296b8af969ac8c1de535e8ddf6c 0 1535306374000 1 connected 578367da301f9d795854ce2ee3daf56d5971e7de 192.168.112.138:7003@17003 slave f2690645620ad4c4042536108e576158dec751b3 0 1535306376198 2 connected f2690645620ad4c4042536108e576158dec751b3 192.168.112.136:7002@17002 master - 0 1535306377505 2 connected 10923-16383 288a9bcba1d561ae4bdb016794b46b098c52ebb5 192.168.112.136:7006@17006 myself,slave 7bacdb18381ac0101abad973180a890cd2da2d39 0 1535306372000 7 connected 0ff8984070960a56f204d992d176ca7275e06c1d 192.168.112.138:7001@17001 master - 0 1535306376500 4 connected 5461-10922 7bacdb18381ac0101abad973180a890cd2da2d39 192.168.112.138:7007@17007 master - 0 1535306374484 0 connected 022afc487ced1c543ee85c4f9ba591b377d5e9e1 192.168.112.136:7004@17004 slave 0ff8984070960a56f204d992d176ca7275e06c1d 0 1535306375492 4 connected 192.168.112.136:7006>
不能移走master,也不能移走當前節點的
192.168.112.136:7006> CLUSTER FORGET 288a9bcba1d561ae4bdb016794b46b098c52ebb5 //不可以在7006下移走7006 (error) ERR I tried hard but I can't forget myself... 192.168.112.136:7006> [root@ying01 etc]# redis-cli -c -h 192.168.112.136 -p 7000 //換一個節點登陸集羣 192.168.112.136:7000> CLUSTER FORGET 288a9bcba1d561ae4bdb016794b46b098c52ebb5 OK 192.168.112.136:7000> CLUSTER NODES //此時就能移動7006 7bacdb18381ac0101abad973180a890cd2da2d39 192.168.112.138:7007@17007 master - 0 1535306852959 0 connected 578367da301f9d795854ce2ee3daf56d5971e7de 192.168.112.138:7003@17003 slave f2690645620ad4c4042536108e576158dec751b3 0 1535306851954 5 connected 0ff8984070960a56f204d992d176ca7275e06c1d 192.168.112.138:7001@17001 master - 0 1535306851000 4 connected 5461-10922 25cff1f2c0d7e296b8af969ac8c1de535e8ddf6c 192.168.112.136:7000@17000 myself,master - 0 1535306847000 1 connected 0-5460 0e107e02f89ef282470174bfa6bcf6cdfebc8271 192.168.112.138:7005@17005 slave 25cff1f2c0d7e296b8af969ac8c1de535e8ddf6c 0 1535306850000 6 connected 022afc487ced1c543ee85c4f9ba591b377d5e9e1 192.168.112.136:7004@17004 slave 0ff8984070960a56f204d992d176ca7275e06c1d 0 1535306850000 4 connected f2690645620ad4c4042536108e576158dec751b3 192.168.112.136:7002@17002 master - 0 1535306850947 2 connected 10923-16383 192.168.112.136:7000>
192.168.112.136:7000> CLUSTER SAVECONFIG OK 192.168.112.136:7000>
在ying02機器上,在端口下的nodes_700x的文件下,都保存了以前的設置
[root@ying02 etc]# vim /data/redis_data/7003/nodes_7003.conf 022afc487ced1c543ee85c4f9ba591b377d5e9e1 192.168.112.136:7004@17004 slave 0ff8984070960a56f204d992d176ca7275e06c1d 0 1535306360718 4 connected 7bacdb18381ac0101abad973180a890cd2da2d39 192.168.112.138:7007@17007 master - 0 1535306359000 0 connected 0e107e02f89ef282470174bfa6bcf6cdfebc8271 192.168.112.138:7005@17005 slave 25cff1f2c0d7e296b8af969ac8c1de535e8ddf6c 0 1535306359710 6 connected 578367da301f9d795854ce2ee3daf56d5971e7de 192.168.112.138:7003@17003 myself,slave f2690645620ad4c4042536108e576158dec751b3 0 1535306358000 5 connected 288a9bcba1d561ae4bdb016794b46b098c52ebb5 192.168.112.136:7006@17006 slave 7bacdb18381ac0101abad973180a890cd2da2d39 0 1535306361121 7 connected f2690645620ad4c4042536108e576158dec751b3 192.168.112.136:7002@17002 master - 0 1535306361120 2 connected 10923-16383 25cff1f2c0d7e296b8af969ac8c1de535e8ddf6c 192.168.112.136:7000@17000 master - 0 1535306358100 1 connected 0-5460 0ff8984070960a56f204d992d176ca7275e06c1d 192.168.112.138:7001@17001 master - 0 1535306360000 4 connected 5461-10922 vars currentEpoch 7 lastVoteEpoch 0