首页 / Redis 入门教程 / 26. 主从复制 Replication

Redis 入门教程

26. 主从复制 Replication

本教程共 40 篇 · 第 26 篇 · 更新于 2026-08-02

Replication主从复制读写分离replicaof高可用数据同步

26. 主从复制 Replication

当单机 Redis 的性能和容量不足以支撑业务,或者你希望为数据增加一份冗余以防单点故障时,主从复制(Replication) 是最基础、最常用的方案。它让一个 Redis 节点(从节点 / replica)成为另一个节点(主节点 / master)的精确副本,主节点的写入会自动同步到从节点。

主从复制是 Redis 高可用体系的基石:第 27 章的哨兵、第 28/29 章的集群,底层都依赖复制。码上学先把复制的原理和配置讲透。

本节目标

  • 理解主从复制的拓扑与作用(冗余、读写分离、水平扩展读)。
  • 掌握两种开启复制的方式:配置文件 replicaof 与命令 REPLICAOF
  • 理解全量同步与部分重同步(PSYNC)的过程。
  • 会用 INFO replicationROLE 观察复制状态。
  • 了解只读副本与数据安全相关配置(replica-read-onlymin-replicas-to-write)。

复制的基本拓扑

一个主节点(master)可以有多个从节点(replica);从节点自己也可以再有从节点(级联复制 / 树状复制),从而减轻主节点的同步压力。典型用途有三个:

  1. 数据冗余:从节点是主节点的热备份,主节点宕机时从节点仍有完整数据。
  2. 读写分离:写请求走主节点,读请求分摊到多个从节点,提升整体读吞吐。
  3. 灾备与运维:可以在从节点上做 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 起官方逐步将术语改为 replicaSLAVEOF 仍作为兼容别名存在。新代码请统一使用 REPLICAOF

同步过程:全量同步与部分重同步

当从节点首次连接主节点,或从节点落后太多时,会触发全量同步(full resync)

  1. 从节点向主节点发送 PSYNC 请求。
  2. 主节点执行 BGSAVE 生成 RDB 快照,同时把生成期间的写命令缓存进复制积压缓冲区(replication backlog)
  3. 主节点把 RDB 文件传给从节点,从节点清空旧数据并加载 RDB。
  4. 主节点再把 backlog 里的增量写命令发送给从节点,完成对齐。

如果连接短暂断开后重连,且从节点落后的偏移量仍在主节点的 backlog 范围内,则触发部分重同步(partial resync):主节点只需把断开期间丢失的那段命令补发给从节点,无需再传整个 RDB。这大大降低了网络抖动带来的开销。

你可以通过 INFO replication 观察相关字段,例如 repl_backlog_size(积压缓冲区大小)、master_repl_offsetslave_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 系列,复制相关命令(REPLICAOFINFO replication)在 8.x 中行为一致,本文以 8.10.0 为基线版本。