Redis作为一个内存数据库,通过主从复制来保持数据的高可用性是十分必要的。本节将深入介绍其主从同步的核心原理与实现细节。
1. 核心原理
主从复制主要基于以下机制实现:
- 数据同步:从节点通过复制主节点的数据副本,实现数据冗余和高可用。
- 异步复制:默认采用异步方式,主节点在写入数据后立即响应客户端,同时将写命令传播给从节点。
- 全量同步 + 增量同步:根据从节点的状态,Redis 会自动选择全量或增量方式同步数据。
2. 工作流程
(1)建立连接
- 从节点执行
SLAVEOF <master_ip> <master_port> 或配置 slaveof 指令,向主节点发起连接请求。
- 从节点与主节点建立 Socket 连接,用于后续的命令与数据传输。
(2)数据同步阶段
Redis 根据从节点的复制偏移量决定同步方式:
a) 全量同步(Full Resynchronization)
触发条件:
- 从节点首次连接主节点。
- 从节点的复制偏移量不在主节点的复制积压缓冲区中。
流程:
- 从节点发送
PSYNC 命令请求同步。
- 主节点执行
BGSAVE 在后台生成 RDB 快照文件,同时将生成期间接收到的写命令缓存到复制缓冲区。
- 主节点将 RDB 文件发送给从节点,从节点清空自身旧数据并加载 RDB 快照。
- 主节点发送缓冲区的写命令,从节点执行这些命令以追上主节点的最新状态。
b) 增量同步(Partial Resynchronization)
触发条件:
- 从节点与主节点网络短暂中断后重连。
- 从节点的复制偏移量仍存在于主节点的复制积压缓冲区中。
流程:
- 从节点发送
PSYNC 命令,并携带上次复制记录的偏移量。
- 主节点比对偏移量,将积压缓冲区中从该偏移量之后的所有写命令发送给从节点。
- 从节点执行这些命令,从而快速追上主节点数据。
3. 核心概念
(1)复制偏移量(Replication Offset)
- 主节点和从节点各自维护一个偏移量,记录已复制/接收的数据字节数。
- 每次主节点向从节点传播 N 字节数据时,双方偏移量都增加 N。
- 通过对比主从偏移量,可以判断数据的一致性。
(2)复制积压缓冲区(Replication Backlog)
- 主节点维护的一个固定大小的循环缓冲区(默认 1MB)。
- 用于保存最近传播的写命令,是增量同步的关键。
- 若从节点的偏移量仍在缓冲区范围内,则进行增量同步;否则触发全量同步。
(3)服务器运行 ID(Run ID)
- 每个 Redis 节点启动时都会生成一个唯一的 Run ID。
- 从节点会记录主节点的 Run ID,用于判断主节点是否发生了变更(例如主节点重启后 Run ID 改变会触发全量同步)。
4. 命令传播阶段
- 完成初始数据同步后,主节点进入命令传播阶段,持续将接收到的写命令异步发送给所有从节点。
- 从节点接收并执行相同的命令,以保持数据的实时同步。
5. 主从拓扑结构
- 一主一从:结构简单,适用于数据备份或基础的读写分离场景。
- 一主多从:适用于读多写少的场景,读请求可以在多个从节点上负载均衡。
- 树状结构(链式复制):从节点可以进一步作为其他节点的主节点,形成级联复制,有助于减轻顶层主节点的复制压力。
6. 重要配置参数
# 主节点相关配置
repl-backlog-size 1mb # 复制积压缓冲区大小
repl-backlog-ttl 3600 # 缓冲区保留时间(秒)
min-slaves-to-write 1 # 至少 N 个从节点在线才接受写操作
min-slaves-max-lag 10 # 从节点延迟不超过 N 秒
# 从节点相关配置
slave-read-only yes # 从节点只读(默认)
repl-diskless-sync no # 是否使用无盘复制(通过网络直接传输 RDB)
|