Redis集群新增节点与重新分片运维全攻略
一、集群扩容前的准备
在操作前,务必确认当前集群健康状况。使用 redis-cli --cluster check 命令检查集群state为ok,所有master和slave节点状态正常。
- 确认现有master节点数量与slot分布
- 确认各节点内存、CPU和带宽余量
- 备份关键数据或在维护窗口执行操作
- 记录当前集群节点ID与端口对应关系
二、启动新Redis节点
2.1 配置和启动
为新节点准备独立的配置文件和目录(如/redis/nodes/7007),注意端口不要冲突。修改配置:
- port 7007
- cluster-enabled yes
- cluster-config-file nodes-7007.conf
- appendonly yes
- daemonize yes
启动命令:redis-server /redis/nodes/7007/redis.conf。启动后用 ps -ef | grep redis 确认进程存在。
2.2 验证节点状态
通过 redis-cli -p 7007 cluster info 查看,此时cluster_state应为fail,因为该节点未加入任何集群,这是正常现象。
三、将新节点加入集群
使用 redis-cli --cluster add-node 命令,将新节点作为master加入任意现有集群节点:
redis-cli --cluster add-node 127.0.0.1:7007 127.0.0.1:7001
第一个参数为新节点地址,第二个参数为集群中现有节点地址。加入后,用 redis-cli -p 7001 cluster nodes 查看,7007应出现在列表且role为master。
注意:如果新节点内存配置不当或无法连接,命令会失败,需检查网络和安全组。
四、重新分片迁移slot
新节点加入后,默认没有任何slot,需要从现有master迁移部分slot以确保数据均衡。
4.1 交互式reshard
执行 redis-cli --cluster reshard 127.0.0.1:7001(连接任意节点),按照交互提示操作:
- 输入需要迁移的slot数量(例如4096,如果总16384个slot,4个节点均衡分配)
- 输入接收slot的节点ID(即新节点7007的ID)
- 选择来源节点,可输入all从所有master均匀取出,或指定某个节点ID
- 确认迁移方案后输入yes开始执行
4.2 自动化方式(避免交互)
使用 --cluster-from 和 --cluster-to 参数指定迁移范围和目标:
redis-cli --cluster reshard 127.0.0.1:7001 --cluster-from all --cluster-to <新节点ID> --cluster-slots 4096 --cluster-yes
迁移过程中,slot对应的key会逐步从源节点移动到目标节点,期间服务无需停机。
4.3 检查迁移状态
迁移完成后,再次执行 redis-cli --cluster check 127.0.0.1:7001,确认每个master节点slot数均匀,例如4个节点每个4096个slot。
五、验证与收尾
5.1 功能验证
- 写入测试key:redis-cli -c -p 7001 set test key123
- 读取验证:redis-cli -c -p 7001 get test
- 通过cluster keyslot测试key落在新分区slot
5.2 配置持久化
确认新节点的nodes-7007.conf文件已正确记录集群拓扑。如有需要,可将新节点设为主节点,并将部分副本迁移,但一般不建议在扩容后立即进行。
六、常见问题与注意事项
- 节点物理资源需与集群其他节点一致,避免容量不均
- reshard期间需确保网络稳定,避免迁移中断导致slot状态不一致
- 如果集群已满(所有slot都分配),必须先删除不需要的节点或缩小某些master的slot
- 生产环境建议使用多副本,并且新节点加入后手动分配副本
- 操作涉及数据迁移,建议在业务低峰期进行
通过以上步骤,Redis集群可以平滑完成新增节点与重新分片,整个过程不中断服务,但需要谨慎执行每一步,尤其要注意命令中的节点ID和端口,避免误操作。