协调式切换命令
FAILOVER 在 Redis 6.2 引入,事件发生在待下线的主库上:主库先等目标从库把偏移追平,再把它提升为新主库,并把其余从库重新指向新主。全过程由主库协调,替代了手工在两台机器上执行降级与提升的做法,能明显压低造出双主与数据分叉的概率。
基本信息
| 适用版本 | Redis 6.2 及以上 |
|---|---|
| 执行位置 | 必须连到当前主库,在从库上执行无效 |
| 语法 | FAILOVER [TO host port [FORCE]] [ABORT] [TIMEOUT 毫秒] |
| 过程查看 | INFO replication 中的 master_failover_state |
典型使用场景
- 计划内维护:不停机把主库切到另一台机器,然后下线原主做硬件或系统维护
- 机房搬迁:把主库漂移到目标机房节点上,避免长时间跨机房写延迟
- 切换演练:不杀进程也能走一遍完整的切换流程,用于验证客户端恢复能力
- 故障兜底:原主仍在线但已不适合继续承担写入(如磁盘故障或机器异常)
使用示例
使用示例
redis-cli -h 10.0.0.11 FAILOVER TO 10.0.0.12 6379 # 指定目标从库执行切换
redis-cli -h 10.0.0.11 FAILOVER # 不带 TO 时由主库自行挑选从库
redis-cli -h 10.0.0.11 INFO replication | grep master_failover_state # 观察进度
redis-cli -h 10.0.0.11 FAILOVER ABORT # 中止尚未完成的切换
redis-cli -h 10.0.0.12 INFO replication | grep role # 确认新主已就位
redis-cli -h 10.0.0.11 INFO replication | grep role # 确认原主已降为从库过程状态读法
| master_failover_state | 含义 | 下一步动作 |
|---|---|---|
| no-failover | 当前没有切换在进行 | 可以发起新的切换 |
| waiting-for-sync | 正在等待目标从库追平偏移 | 观察从库 offset 是否收敛 |
| failover-in-progress | 正在提升目标并重指向其他从库 | 耐心等待收敛,不要同时手工提升 |
| 切换完成后 role 变化 | 原主变为从库,目标从库成为主库 | 同步更新客户端入口(DNS 或代理) |
FORCE 必须与 TO 一起使用,它会跳过与目标从库的同步校验。只有在目标宁可丢一点数据也要完成切换的紧急场景才用它,否则可能丢掉尚未同步到从库的写入。
TIMEOUT 控制等待目标从库追平的上限,单位毫秒。等待期间主库仍接受写入、偏移持续推进,因此写入量大的实例要给足时间,否则切换会因为追不平而失败。
6.2 以前没有这个命令,老版本要么手工 REPLICAOF NO ONE 加上指向新主的 REPLICAOF,要么交给哨兵或集群处理。没有协调机制时切勿在两边同时提升,双主一旦形成清理起来非常麻烦。
FAILOVER 只解决 Redis 侧的主从关系,客户端如何找到新主仍需要配套机制:哨兵、代理层、DNS 切换或服务发现都行,但必须和应用一起演练过。