首页/数据/Redis 进阶速查/REPLICAOF 建立主从复制
主从与哨兵51 条

REPLICAOF 建立主从复制

REPLICAOF host port 让当前实例成为目标实例的从库:会先做一次全量同步,之后持续增量同步;REPLICAOF NO ONE 可解除并提升为主。

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

REPLICAOF 是什么

REPLICAOF host port 用于把当前实例变成指定实例的从库:执行后实例会发起同步握手,先按需做一次全量同步把主库数据整体拉过来,再持续接收主库转发的写命令流,保持数据一致。从库默认只读,可以在不影响主库的前提下承担读流量、备份任务与故障接管。它取代了旧命令 SLAVEOF,语义相同、只是命名更中性。

基本信息

建立复制REPLICAOF <masterip> <masterport>
解除复制REPLICAOF NO ONE,实例变成独立主库
旧命令SLAVEOF,作为兼容别名保留
只读保护replica-read-only yes(默认),从库写操作报 READONLY
角色判定INFO replication 的 role 字段:master 或 slave

典型使用场景

  • 读写分离:把报表、导出、后台查询这类重读流量导到从库,减轻主库压力
  • 高可用基础:哨兵或集群都建立在主从复制之上,先有从库才谈得上自动切换
  • 在线备份:在从库上执行快照或导出,避免主库 fork 带来的停顿
  • 数据搬迁与升级:先把新实例挂成从库完成同步,再停写切换,减少停机时间
  • 异地只读副本:跨机房部署从库用于本地读取与应急数据留存

建立与观察复制

建立与观察复制
redis-cli REPLICAOF 10.0.0.11 6379       # 把本机变成 10.0.0.11 的从库
redis-cli INFO replication                # role / master_host / master_link_status
redis-cli -h 10.0.0.11 INFO replication | grep -A1 'slave0'   # 主库侧看从库状态
redis-cli CONFIG SET masterauth <密码>    # 主库有密码时从库须配置相同口令
redis-cli REPLICAOF NO ONE                # 解除复制,提升为独立主库

持久化到配置文件

持久化到配置文件
replicaof 10.0.0.11 6379
masterauth <主库密码>
replica-read-only yes
replica-serve-stale-data yes

INFO replication 关键字段

字段含义正常表现
role本实例角色master 或 slave
master_link_status与主库的连接状态up 为健康,down 需排查网络与认证
master_last_io_seconds_ago距上次收到主库数据的时间通常为 0 或 1,持续增大说明链路异常
slave_read_only从库是否只读1 为受保护状态
slave_repl_offset已同步到的偏移量应与主库 offset 接近
复制是单向的:数据只从主库流向从库,从库的写入默认被拒绝。级联复制(从库再挂从库)可以减少主库的出流量,但会增加链路深度与故障切换的判断复杂度,规模不大时优先让所有从库直连主库。
运行中新建从库会触发全量同步:主库 fork 生成快照并推送给从库,从库先清空自身数据再加载。这一步会占用主库 CPU、内存与带宽,应在低峰执行,并确认从库磁盘能容下快照文件。

主库侧看从库

主库字段含义判读建议
slave0 / slave1每个从库的 ip、port、state、offsetstate 为 online 才算健康
connected_slaves当前在线从库数量比预期少说明链路或认证有问题
master_repl_offset主库已写入的字节偏移量与从库 offset 相减即为落后量
repl_backlog_active复制积压缓冲区是否启用为 0 时断连必然全量同步
只读从库上的读延迟:从库通过网络异步接收命令,存在毫秒级到秒级不等的滞后。业务上如果「写完立刻读」必须拿到最新值,这条读请求应回主库,或用客户端记住写入偏移量、要求从库至少同步到该偏移才允许读。
REPLICAOF 与配置文件的差异要分清:命令行执行的连接关系只存在于当前进程,重启即失效;配置文件中的 replicaof 才会在每次启动时生效。生产环境两者应保持一致,避免重启后拓扑悄悄变化。
从库的只读保护可以关闭,但关掉之后主从写入不同内容会导致数据分叉,且故障切换时无法自动修复。除非明确知道在做什么,不要改 replica-read-only。

易错点

  • 把 REPLICAOF 只写在命令行里,未写入配置文件:实例重启后恢复成独立主库,客户端继续写入会产生第二份真实数据,切换时才发现分叉
  • 从库上执行写命令报 READONLY,被误判为故障:这其实是只读保护在生效,要写数据应连主库或先解除复制
  • 主库开启 requirepass 后从库未配置 masterauth,现象是 master_link_status 一直 down,错误信息在从库日志里而不在客户端
  • 误以为复制是强一致:主库返回成功只代表本地写入完成,从库可能落后,读从库拿到旧值是正常现象而非 bug

数据来源与参考

  • Redis 官方文档:REPLICAOF 命令
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌