Redis Cluster 集群增加和删除节点


1. 添加节点

目前集群由三台服务器 11、12、13,共六个 redis 实例构成,每台服务器上两个 redis 实例(6379 和 6380)。 现在需要新增一台服务器 10,再安装两个 redis 实例,一主一备。

默认新服务器上两个 redis 都配置完毕了,不明白的可以参考:Redis Cluster 集群搭建详细过程

1.1. 启动新节点

登录新服务器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 服务,查看集群节点信息,可以发现该集群只有 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> 

接下来需要将这两个节点加入到集群中。

1.2. 添加主节点

任意连接一台集群中的节点,比如我们连接 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查看集群节点节点,可以发现,10 上的 6379 和 6380 已经添加到集群中了,此时这两个新添加的都是 master 节点,并且槽位数都是 0。

分配槽位

接下来我们使用cluster reshard给 10 上的 6379 节点分配槽位。

[test@node-10 bin]$ redis-cli --cluster reshard 192.168.50.10:6379 -a test

接下来需要输入的内容:

  1. 算出来每个 master 的槽数:4096(原本三个 master,加一个变四个 maste,16384/4=4096)。
  2. 填写接收槽位的节点 ID:36efcd23eecc5c4238711c4e680026fea1a71e6d。
  3. 填写槽位来源节点 Source node 为 all,表示从其他所有 master 节点迁移槽位。

在这里插入图片描述
到这里就成功添加了一个 master 节点(10 上的 6379),并分配了相应的槽位。此时 10 上的 6380 还是一个没有槽位的 master 节点。

1.3. 设置从节点

将 10 上的 6380 设置为 10 上 6379 的从节点,登录 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 + 主节点ID(指定主节点,10 上的 6379)就能指定当前节点为目标节点的从节点:

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. 删除节点

目前集群由四台服务器 10、11、12、13,共八个 redis 实例构成,每台服务器上两个 redis 实例。 需要删除一台服务器 13,也就是要从集群中删除一主一从两个 redis 服务。

2.1. 删除从节点

现在发现是 13 机器上两个 redis 服务都是 master 节点,然后发现 11 上两个都是 slave 节点,那么我们就要先将 11 的一个 slave 提升为 master,13 的一个 master 降级为 slave。

发现恰好 11 的一个 slave 服务的 master 就是 13 的一个 redis 服务。这里就比较简单了,可以直接 kill 掉 13 上的那个 master 服务,这样 11 上的那个 slave 就会自动提升为 master 了。然后再启动 13 上的 那个 master ,会发现它已经变为 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

查看集群节点信息:

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

现在可以删除从节点了(直接删除从节点其实也就这一步即可),0d8423b0f03adcd631ca40f9d0cda8ec55c7b1bd为要删除的从节点的 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. 删除主节点

13 上的剩余的这个主节点的从节点为 11 上的一个 slave。现在需要将 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 上的槽位数分配给其他的 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

可以发现 13 的 master 节点上已经没有槽位了,而 10 上的 master 槽位数增加了。

接下来直接删除 13 上这个主节点就可以了:

[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]$ 

发现槽位数不均匀,我们需要重新均匀分配下槽位数:

[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

需要输入:需要迁移的槽位数,接收槽位的节点 ID,提供槽位的节点 ID,done。

执行两次,分别将 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]$ 

可以看出已经很均匀了。

其实类似于这种要删除一个节点,并新增一个节点的需求。完全可以直接在新节点分配槽位的时候直接将要删除的节点的槽位迁移过来即可,没必要这么复杂的。这次操作后才醒悟过来。下次遇到类似的需求可以试试。

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值