redis-cluster架構圖
(1)所有的redis節點彼此互聯(PING-PONG機制),內部使用二進制協議優化傳輸速度和帶寬.
(2)節點的fail是通過集群中超過半數的節點檢測失效時才生效.
(3)客戶端與redis節點直連,不需要中間proxy層.客戶端不需要連接集群所有節點,連接集群中任何一個可用節點即可
(4)redis-cluster把所有的物理節點映射到[0-16383]slot上,cluster 負責維護node<->slot<->value
Redis 集群中內置了 16384 個哈希槽,當需要在 Redis 集群中放置一個 key-value 時,redis 先對 key 使用 crc16 算法算出一個結果,然后把結果對 16384 求余數,這樣每個 key 都會對應一個編號在 0-16383 之間的哈希槽,redis 會根據節點數量大致均等的將哈希槽映射到不同的節點
示例如下
redis-cluster投票容錯
redis如何查看主從狀態信息master和salve
首先你需要連接上redis
[root@localhost src]# ./redis-cli -p 6384 --第一步從客戶端命令工具連接redis
127.0.0.1:6384> auth 123456 --輸入登錄密碼,登錄
[root@localhost src]# info replication --使用命令 info replication查看狀態信息
示例圖片
(1)集群中所有master參與投票,如果半數以上master節點與其中一個master節點通信超過(cluster-node-timeout),認為該master節點掛掉.
(2):什么時候整個集群不可用(cluster_state:fail)?
如果集群任意master掛掉,且當前master沒有slave,則集群進入fail狀態。也可以理解成集群的[0-16383]slot映射不完全時進入fail狀態。
如果集群超過半數以上master掛掉,無論是否有slave,集群進入fail狀態。
搭建Ruby環境
redis集群需要使用技巧管理工具redis-trib.rb,它依賴ruby環境,首先需要安裝ruby環境。
第一步:安裝ruby
[root@ERAYT-01 erayt]# yum install ruby
[root@ERAYT-01 erayt]# yum install rubygems
第二步:上傳redis-3.0.0.gem到Linux系統
第三步:安裝ruby和redis的接口程序redis-3.0.0.gem
[root@ERAYT-01 erayt]# gem install redis-3.0.0.gem
第四步:redis-3.0.0/src目錄,將redis-trib.rb文件復制到/usr/local/redis-cluster目錄下
[root@ERAYT-01 src]# cp redis-trib.rb /usr/local/redis-cluster/
Redis集群搭建
Redis集群最少需要三台主服務器,三台從服務器。
端口號分別為:7001~7006
第一步:創建7001實例,並編輯redis.conf文件,修改port為7001。
注意:創建實例,即拷貝單機版安裝時,生成的bin目錄,為7001目錄。
[erayt@ERAYT-01 redis]$ cd /usr/local/
[erayt@ERAYT-01 local]$ ls
bin etc games include lib libexec redis redis-cluster sbin share src
[erayt@ERAYT-01 local]$ cp redis/bin/ redis-cluster/7001 -r
進入7001目錄,修改端口,打開Cluster-enable yes
# Accept connections on the specified port, default is 6379.
# If port 0 is specified Redis will not listen on a TCP socket.
port 7001
cluster-enabled yes
第三步:復制7001,創建7002~7006實例,注意端口修改。
[pcts@ERAYT-01 redis-cluster]$ ls
7001 redis-trib.rb
[erayt@ERAYT-01 redis-cluster]$ cp 7001/ 7002 -r
[erayt@ERAYT-01 redis-cluster]$ cp 7001/ 7003 -r
[erayt@ERAYT-01 redis-cluster]$ cp 7001/ 7004 -r
[erayt@ERAYT-01 redis-cluster]$ cp 7001/ 7005 -r
[erayt@ERAYT-01 redis-cluster]$ cp 7001/ 7006 -r
第四步:啟動所有的實例
[erayt@ERAYT-01 7001]$ ./redis-server redis.conf
[erayt@ERAYT-01 7001]$ cd ../7002
[erayt@ERAYT-01 7002]$ ./redis-server redis.conf
[erayt@ERAYT-01 7002]$ cd ../7003
[erayt@ERAYT-01 7003]$ ./redis-server redis.conf
[erayt@ERAYT-01 7003]$ cd ../7004
[erayt@ERAYT-01 7004]$ ./redis-server redis.conf
[erayt@ERAYT-01 7004]$ cd ../7005
[erayt@ERAYT-01 7005]$ ./redis-server redis.conf
[erayt@ERAYT-01 7005]$ cd ../7006
[erayt@ERAYT-01 7006]$ ./redis-server redis.conf
啟動后,查看redis
[erayt@ERAYT-01 7006]$ ps aux | grep redis
erayt 3265 0.1 0.1 35548 1884 ? Ssl 02:38 0:00 ./redis-server *:7001 [cluster]
erayt 3269 0.1 0.1 35548 1884 ? Ssl 02:38 0:00 ./redis-server *:7002 [cluster]
erayt 3273 0.1 0.1 35548 1884 ? Ssl 02:38 0:00 ./redis-server *:7003 [cluster]
erayt 3277 0.1 0.1 35548 1884 ? Ssl 02:38 0:00 ./redis-server *:7004 [cluster]
erayt 3281 0.1 0.1 35548 1884 ? Ssl 02:38 0:00 ./redis-server *:7005 [cluster]
erayt 3285 0.1 0.1 35548 1888 ? Ssl 02:38 0:00 ./redis-server *:7006 [cluster]
erayt 3320 0.0 0.0 6052 788 pts/1 S+ 02:44 0:00 grep redis
第五步:創建集群
[erayt@ERAYT-01 redis-cluster]$ ls
7001 7002 7003 7004 7005 7006 redis-trib.rb
[erayt@ERAYT-01 redis-cluster]$ ./redis-trib.rb create --replicas 1 192.168.232.128:7001 192.168.232.128:7002 192.168.232.128:7003 192.168.232.128:7004 192.168.232.128:7005 192.168.232.128:7006
replicas 后面的1表示的是每個主機都帶有1個從機
>>> Creating cluster
Connecting to node 192.168.232.128:7001: OK
Connecting to node 192.168.232.128:7002: OK
Connecting to node 192.168.232.128:7003: OK
Connecting to node 192.168.232.128:7004: OK
Connecting to node 192.168.232.128:7005: OK
Connecting to node 192.168.232.128:7006: OK
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
192.168.232.128:7001
192.168.232.128:7002
192.168.232.128:7003
Adding replica 192.168.232.128:7004 to 192.168.232.128:7001
Adding replica 192.168.232.128:7005 to 192.168.232.128:7002
Adding replica 192.168.232.128:7006 to 192.168.232.128:7003
M: 1455dfd4f6ba95c94fb9b78219afe477eb449897 192.168.232.128:7001
slots:0-5460 (5461 slots) master
M: 78912c846586d65c43a243eb1780426bf2e363f2 192.168.232.128:7002
slots:5461-10922 (5462 slots) master
M: b9f0452e588df5eeec3ce9bc461f8327727b99c8 192.168.232.128:7003
slots:10923-16383 (5461 slots) master
S: a88a707d4c8a2db36365c78d69b8450c1b5f201b 192.168.232.128:7004
replicates 1455dfd4f6ba95c94fb9b78219afe477eb449897
S: 1e88baa5c85261c7803f6b7e8dec086612bd3d23 192.168.232.128:7005
replicates 78912c846586d65c43a243eb1780426bf2e363f2
S: 8a130089dc3158b55a110b8957fac85d5d0917cb 192.168.232.128:7006
replicates b9f0452e588df5eeec3ce9bc461f8327727b99c8
日志可以看到7001 7002 7003是主節點 7004 7005 7006是從節點,還可以看到redis 根據節點數量大致均等的將哈希槽映射到不同的節點。
Redis集群連接
命令:./redis-cli –h 127.0.0.1 –p 7001 –c
注意:-c 連接redis集群
cluster info 查看集群狀態
[erayt@ERAYT-01 7001]$ ./redis-cli -p 7001 -c
127.0.0.1:7001> 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_sent:267
cluster_stats_messages_received:267
127.0.0.1:7001>
查看集群中的節點
127.0.0.1:7001> cluster nodes
8a130089dc3158b55a110b8957fac85d5d0917cb 192.168.232.128:7006 slave b9f0452e588df5eeec3ce9bc461f8327727b99c8 0 1563823021952 6 connected
1e88baa5c85261c7803f6b7e8dec086612bd3d23 192.168.232.128:7005 slave 78912c846586d65c43a243eb1780426bf2e363f2 0 1563823027004 5 connected
1455dfd4f6ba95c94fb9b78219afe477eb449897 192.168.232.128:7001 myself,master - 0 0 1 connected 0-5460
a88a707d4c8a2db36365c78d69b8450c1b5f201b 192.168.232.128:7004 slave 1455dfd4f6ba95c94fb9b78219afe477eb449897 0 1563823023969 4 connected
78912c846586d65c43a243eb1780426bf2e363f2 192.168.232.128:7002 master - 0 1563823025989 2 connected 5461-10922
b9f0452e588df5eeec3ce9bc461f8327727b99c8 192.168.232.128:7003 master - 0 1563823024979 3 connected 10923-16383
127.0.0.1:7001>
添加主節點
集群創建成功后可以向集群中添加節點,下面是添加一個master主節點
添加7007結點作為新節點
1.先依照上面的復制一個redis實例,修改端口為7007,啟動該服務
[erayt@ERAYT-01 7007]$ ./redis-server redis.conf
2.添加7007結點作為新節點
執行命令:./redis-trib.rb add-node 127.0.0.1:7007 127.0.0.1:7001
[erayt@ERAYT-01 redis-cluster]$ ./redis-trib.rb add-node 192.168.232.128:7007 192.168.232.128:7001
3.查看集群結點發現7007已添加到集群中
127.0.0.1:7001> cluster nodes
d1c9dbe277c82b36831b01fe29a0cac1f45f0dd3 192.168.232.128:7007 master - 0 1563824280943 0 connected
8a130089dc3158b55a110b8957fac85d5d0917cb 192.168.232.128:7006 slave b9f0452e588df5eeec3ce9bc461f8327727b99c8 0 1563824284990 6 connected
1e88baa5c85261c7803f6b7e8dec086612bd3d23 192.168.232.128:7005 slave 78912c846586d65c43a243eb1780426bf2e363f2 0 1563824280340 5 connected
1455dfd4f6ba95c94fb9b78219afe477eb449897 192.168.232.128:7001 myself,master - 0 0 1 connected 0-5460
a88a707d4c8a2db36365c78d69b8450c1b5f201b 192.168.232.128:7004 slave 1455dfd4f6ba95c94fb9b78219afe477eb449897 0 1563824283975 4 connected
78912c846586d65c43a243eb1780426bf2e363f2 192.168.232.128:7002 master - 0 1563824279930 2 connected 5461-10922
b9f0452e588df5eeec3ce9bc461f8327727b99c8 192.168.232.128:7003 master - 0 1563824282964 3 connected 10923-16383
127.0.0.1:7001>
hash槽重新分配
添加完主節點需要對主節點進行hash槽分配,這樣該主節才可以存儲數據。
1.查看集群中槽占用情況
127.0.0.1:7001> cluster nodes
d1c9dbe277c82b36831b01fe29a0cac1f45f0dd3 192.168.232.128:7007 master - 0 1563824280943 0 connected
8a130089dc3158b55a110b8957fac85d5d0917cb 192.168.232.128:7006 slave b9f0452e588df5eeec3ce9bc461f8327727b99c8 0 1563824284990 6 connected
1e88baa5c85261c7803f6b7e8dec086612bd3d23 192.168.232.128:7005 slave 78912c846586d65c43a243eb1780426bf2e363f2 0 1563824280340 5 connected
1455dfd4f6ba95c94fb9b78219afe477eb449897 192.168.232.128:7001 myself,master - 0 0 1 connected 0-5460
a88a707d4c8a2db36365c78d69b8450c1b5f201b 192.168.232.128:7004 slave 1455dfd4f6ba95c94fb9b78219afe477eb449897 0 1563824283975 4 connected
78912c846586d65c43a243eb1780426bf2e363f2 192.168.232.128:7002 master - 0 1563824279930 2 connected 5461-10922
b9f0452e588df5eeec3ce9bc461f8327727b99c8 192.168.232.128:7003 master - 0 1563824282964 3 connected 10923-16383
127.0.0.1:7001>
redis集群有16384個槽,集群中的每個結點分配自已槽,通過查看集群結點可以看到槽占用情況。
可以看到7001分配的0-5460、7002分配的 5461-10922、7003分配的10923-16383
2.連接上集群(連接集群中任意一個可用結點都行)
[erayt@ERAYT-01 redis-cluster]$ ./redis-trib.rb reshard 192.168.232.128:7001
2.1 輸入要分配的槽數量
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
How many slots do you want to move (from 1 to 16384)?
2.2 輸入:1000,表示要分配1000個槽 點擊回車 根據具體情況定
How many slots do you want to move (from 1 to 16384)? 1000
What is the receiving node ID?
2.3 輸入接收槽的結點id 輸入7007對應的編號(cluster nodes命令查看)
What is the receiving node ID? d1c9dbe277c82b36831b01fe29a0cac1f45f0dd3
Please enter all the source node IDs.
Type 'all' to use all the nodes as source nodes for the hash slots.
Type 'done' once you entered all the source nodes IDs.
Source node #1:
2.4 輸入源結點id,表示槽從哪里分配來
Please enter all the source node IDs.
Type 'all' to use all the nodes as source nodes for the hash slots.
Type 'done' once you entered all the source nodes IDs.
Source node #1:
槽的總量是一定的,之前都已經全部分配給了7001/7002/7003,現在要重新從分好的的節點拿出來一些分給7007節點。
可以輸入多個節點的編號,每次輸完一個點擊回車,輸完所以的輸入done表示輸入完成。表示7007的槽來源這幾個節點
可以輸入all,表示所有具有槽的節點都需要去分配一些給7007,我這里輸入的是all
2.5 輸入yes開始移動槽到目標結點id
Do you want to proceed with the proposed reshard plan (yes/no)? yes
2.6 查看7007節點槽的分配
d1c9dbe277c82b36831b01fe29a0cac1f45f0dd3 192.168.232.128:7007 master - 0 1563826629735 7 connected 0-332 5461-5794 10923-11255
添加從節點
集群創建成功后也可以向集群中添加從節點。
添加7008從結點,將7008作為7007的從結點
命令:./redis-trib.rb add-node --slave --master-id 主節點id 新節點的ip和端口 舊節點ip和端口
[erayt@ERAYT-01 redis-cluster]$ ./redis-trib.rb add-node --slave --master-id d1c9dbe277c82b36831b01fe29a0cac1f45f0dd3 192.168.232.128:7008 192.168.101.3:7007
d1c9dbe277c82b36831b01fe29a0cac1f45f0dd3 是剛剛7007的id
刪除節點
[erayt@ERAYT-01 redis-cluster]$ ./redis-trib.rb del-node 192.168.232.128:7007 d1c9dbe277c82b36831b01fe29a0cac1f45f0dd3
刪除已經占有hash槽的結點會失敗,報錯如下:
[ERR] Node 192.168.232.128:7007 is not empty! Reshard data away and try again.
需要將該結點占用的hash槽分配出去
https://blog.csdn.net/weixin_39963744/article/details/111616889
https://blog.csdn.net/u010533511/article/details/89390387參考