首页/数据/数据库速查/手动切换主从(计划内切换流程)
Redis 运维与场景124 条

手动切换主从(计划内切换流程)

计划内维护的手动切换:确认数据同步到位后,从库 REPLICAOF NO ONE 提升为主,其他从库改挂新主,旧主降级为从。

数据库速查数据更新于 2026-10-13

手动切换怎么切

计划内维护时的手动切换比自动故障转移更可控,流程是固定的:先摘掉应用的写流量并等待从库追平,再在目标从库上执行 REPLICAOF NO ONE 提升为主,然后把其它从库改挂新主,最后把原主降级为从库。整个过程没有仲裁机制,唯一的前提是「应用确实不再写旧主」,否则一定产生双主。

基本信息

提升REPLICAOF NO ONE,让实例脱离复制并变为可写主库
改挂REPLICAOF host port,让从库指向新的主库
前提应用先摘写流量,主从偏移基本一致
验证INFO replication 看 role、master_host 与从库列表
风险旧主未清理干净仍被写入会形成双主

典型使用场景

  • 机房搬迁或硬件更换的计划内切换
  • 主库版本升级前的角色腾挪
  • 主库所在宿主机需要停机维护
  • 演练中验证切换流程与实际耗时
  • 故障恢复后把旧主重新纳入拓扑

切换步骤

切换步骤
# 1) 应用已摘写流量,确认偏移
INFO replication | grep master_repl_offset
# 2) 在原从库上提升
REPLICAOF NO ONE
# 3) 其它从库改挂新主
REPLICAOF 10.0.0.20 6379
# 4) 旧主重启后降级为新主的从库
REPLICAOF 10.0.0.20 6379
# 验证:
INFO replication    # 新主应显示 role:master 且从库列表完整

阶段与验证点

阶段动作验证点
准备应用侧摘除写流量确认应用确实不再写旧主
追平等待从库偏移与主库一致比较双方 master_repl_offset
提升执行 REPLICAOF NO ONE新主 role 变为 master
改挂其它从库指向新主所有从库的 master_host 一致
降级旧主指向新主避免旧主恢复后仍可写
手动切换没有仲裁机制:写流量没摘干净就切换,旧主上的新写入会全部丢失,恢复后甚至难以判断该以哪份数据为准,只能人为取舍。
切换完成后建议立刻做一次全量备份,作为新拓扑的基线;否则下一次故障时没有干净的恢复起点,只能从更早的数据回滚。
客户端必须能感知主库地址变化:无论手动还是自动切换,应用都要重新解析地址或订阅切换事件,否则会出现「切换成功但应用仍在写旧主」的假成功。

易错点

  • 旧主恢复后直接启动:带着旧角色接受写入,形成双主
  • 切换后不检查复制链路:从库挂错了主,数据分叉长期无人发现
  • 只切换服务不通知客户端:应用仍连旧地址,业务侧表现为写入失败
  • 切换完不立即备份:新拓扑没有基线,下一次恢复无从下手

数据来源与参考

  • Redis 官方文档: REPLICAOF
  • Redis 官方文档: 复制(故障切换)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌