26. 主从复制 Replication
本教程共 40 篇 · 第 26 篇 · 更新于 2026-08-02
26. 主从复制 Replication
当单机 Redis 的性能和容量不足以支撑业务,或者你希望为数据增加一份冗余以防单点故障时,主从复制(Replication) 是最基础、最常用的方案。它让一个 Redis 节点(从节点 / replica)成为另一个节点(主节点 / master)的精确副本,主节点的写入会自动同步到从节点。
主从复制是 Redis 高可用体系的基石:第 27 章的哨兵、第 28/29 章的集群,底层都依赖复制。码上学先把复制的原理和配置讲透。
本节目标
- 理解主从复制的拓扑与作用(冗余、读写分离、水平扩展读)。
- 掌握两种开启复制的方式:配置文件
replicaof与命令REPLICAOF。 - 理解全量同步与部分重同步(PSYNC)的过程。
- 会用
INFO replication、ROLE观察复制状态。 - 了解只读副本与数据安全相关配置(
replica-read-only、min-replicas-to-write)。
复制的基本拓扑
一个主节点(master)可以有多个从节点(replica);从节点自己也可以再有从节点(级联复制 / 树状复制),从而减轻主节点的同步压力。典型用途有三个:
- 数据冗余:从节点是主节点的热备份,主节点宕机时从节点仍有完整数据。
- 读写分离:写请求走主节点,读请求分摊到多个从节点,提升整体读吞吐。
- 灾备与运维:可以在从节点上做 RDB 备份、慢查询分析,而不影响主节点性能。
需要明确:Redis 的复制是异步的。主节点执行完写命令后会立即返回给客户端,然后(异步)把命令传播给从节点。因此从节点数据存在极短延迟,正常毫秒级;在网络抖动或从节点繁忙时延迟会增大。
配置复制:两种方式
方式一:在 redis.conf 中配置
在从节点的配置文件里加入:
replicaof 127.0.0.1 6379
重启(或重载配置)后,该实例就会成为 127.0.0.1:6379 的从节点。如果主节点开启了密码(requirepass)或使用 ACL,从节点还需配置认证:
masterauth <master-password>
# 若主节点使用 ACL(Redis 6+),还可指定复制专用用户:
masteruser <username>
方式二:运行时用命令
不需要改配置文件,直接在从节点上执行 REPLICAOF 命令即可动态建立复制关系:
127.0.0.1:6380> REPLICAOF 127.0.0.1 6379
OK
执行后,6380 会成为 6379 的从节点,并开始同步数据。若想解除复制、让该实例重新成为独立主节点,执行:
127.0.0.1:6380> REPLICAOF NO ONE
OK
提示(命令名演变):旧版本命令叫
SLAVEOF,Redis 5 起官方逐步将术语改为replica,SLAVEOF仍作为兼容别名存在。新代码请统一使用REPLICAOF。
同步过程:全量同步与部分重同步
当从节点首次连接主节点,或从节点落后太多时,会触发全量同步(full resync):
- 从节点向主节点发送
PSYNC请求。 - 主节点执行
BGSAVE生成 RDB 快照,同时把生成期间的写命令缓存进复制积压缓冲区(replication backlog)。 - 主节点把 RDB 文件传给从节点,从节点清空旧数据并加载 RDB。
- 主节点再把 backlog 里的增量写命令发送给从节点,完成对齐。
如果连接短暂断开后重连,且从节点落后的偏移量仍在主节点的 backlog 范围内,则触发部分重同步(partial resync):主节点只需把断开期间丢失的那段命令补发给从节点,无需再传整个 RDB。这大大降低了网络抖动带来的开销。
你可以通过 INFO replication 观察相关字段,例如 repl_backlog_size(积压缓冲区大小)、master_repl_offset、slave_repl_offset 等,用来判断同步进度。
观察复制状态
在主节点上查看复制信息:
127.0.0.1:6379> INFO replication
对应输出(节选):
# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=6380,state=online,offset=12345,lag=1
master_replid:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
master_repl_offset:12345
role:master 表示这是主节点,connected_slaves:1 表示有 1 个从节点在线,lag 是从节点落后主节点的秒数(很小说明同步良好)。
在从节点上查看:
127.0.0.1:6380> INFO replication
# Replication
role:replica
master_host:127.0.0.1
master_port:6379
master_link_status:up
slave_repl_offset:12345
master_link_status:up 表示与主节点的连接正常。也可以用 ROLE 命令,它会一次性返回该实例的角色及复制拓扑信息:
127.0.0.1:6380> ROLE
1) "replica"
2) "127.0.0.1"
3) (integer) 6379
4) "connected"
5) (integer) 12345
只读副本与读写分离
从 Redis 2.6 起,从节点默认是只读的,对应配置:
replica-read-only yes
如果你尝试在从节点上写入,会收到错误:
127.0.0.1:6380> SET foo bar
(error) READONLY You can't write against a read only replica.
这正是为了支持「读写分离」:应用把写流量发往主节点,把读流量按负载均衡发往各个从节点。只读只是防止误写的一层保护,并非安全边界——它不限制管理员命令,生产环境应配合 ACL、网络隔离进一步加固。
另一个相关配置是 replica-serve-stale-data(默认 yes):当从节点与主节点断开连接、或正在初次同步时,若设为 yes,从节点仍用旧数据应答读请求;若设为 no,断开期间除少数管理命令外一律返回 MASTERDOWN 错误。对数据一致性要求高的读场景,可设为 no。
数据安全:至少 N 个从节点才允许写
为了避免「主节点在网络分区中孤立后仍在写入、导致从节点数据被丢弃」这类问题,Redis 提供了主节点侧的写保护:
min-replicas-to-write 2
min-replicas-max-lag 10
含义是:只有当至少有 2 个从节点在线、且它们与主节点的延迟都不超过 10 秒时,主节点才接受写命令;否则写请求会被拒绝。这能在脑裂(split-brain)场景下减少数据丢失。代价是牺牲一点可用性,需按业务容忍度权衡。
常见误区
- 误区:复制是同步的,从节点读到的总是最新数据。 错。复制异步,从节点存在毫秒到秒级延迟;强一致读不要依赖从节点。
- 误区:从节点可以随便写。 默认只读,写会报错;强行写还可能因重新同步而被主节点数据覆盖。
- 误区:一主多从会压垮主节点。 全量同步确实消耗主节点资源,但部分重同步很轻;必要时可用级联复制(从节点的从节点)分摊压力。
小结
- 主从复制是 Redis 高可用的基础,提供冗余、读写分离与读扩展能力。
- 用
replicaof(配置)或REPLICAOF(命令)建立复制;用INFO replication/ROLE观测状态。 - 同步分「全量(RDB + 增量)」与「部分重同步(backlog)」两阶段,网络抖动主要靠后者兜底。
- 从节点默认只读,配合
min-replicas-to-write可在分区时保护数据安全。
提示:官方 redis.io 下载页另将 8.8 标注为 “Latest stable”,而 GitHub 上的最新发布 tag 为 8.10.0。二者同属 8.x 系列,复制相关命令(
REPLICAOF、INFO replication)在 8.x 中行为一致,本文以 8.10.0 为基线版本。