如何将6.0.8版Redis新CentOS节点添加至旧Redis集群并下线旧节点
旧Redis集群替换为6.0.8版本新节点的操作步骤
操作前的准备校验
- 网络连通性校验:确认A/B/C和D/E/F所有节点之间,Redis服务端口、集群总线端口(默认服务端口+10000)无防火墙、安全组拦截,节点间可直接通信
- 新节点配置对齐:D/E/F上的Redis 6.0.8实例配置要和现有旧集群完全一致,包括但不限于开启集群模式
cluster-enabled yes、集群节点超时时间、内存上限、内存淘汰策略、持久化配置、访问密码(如果旧集群开启了认证),避免加入集群后出现配置不兼容问题 - 旧集群健康校验:登录任意一个旧节点执行
cluster info,确认返回cluster_state:ok,无故障节点、无处于迁移中间状态的槽位;执行cluster nodes获取所有旧节点的NodeID备用 - 版本兼容校验:如果现有旧集群版本低于5.0,需先将旧集群小版本升级到5.0以上分支,再接入6.0.8版本的新节点,避免跨大版本集群通信协议不兼容
第一步:将新节点加入现有集群
- 登录任意一个健康的旧节点(比如A)的Redis命令行,逐个将D/E/F节点加入集群:
cluster meet <D节点IP> <Redis服务端口> cluster meet <E节点IP> <Redis服务端口> cluster meet <F节点IP> <Redis服务端口> - 执行
cluster nodes检查节点状态,待新节点从handshake状态变为在线状态、且未分配任何槽位时,代表节点加入成功
第二步:平滑迁移槽位到新节点
- 按照一一对应的逻辑规划槽迁移关系:比如将旧节点A承载的所有槽全部迁移到新节点D,旧节点B的槽迁移到E,旧节点C的槽迁移到F,降低迁移过程的复杂度
- 单个槽的标准迁移流程(以迁移A节点上的槽号100到D节点为例):
- 登录目标新节点D,执行导入标记:
cluster setslot 100 importing <A节点的NodeID> - 登录源旧节点A,执行导出标记:
cluster setslot 100 migrating <D节点的NodeID> - 循环从源节点拉取该槽下的key,批量迁移到目标节点:每批最多拉取100个key,通过
MIGRATE命令同步数据,直到该槽下无剩余key - 所有key迁移完成后,在集群任意节点执行归属确认:
cluster setslot 100 node <D节点的NodeID>
- 登录目标新节点D,执行导入标记:
- 所有旧节点上的16384个槽全部迁移完成后,执行
cluster slots检查,确认所有槽的归属都指向D/E/F新节点,无处于导入/导出中间状态的槽位,集群状态保持ok
第三步:副本关系调整
- 迁移完所有槽后,调整集群的副本归属:如果原集群有绑定在旧主节点上的从节点,可将从节点重新绑定到对应的新主节点上,在从节点命令行执行:
cluster replicate <对应新主节点的NodeID> - 等待从节点完成和新主节点的数据全量同步,状态变为在线后,确认集群的副本数达到预先规划的高可用要求
- 如果规划是将旧从节点也一并替换下线,需等新节点的副本配置全部生效、集群达到目标副本数后,再进入下线流程
第四步:平滑下线所有旧节点
- 确认旧节点A/B/C上已无任何槽位、无从节点绑定关系,从
cluster nodes输出中确认旧节点没有任何流量入口 - 从任意一个新节点执行集群节点删除命令,逐个移除旧节点:
redis-cli --cluster del-node <任意存活新节点IP:端口> <旧节点A的NodeID> redis-cli --cluster del-node <任意存活新节点IP:端口> <旧节点B的NodeID> redis-cli --cluster del-node <任意存活新节点IP:端口> <旧节点C的NodeID> - 确认集群节点列表中已无A/B/C的节点记录后,逐台停掉旧节点上的Redis服务,删除旧节点本地的集群配置文件(nodes.conf),避免旧节点重启后误重新加入集群
关键操作注意事项
- 槽位迁移全程集群可在线读写,仅被迁移的槽在窗口期存在短暂路由跳转,对业务无感知
- 迁移过程中不要重启任何集群节点,不要执行强制集群故障转移的配置,避免触发槽位冲突
- 如果集群开启了访问密码,所有redis-cli执行的命令都要带上对应认证参数,否则会报权限错误
- 迁移完成后,压测验证新节点的读写性能、持久化能力符合预期,再逐步将业务流量切到新集群节点
内容的提问来源于stack exchange,提问作者Devarajan
相关产品推荐
相关产品推荐

