Redis Cluster集群增加和刪除節(jié)點(diǎn)方式
1. 添加節(jié)點(diǎn)
目前集群由三臺(tái)服務(wù)器 11、12、13,共六個(gè) redis 實(shí)例構(gòu)成,每臺(tái)服務(wù)器上兩個(gè) redis 實(shí)例(6379 和 6380)。 現(xiàn)在需要新增一臺(tái)服務(wù)器 10,再安裝兩個(gè) redis 實(shí)例,一主一備。
默認(rèn)新服務(wù)器上兩個(gè) redis 都配置完畢了,不明白的可以參考:Redis Cluster 集群搭建。
1.1. 啟動(dòng)新節(jié)點(diǎn)
登錄新服務(wù)器10,分別啟動(dòng) 6379 和 6380 兩個(gè) redis 服務(wù):
[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 進(jìn)程:
[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 服務(wù),查看集群節(jié)點(diǎn)信息,可以發(fā)現(xiàn)該集群只有 6379 一個(gè) 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>
接下來需要將這兩個(gè)節(jié)點(diǎn)加入到集群中。
1.2. 添加主節(jié)點(diǎn)
任意連接一臺(tái)集群中的節(jié)點(diǎn),比如我們連接 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é)點(diǎn)節(jié)點(diǎn),可以發(fā)現(xiàn),10 上的 6379 和 6380 已經(jīng)添加到集群中了,此時(shí)這兩個(gè)新添加的都是 master 節(jié)點(diǎn),并且槽位數(shù)都是 0。
分配槽位
接下來我們使用cluster reshard給 10 上的 6379 節(jié)點(diǎn)分配槽位。
[test@node-10 bin]$ redis-cli --cluster reshard 192.168.50.10:6379 -a test
接下來需要輸入的內(nèi)容:
- 算出來每個(gè) master 的槽數(shù):4096(原本三個(gè) master,加一個(gè)變四個(gè) maste,16384/4=4096)。
- 填寫接收槽位的節(jié)點(diǎn) ID:36efcd23eecc5c4238711c4e680026fea1a71e6d。
- 填寫槽位來源節(jié)點(diǎn) Source node 為 all,表示從其他所有 master 節(jié)點(diǎn)遷移槽位。

到這里就成功添加了一個(gè) master 節(jié)點(diǎn)(10 上的 6379),并分配了相應(yīng)的槽位。此時(shí) 10 上的 6380 還是一個(gè)沒有槽位的 master 節(jié)點(diǎn)。
1.3. 設(shè)置從節(jié)點(diǎn)
將 10 上的 6380 設(shè)置為 10 上 6379 的從節(jié)點(diǎn),登錄 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é)點(diǎn)ID(指定主節(jié)點(diǎn),10 上的 6379)就能指定當(dāng)前節(jié)點(diǎn)為目標(biāo)節(jié)點(diǎn)的從節(jié)點(diǎn):
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>
到此就將新服務(wù)器 10 上的兩個(gè)新增 redis 服務(wù) 6379 和 6380 成功添加到了已有的 redis cluster 中了。目前集群共有四臺(tái)服務(wù)器,共八個(gè) redis 服務(wù),四主四從。
2. 刪除節(jié)點(diǎn)
目前集群由四臺(tái)服務(wù)器 10、11、12、13,共八個(gè) redis 實(shí)例構(gòu)成,每臺(tái)服務(wù)器上兩個(gè) redis 實(shí)例。 需要?jiǎng)h除一臺(tái)服務(wù)器 13,也就是要從集群中刪除一主一從兩個(gè) redis 服務(wù)。
2.1. 刪除從節(jié)點(diǎn)
現(xiàn)在發(fā)現(xiàn)是 13 機(jī)器上兩個(gè) redis 服務(wù)都是 master 節(jié)點(diǎn),然后發(fā)現(xiàn) 11 上兩個(gè)都是 slave 節(jié)點(diǎn),那么我們就要先將 11 的一個(gè) slave 提升為 master,13 的一個(gè) master 降級(jí)為 slave。
發(fā)現(xiàn)恰好 11 的一個(gè) slave 服務(wù)的 master 就是 13 的一個(gè) redis 服務(wù)。這里就比較簡(jiǎn)單了,可以直接 kill 掉 13 上的那個(gè) master 服務(wù),這樣 11 上的那個(gè) slave 就會(huì)自動(dòng)提升為 master 了。然后再啟動(dòng) 13 上的 那個(gè) master ,會(huì)發(fā)現(xiàn)它已經(jīng)變?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é)點(diǎn)信息:
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é)點(diǎn)了(直接刪除從節(jié)點(diǎn)其實(shí)也就這一步即可),0d8423b0f03adcd631ca40f9d0cda8ec55c7b1bd為要?jiǎng)h除的從節(jié)點(diǎn)的 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é)點(diǎn)
13 上的剩余的這個(gè)主節(jié)點(diǎn)的從節(jié)點(diǎn)為 11 上的一個(gè) slave。現(xiàn)在需要將 11 上這個(gè) slave 指定為 11 上 master 的 slave(11 上這個(gè) master 目前還沒有 slave)。
所以我們登錄服務(wù)器 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
接下來我們需要重新分配要?jiǎng)h除的 13 上 master 的槽位 12288-16383。其實(shí)就是使用cluster reshard將該 master 上的槽位數(shù)分配給其他的 master,這里我們直接分配到 10 上的一個(gè)master 上,操作方法可以參考上面,這里可以看到操作結(jié)果:
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é)點(diǎn)上已經(jīng)沒有槽位了,而 10 上的 master 槽位數(shù)增加了。
接下來直接刪除 13 上這個(gè)主節(jié)點(diǎn)就可以了:
[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. 最終結(jié)果
將 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é)點(diǎn) ID,提供槽位的節(jié)點(diǎn) ID,done。
執(zhí)行兩次,分別將 1356 個(gè)槽位從 10 的 master 遷移到 11 的 master 和 12 的 master。均勻后的結(jié)果:
[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]$
可以看出已經(jīng)很均勻了。
其實(shí)類似于這種要?jiǎng)h除一個(gè)節(jié)點(diǎn),并新增一個(gè)節(jié)點(diǎn)的需求。完全可以直接在新節(jié)點(diǎn)分配槽位的時(shí)候直接將要?jiǎng)h除的節(jié)點(diǎn)的槽位遷移過來即可,沒必要這么復(fù)雜的。這次操作后才醒悟過來。下次遇到類似的需求可以試試。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
redis中hiredis-API函數(shù)的調(diào)用方法
這篇文章主要介紹了redis中hiredis-API函數(shù)的調(diào)用,本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2023-09-09
Redis簡(jiǎn)易延時(shí)隊(duì)列的實(shí)現(xiàn)示例
在實(shí)際的業(yè)務(wù)場(chǎng)景中,經(jīng)常會(huì)遇到需要延時(shí)處理的業(yè)務(wù),本文就來介紹有下Redis簡(jiǎn)易延時(shí)隊(duì)列的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下2023-12-12
windows下通過批處理腳本啟動(dòng)redis的操作
本文主要給大家介紹了windows下通過批處理腳本啟動(dòng)redis的操作,windows下redis啟動(dòng),需要進(jìn)入redis安裝目錄,然后shift+右鍵,選擇“在此處打開命令窗口”,然后輸入redis-server.exe redis.conf,就可以啟動(dòng)redis了,文中有詳細(xì)的圖文參考,感興趣的朋友可以參考下2023-12-12
WINDOWS中REDIS主從配置實(shí)現(xiàn)代碼解析
這篇文章主要介紹了WINDOWS中REDIS主從配置實(shí)現(xiàn)代碼解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08
基于Redis延遲隊(duì)列的實(shí)現(xiàn)代碼
在生活中很多時(shí)候都會(huì)用到延遲隊(duì)列,本文基于Redis延遲隊(duì)列的實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-05-05

