Redis Cluster集群增加和刪除節(jié)點方式
1. 添加節(jié)點
目前集群由三臺服務器 11、12、13,共六個 redis 實例構成,每臺服務器上兩個 redis 實例(6379 和 6380)。 現(xiàn)在需要新增一臺服務器 10,再安裝兩個 redis 實例,一主一備。
默認新服務器上兩個 redis 都配置完畢了,不明白的可以參考:Redis Cluster 集群搭建。
1.1. 啟動新節(jié)點
登錄新服務器10,分別啟動 6379 和 6380 兩個 redis 服務:
[test@node-10 6379]$ /usr/local/redis/bin/redis-server redis.conf
[test@node-10 6380]$ /usr/local/redis/bin/redis-server redis.conf
查看 redis 進程:
[test@node-10 6379]$ ps -ef|grep redis test 137409 1 0 15:18 ? 00:00:00 /usr/local/redis/bin/redis-server 0.0.0.0:6380 [cluster] test 137510 1 0 15:19 ? 00:00:00 /usr/local/redis/bin/redis-server 0.0.0.0:6379 [cluster] test 137524 130159 0 15:19 pts/0 00:00:00 grep --color=auto redis
登錄 6379 服務,查看集群節(jié)點信息,可以發(fā)現(xiàn)該集群只有 6379 一個 master。6380 也是一樣的。
[test@node-10 bin]$ redis-cli -p 6379 -c -a test Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. 127.0.0.1:6379> cluster nodes 36efcd23eecc5c4238711c4e680026fea1a71e6d :6379@16379 myself,master - 0 0 0 connected 127.0.0.1:6379>
接下來需要將這兩個節(jié)點加入到集群中。
1.2. 添加主節(jié)點
任意連接一臺集群中的節(jié)點,比如我們連接 11 的 6379,然后使用cluster meet將 10 上的 6379 和 6380 添加到集群中。
[test@node-11 bin]$ redis-cli -p 6379 -c -a test 127.0.0.1:6379> cluster meet 192.168.50.10 6379 OK 127.0.0.1:6379> cluster meet 192.168.50.10 6380 OK 127.0.0.1:6379> cluster nodes #這里信息沒記錄下來,省略了。。。
使用cluster nodes查看集群節(jié)點節(jié)點,可以發(fā)現(xiàn),10 上的 6379 和 6380 已經添加到集群中了,此時這兩個新添加的都是 master 節(jié)點,并且槽位數(shù)都是 0。
分配槽位
接下來我們使用cluster reshard給 10 上的 6379 節(jié)點分配槽位。
[test@node-10 bin]$ redis-cli --cluster reshard 192.168.50.10:6379 -a test
接下來需要輸入的內容:
- 算出來每個 master 的槽數(shù):4096(原本三個 master,加一個變四個 maste,16384/4=4096)。
- 填寫接收槽位的節(jié)點 ID:36efcd23eecc5c4238711c4e680026fea1a71e6d。
- 填寫槽位來源節(jié)點 Source node 為 all,表示從其他所有 master 節(jié)點遷移槽位。

到這里就成功添加了一個 master 節(jié)點(10 上的 6379),并分配了相應的槽位。此時 10 上的 6380 還是一個沒有槽位的 master 節(jié)點。
1.3. 設置從節(jié)點
將 10 上的 6380 設置為 10 上 6379 的從節(jié)點,登錄 6380:
[test@node-10 bin]$ redis-cli -p 6380 -c -a test Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. 127.0.0.1:6380>
接下來使用cluster replicate + 主節(jié)點ID(指定主節(jié)點,10 上的 6379)就能指定當前節(jié)點為目標節(jié)點的從節(jié)點:
127.0.0.1:6380> cluster replicate 36efcd23eecc5c4238711c4e680026fea1a71e6d OK 127.0.0.1:6380> cluster nodes ec6307189da48a8af1c0b168f7500a59f747289e 192.168.50.10:6380@16380 myself,slave 36efcd23eecc5c4238711c4e680026fea1a71e6d 0 1626768925000 8 connected 0d5151b0d0e118e61e66d70e703c84a2d7916840 192.168.50.12:6379@16379 slave 0d8423b0f03adcd631ca40f9d0cda8ec55c7b1bd 0 1626768926000 7 connected f899962300bb50d262d99503940ee1e5c41834d9 192.168.50.12:6380@16380 slave 511307ead0b85f35358d29b67b63d6967a77c7f5 0 1626768925898 1 connected 5252c7984ddd554d95cb909eb76f769d17ad289f 192.168.50.13:6379@16379 master - 0 1626768925000 5 connected 12288-16383 0d8423b0f03adcd631ca40f9d0cda8ec55c7b1bd 192.168.50.13:6380@16380 master - 0 1626768926600 7 connected 6827-10922 36efcd23eecc5c4238711c4e680026fea1a71e6d 192.168.50.10:6379@16379 master - 0 1626768925000 8 connected 0-1364 5461-6826 10923-12287 66a4721bb8da139a9e8881a6681e47aeca3bfea0 192.168.50.11:6380@16380 slave 5252c7984ddd554d95cb909eb76f769d17ad289f 0 1626768926000 5 connected 511307ead0b85f35358d29b67b63d6967a77c7f5 192.168.58.11:6379@16379 master - 0 1626768925000 1 connected 1365-5460 127.0.0.1:6380>
到此就將新服務器 10 上的兩個新增 redis 服務 6379 和 6380 成功添加到了已有的 redis cluster 中了。目前集群共有四臺服務器,共八個 redis 服務,四主四從。
2. 刪除節(jié)點
目前集群由四臺服務器 10、11、12、13,共八個 redis 實例構成,每臺服務器上兩個 redis 實例。 需要刪除一臺服務器 13,也就是要從集群中刪除一主一從兩個 redis 服務。
2.1. 刪除從節(jié)點
現(xiàn)在發(fā)現(xiàn)是 13 機器上兩個 redis 服務都是 master 節(jié)點,然后發(fā)現(xiàn) 11 上兩個都是 slave 節(jié)點,那么我們就要先將 11 的一個 slave 提升為 master,13 的一個 master 降級為 slave。
發(fā)現(xiàn)恰好 11 的一個 slave 服務的 master 就是 13 的一個 redis 服務。這里就比較簡單了,可以直接 kill 掉 13 上的那個 master 服務,這樣 11 上的那個 slave 就會自動提升為 master 了。然后再啟動 13 上的 那個 master ,會發(fā)現(xiàn)它已經變?yōu)?slave 了。
[test@node-13 bin]$ ps -ef|grep redis test 148079 1 4 Jun04 ? 2-03:22:25 ../bin/redis-server 0.0.0.0:6379 [cluster] test 148555 1 3 Jun04 ? 1-10:35:36 ../bin/redis-server 0.0.0.0:6380 [cluster] test 226206 63593 0 16:39 pts/3 00:00:00 grep --color=auto redis [test@node-13 bin]$ kill -9 148555 [test@node-13 bin]$ ps -ef|grep redis test 148079 1 4 Jun04 ? 2-03:22:26 ../bin/redis-server 0.0.0.0:6379 [cluster] test 226335 63593 0 16:42 pts/3 00:00:00 grep --color=auto redis [test@node-13 6380]$ ../bin/redis-server redis.conf [test@node-13 6380]$ ps -ef|grep redis test 148079 1 4 Jun04 ? 2-03:22:29 ../bin/redis-server 0.0.0.0:6379 [cluster] test 226582 1 95 16:47 ? 00:00:35 ../bin/redis-server 0.0.0.0:6380 [cluster] test 226618 63593 0 16:47 pts/3 00:00:00 grep --color=auto redis
查看集群節(jié)點信息:
127.0.0.1:6380> cluster nodes ec6307189da48a8af1c0b168f7500a59f747289e 192.168.50.10:6380@16380 myself,slave 36efcd23eecc5c4238711c4e680026fea1a71e6d 0 1626770883000 8 connected 0d5151b0d0e118e61e66d70e703c84a2d7916840 192.168.50.12:6379@16379 master - 0 1626770882000 9 connected 6827-10922 f899962300bb50d262d99503940ee1e5c41834d9 192.168.50.12:6380@16380 slave 511307ead0b85f35358d29b67b63d6967a77c7f5 0 1626770882504 1 connected 5252c7984ddd554d95cb909eb76f769d17ad289f 192.168.50.13:6379@16379 master - 0 1626770882000 5 connected 12288-16383 0d8423b0f03adcd631ca40f9d0cda8ec55c7b1bd 192.168.50.13:6380@16380 slave 0d5151b0d0e118e61e66d70e703c84a2d7916840 0 1626770881000 9 connected 36efcd23eecc5c4238711c4e680026fea1a71e6d 192.168.50.10:6379@16379 master - 0 1626770882000 8 connected 0-1364 5461-6826 10923-12287 66a4721bb8da139a9e8881a6681e47aeca3bfea0 192.168.50.11:6380@16380 slave 5252c7984ddd554d95cb909eb76f769d17ad289f 0 1626770882002 5 connected 511307ead0b85f35358d29b67b63d6967a77c7f5 192.168.50.11:6379@16379 master - 0 1626770883005 1 connected 1365-5460
現(xiàn)在可以刪除從節(jié)點了(直接刪除從節(jié)點其實也就這一步即可),0d8423b0f03adcd631ca40f9d0cda8ec55c7b1bd為要刪除的從節(jié)點的 ID。
[test@node-10 bin]$ redis-cli --cluster del-node 192.168.50.10:6379 0d8423b0f03adcd631ca40f9d0cda8ec55c7b1bd -a test Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. >>> Removing node 0d8423b0f03adcd631ca40f9d0cda8ec55c7b1bd from cluster 192.168.50.10:6379 >>> Sending CLUSTER FORGET messages to the cluster... >>> Sending CLUSTER RESET SOFT to the deleted node. [test@node-10 bin]$
2.2. 刪除主節(jié)點
13 上的剩余的這個主節(jié)點的從節(jié)點為 11 上的一個 slave?,F(xiàn)在需要將 11 上這個 slave 指定為 11 上 master 的 slave(11 上這個 master 目前還沒有 slave)。
所以我們登錄服務器 11 上的 6380(slave),重新指定其 master:
[test@node-11 bin]$ redis-cli -p 6380 -c -a test Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. 127.0.0.1:6380> cluster nodes ec6307189da48a8af1c0b168f7500a59f747289e 192.168.50.10:6380@16380 slave 36efcd23eecc5c4238711c4e680026fea1a71e6d 0 1626771404000 8 connected 0d5151b0d0e118e61e66d70e703c84a2d7916840 192.168.50.12:6379@16379 master - 0 1626771404530 9 connected 6827-10922 66a4721bb8da139a9e8881a6681e47aeca3bfea0 192.168.50.11:6380@16380 myself,slave 5252c7984ddd554d95cb909eb76f769d17ad289f 0 1626771403000 5 connected 511307ead0b85f35358d29b67b63d6967a77c7f5 192.168.50.11:6379@16379 master - 0 1626771405000 1 connected 1365-5460 36efcd23eecc5c4238711c4e680026fea1a71e6d 192.168.50.10:6379@16379 master - 0 1626771405132 8 connected 0-1364 5461-6826 10923-12287 f899962300bb50d262d99503940ee1e5c41834d9 192.168.50.12:6380@16380 slave 511307ead0b85f35358d29b67b63d6967a77c7f5 0 1626771404000 1 connected 5252c7984ddd554d95cb909eb76f769d17ad289f 192.168.50.13:6379@16379 master - 0 1626771404530 5 connected 12288-16383 127.0.0.1:6380> cluster replicate 0d5151b0d0e118e61e66d70e703c84a2d7916840 OK 127.0.0.1:6380> cluster nodes ec6307189da48a8af1c0b168f7500a59f747289e 192.168.50.10:6380@16380 slave 36efcd23eecc5c4238711c4e680026fea1a71e6d 0 1626771451000 8 connected 0d5151b0d0e118e61e66d70e703c84a2d7916840 192.168.50.12:6379@16379 master - 0 1626771451000 9 connected 6827-10922 66a4721bb8da139a9e8881a6681e47aeca3bfea0 192.168.50.11:6380@16380 myself,slave 0d5151b0d0e118e61e66d70e703c84a2d7916840 0 1626771448000 9 connected 511307ead0b85f35358d29b67b63d6967a77c7f5 192.168.50.11:6379@16379 master - 0 1626771451000 1 connected 1365-5460 36efcd23eecc5c4238711c4e680026fea1a71e6d 192.168.50.10:6379@16379 master - 0 1626771450988 8 connected 0-1364 5461-6826 10923-12287 f899962300bb50d262d99503940ee1e5c41834d9 192.168.50.12:6380@16380 slave 511307ead0b85f35358d29b67b63d6967a77c7f5 0 1626771451489 1 connected 5252c7984ddd554d95cb909eb76f769d17ad289f 192.168.50.13:6379@16379 master - 0 1626771451000 5 connected 12288-16383
接下來我們需要重新分配要刪除的 13 上 master 的槽位 12288-16383。其實就是使用cluster reshard將該 master 上的槽位數(shù)分配給其他的 master,這里我們直接分配到 10 上的一個master 上,操作方法可以參考上面,這里可以看到操作結果:
127.0.0.1:6380> cluster nodes ec6307189da48a8af1c0b168f7500a59f747289e 192.168.50.10:6380@16380 myself,slave 36efcd23eecc5c4238711c4e680026fea1a71e6d 0 1626772034000 10 connected 0d5151b0d0e118e61e66d70e703c84a2d7916840 192.168.50.12:6379@16379 master - 0 1626772035000 9 connected 6827-10922 f899962300bb50d262d99503940ee1e5c41834d9 192.168.50.12:6380@16380 slave 511307ead0b85f35358d29b67b63d6967a77c7f5 0 1626772034867 1 connected 5252c7984ddd554d95cb909eb76f769d17ad289f 192.168.50.13:6379@16379 master - 0 1626772034567 5 connected 36efcd23eecc5c4238711c4e680026fea1a71e6d 192.168.50.10:6379@16379 master - 0 1626772033865 10 connected 0-1364 5461-6826 10923-16383 66a4721bb8da139a9e8881a6681e47aeca3bfea0 192.168.50.11:6380@16380 slave 0d5151b0d0e118e61e66d70e703c84a2d7916840 0 1626772035000 9 connected 511307ead0b85f35358d29b67b63d6967a77c7f5 192.168.50.11:6379@16379 master - 0 1626772034000 1 connected 1365-5460
可以發(fā)現(xiàn) 13 的 master 節(jié)點上已經沒有槽位了,而 10 上的 master 槽位數(shù)增加了。
接下來直接刪除 13 上這個主節(jié)點就可以了:
[test@node-13 bin]$ redis-cli --cluster del-node 127.0.0.1:6379 5252c7984ddd554d95cb909eb76f769d17ad289f -a test Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. >>> Removing node 5252c7984ddd554d95cb909eb76f769d17ad289f from cluster 127.0.0.1:6379 >>> Sending CLUSTER FORGET messages to the cluster... >>> Sending CLUSTER RESET SOFT to the deleted node. [test@node-13 bin]$
3. 最終結果
將 192.168.50.13 上的 6379 和 6380 從集群中移除了,然后新增了 192.168.50.10 上的 6379 和 6380 到集群中。
[test@node-11 bin]$ redis-cli --cluster info 192.168.58.11:6379 -a test Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. 192.168.50.11:6379 (511307ea...) -> 206141 keys | 4096 slots | 1 slaves. 192.168.50.10:6379 (36efcd23...) -> 411127 keys | 8192 slots | 1 slaves. 192.168.50.12:6379 (0d5151b0...) -> 205536 keys | 4096 slots | 1 slaves. [OK] 822804 keys in 3 masters. 50.22 keys per slot on average. [test@node-11 bin]$
發(fā)現(xiàn)槽位數(shù)不均勻,我們需要重新均勻分配下槽位數(shù):
[test@node-10 bin]$ redis-cli --cluster reshard 192.168.50.10:6379 -a test Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. >>> Performing Cluster Check (using node 192.168.50.10:6379) M: 36efcd23eecc5c4238711c4e680026fea1a71e6d 192.168.50.10:6379 slots:[5461-6826],[10923-16383] (6827 slots) master 1 additional replica(s) S: f899962300bb50d262d99503940ee1e5c41834d9 192.168.50.12:6380 slots: (0 slots) slave replicates 511307ead0b85f35358d29b67b63d6967a77c7f5 M: 0d5151b0d0e118e61e66d70e703c84a2d7916840 192.168.50.12:6379 slots:[0-1364],[6827-10922] (5461 slots) master 1 additional replica(s) S: 66a4721bb8da139a9e8881a6681e47aeca3bfea0 192.168.50.11:6380 slots: (0 slots) slave replicates 0d5151b0d0e118e61e66d70e703c84a2d7916840 S: ec6307189da48a8af1c0b168f7500a59f747289e 192.168.50.10:6380 slots: (0 slots) slave replicates 36efcd23eecc5c4238711c4e680026fea1a71e6d M: 511307ead0b85f35358d29b67b63d6967a77c7f5 192.168.50.11:6379 slots:[1365-5460] (4096 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. How many slots do you want to move (from 1 to 16384)? 1365 What is the receiving node ID? 511307ead0b85f35358d29b67b63d6967a77c7f5 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: 36efcd23eecc5c4238711c4e680026fea1a71e6d Source node #2: done
需要輸入:需要遷移的槽位數(shù),接收槽位的節(jié)點 ID,提供槽位的節(jié)點 ID,done。
執(zhí)行兩次,分別將 1356 個槽位從 10 的 master 遷移到 11 的 master 和 12 的 master。均勻后的結果:
[test@node-10 bin]$ redis-cli --cluster info 192.168.50.10:6379 -a test Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. 192.168.50.10:6379 (36efcd23...) -> 261787 keys | 5462 slots | 1 slaves. 192.168.50.12:6379 (0d5151b0...) -> 261514 keys | 5461 slots | 1 slaves. 192.168.50.11:6379 (511307ea...) -> 262509 keys | 5461 slots | 1 slaves. [OK] 785810 keys in 3 masters. 47.96 keys per slot on average. [test@node-10 bin]$
可以看出已經很均勻了。
其實類似于這種要刪除一個節(jié)點,并新增一個節(jié)點的需求。完全可以直接在新節(jié)點分配槽位的時候直接將要刪除的節(jié)點的槽位遷移過來即可,沒必要這么復雜的。這次操作后才醒悟過來。下次遇到類似的需求可以試試。
總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

