手动切换怎么切
计划内维护时的手动切换比自动故障转移更可控,流程是固定的:先摘掉应用的写流量并等待从库追平,再在目标从库上执行 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 一致 |
| 降级 | 旧主指向新主 | 避免旧主恢复后仍可写 |
手动切换没有仲裁机制:写流量没摘干净就切换,旧主上的新写入会全部丢失,恢复后甚至难以判断该以哪份数据为准,只能人为取舍。
切换完成后建议立刻做一次全量备份,作为新拓扑的基线;否则下一次故障时没有干净的恢复起点,只能从更早的数据回滚。
客户端必须能感知主库地址变化:无论手动还是自动切换,应用都要重新解析地址或订阅切换事件,否则会出现「切换成功但应用仍在写旧主」的假成功。