Redis集群节点增删操作指南

作者:技术拾光时间:2026-06-06 08:47:12浏览:465

RedisCluster集群扩展时,新增节点需启动实例后使用clustermeet加入集群,通过clusterreshard分配槽位并设置主从关系。删除节点时先移除从节点,迁移主节点槽位后再删除主节点,最后平衡各节点槽位分布。

1. 添加节点

目前Redis集群由三台服务器(11、12、13)构成,每台运行两个Redis实例(6379和6380),共计六个节点。现计划新增一台服务器10,同样部署两个实例,一主一备。假设新服务器上的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

确认进程是否正常启动:

[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查看集群节点信息,会发现目前该节点只有一个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

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

1.2. 添加主节点

任意连接集群中的一个已有节点,例如连接服务器11的6379,使用cluster meet命令将10上的两个节点加入集群:

[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,增加一个后变成四个,16384 ÷ 4 = 4096)。
  2. 接收槽位的节点ID:36efcd23eecc5c4238711c4e680026fea1a71e6d(即新节点)。
  3. 槽位来源:输入all,表示从其他所有master节点均匀迁移槽位。

Redis集群节点增删操作指南

至此,新master节点(10上的6379)已成功加入集群并分配了槽位。而10上的6380目前仍是一个没有槽位的master节点,下一步将其设置为从节点。

1.3. 设置从节点

登录6380实例,执行cluster replicate命令,指定其主节点为刚才添加的6379(通过节点ID指定):

[test@node-10 bin]$ redis-cli -p 6380 -c -a test
127.0.0.1:6380> cluster replicate 36efcd23eecc5c4238711c4e680026fea1a71e6d
OK
127.0.0.1:6380> cluster nodes
# 输出中可以看到6380已标记为slave,并指向36efcd23...

完成后,新服务器10上的两个Redis实例(6379主、6380从)已成功加入现有集群。现在集群共有四台服务器、八个实例,四主四从。

2. 删除节点

当前集群由四台服务器(10、11、12、13)共八个实例构成。现在需要移除服务器13,即从集群中删除一主一从两个Redis服务。

2.1. 删除从节点

查看集群状态会发现,13上两个实例都是master,而11上两个实例都是slave。为避免数据丢失,需先将11上的某个slave提升为master,同时将13上的对应master降级为slave。巧的是,11上的一个slave的master正是13上的一个Redis服务。处理办法:直接杀掉13上的那个master进程,11上的对应slave会自动被选举为新的master,然后重新启动13上的该实例,它会自动以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@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@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]

此时查看集群节点信息,确认13上的6380已变成slave:

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
# ... 其他节点信息略
0d8423b0f03adcd631ca40f9d0cda8ec55c7b1bd 192.168.50.13:6380@16380 slave 0d5151b0d0e118e61e66d70e703c84a2d7916840 0 1626770881000 9 connected
# ...

现在可以正式删除这个从节点。使用redis-cli --cluster del-node命令,指定要删除的节点ID:

[test@node-10 bin]$ redis-cli --cluster del-node 192.168.50.10:6379 0d8423b0f03adcd631ca40f9d0cda8ec55c7b1bd -a test
>>> 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.

2.2. 删除主节点

13上还剩下一个master(6379),它的从节点是11上的一个slave。现在需要把这个slave重新挂到11上另一个master下面(因为11上的master目前还没有从节点)。

登录11上的6380(slave),执行cluster replicate重新指定其主节点为11上的master:

[test@node-11 bin]$ redis-cli -p 6380 -c -a test
127.0.0.1:6380> cluster replicate 0d5151b0d0e118e61e66d70e703c84a2d7916840
OK
127.0.0.1:6380> cluster nodes
# 可以看到6380已变为0d5151b0... 的slave

接下来需要将13上剩余master(节点ID为5252c798...)拥有的槽位(12288-16383)迁移出来。同样使用cluster reshard将这些槽位分配给其他master,这里选择全部迁移到10上的master:

[test@node-10 bin]$ redis-cli --cluster reshard 192.168.50.10:6379 -a test
# 交互输入:迁移槽位数、接收节点ID、来源节点ID

迁移后查看集群节点,13的master上槽位已清空,10的master槽位增加:

127.0.0.1:6380> cluster nodes
# 略,可见13的master槽位为0,10的master槽位包含0-1364 5461-6826 10923-16383

最后直接删除这个已无槽位的主节点:

[test@node-13 bin]$ redis-cli --cluster del-node 127.0.0.1:6379 5252c7984ddd554d95cb909eb76f769d17ad289f -a test
>>> 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.

3. 最终结果

至此,已将13上的6379和6380从集群中移除,并成功加入10上的6379和6380。查看集群信息:

[test@node-11 bin]$ redis-cli --cluster info 192.168.58.11:6379 -a test
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.

发现槽位分布不均:10上的master拥有8192个槽位,而另外两个只有4096个。需要重新平衡:

[test@node-10 bin]$ redis-cli --cluster reshard 192.168.50.10:6379 -a test
# 交互输入:迁移1365个槽位,接收节点为11的master ID,来源节点为10的master ID
# 再执行一次类似操作,迁移1365个槽位给12的master

平衡后结果:

[test@node-10 bin]$ redis-cli --cluster info 192.168.50.10:6379 -a test
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.

分布已经很均匀了。其实回过头来看,这种“删除一个节点、新增一个节点”的需求,完全可以在新节点分配槽位时直接把要删除节点的槽位迁移过来,省去中间那些步骤。这次操作完之后才想明白……下次遇到类似场景,可以走更简洁的路线。

总结

以上操作完整展示了Redis Cluster节点的添加与删除流程,关键点在于:新节点加入集群后无槽位,需手动分配;删除主节点前必须先迁移其槽位,避免数据丢失;从节点可直接删除,主节点则需要先处理数据归属。实际操作中注意节点ID的正确引用,以及交互式命令的输入顺序。