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