首页/数据/Redis 进阶速查/从库提升与 REPLICAOF NO ONE
主从与哨兵51 条

从库提升与 REPLICAOF NO ONE

计划内切换/提升:在目标从库执行 REPLICAOF NO ONE,使其停止复制成为独立主库;随后把其他从库指向新主库。

Redis 进阶速查数据更新于 2026-10-13

从库提升与 REPLICAOF NO ONE

REPLICAOF NO ONE 让当前从库停止复制并把自己提升为独立主库:角色由 slave 变为 master,已有数据保留,之后不再接收旧主的写入。这是计划内切换(机房迁移、机器下线、版本升级、维护窗口)的核心动作;故障场景下的自动切换由哨兵或集群完成,但内部同样是先选出候选节点再提升。旧版本命令名是 SLAVEOF,新版本以 REPLICAOF 为准,两者语义相同。

基本信息

提升命令REPLICAOF NO ONE
跟随命令REPLICAOF <host> <port>,把实例重新指向主库
历史命令SLAVEOF,功能等价,新版本统一用 REPLICAOF
角色确认INFO replication 的 role 字段由 slave 变为 master
提升前提从库已完成追平,且旧主已停止写入
只读限制replica-read-only 只约束从库角色;提升为主库后该限制不再生效

典型使用场景

  • 机房或可用区迁移:把写入切到目标机房的实例,再处理原实例
  • 维护窗口:临时提升一个从库接管写入,原主修好后再改回从库角色
  • 演练与压测:用接近真实数据规模的提升实例做验证,避免在线上主库上压测
  • 哨兵切换后的收尾:确认新主已生效,手工把游离节点重新指向新主
  • 版本升级:先让新版本实例通过复制追平,再提升为新主以缩短不可写时间

切换动作顺序

切换动作顺序
redis-cli -h 10.0.0.12 -p 6379 INFO replication | grep -E 'role:slave|slave_repl_offset|master_link_status'   # 1 确认从库状态
redis-cli -h 10.0.0.11 -p 6379 INFO replication | grep master_repl_offset   # 2 对比主库偏移量,确认已追平
redis-cli -h 10.0.0.12 -p 6379 REPLICAOF NO ONE                             # 3 提升为目标主库
redis-cli -h 10.0.0.12 -p 6379 INFO replication | grep -E 'role:master|connected_slaves'   # 4 确认角色
redis-cli -h 10.0.0.13 -p 6379 REPLICAOF 10.0.0.12 6379                    # 5 其余从库改指新主
redis-cli -h 10.0.0.12 -p 6379 INFO replication | grep 'slave0:'             # 6 确认新拓扑已建立

切换步骤与目的

步骤动作目的
停写应用或代理停止往旧主写避免双主同时接收写入产生分叉
追平确认对比主从偏移量差值确保提升后不丢未同步的最后一批写入
提升在目标从库执行 REPLICAOF NO ONE目标实例成为新主并保留现有数据
改指向其余从库执行 REPLICAOF 新主地址重建复制拓扑,避免集群分裂
切流量客户端、VIP、代理或 DNS 指到新主应用恢复写入能力
旧主处理按需设为新主的从库或直接下线消除第二写入源,恢复单主结构
提升前要确认从库确实追平:对比主库的 master_repl_offset 与从库的 slave_repl_offset,差值为 0 或仅有极小波动才算安全;差值明显时先等收敛,或用 WAIT 让主库确认数据已落到从库再动手。切换窗口的取舍是先保数据正确再追可用性。
双主写入一旦发生,两份数据分叉后的合并成本极高,几乎没有便宜的补救手段。因此「先停写、再提升」的顺序不能颠倒,也不要指望应用层的重试把写入自动落到新主上。

易错点

  • 未停写就先提升,旧主与新主同时接受写入,形成双主分叉,只能人工对账合并数据
  • 应用侧把地址写死在配置文件里,提升后仍连旧主,故障表现与「切换没生效」一模一样;应通过 VIP、代理或配置中心统一切换入口
  • 提升后忘记改其他从库的指向,拓扑分裂成两套:部分从库继续跟随已降级的旧主,数据不再收敛
  • 旧主恢复后直接启动并对外提供服务,它仍是主库角色,等于引入第二个写入源;必须先执行 REPLICAOF 新主再放流量
  • 从库追平前就提升,未同步完成的那段写入永久缺失;切换前不看偏移量差值直接操作是常见事故原因
  • 提升后未评估容量:原先读压力可由从库分担,此时写入与读取都集中到新主,缺少扩容预案会造成过载

数据来源与参考

  • Redis 官方文档:REPLICAOF NO ONE 与故障切换说明
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌