Redis 主从复制的实现原理主要围绕 数据同步机制 和 主从通信流程 展开,其核心目标是实现主节点与从节点之间的数据一致性。以下是详细的实现原理分析:
1. 主从复制的核心流程
主从复制分为三个阶段:建立连接、数据同步、命令传播。
(1)建立连接阶段
- 保存主节点信息:
从节点通过replicaof
(旧版slaveof
)命令指定主节点的 IP 和端口,保存主节点信息(masterhost
和masterport
)。 - 建立 Socket 连接:
从节点主动与主节点建立 TCP 连接,并发送PING
命令测试连接是否正常。 - 身份验证:
如果主节点设置了密码(requirepass
),从节点需通过AUTH
命令进行身份验证。
(2)数据同步阶段
主从节点首次建立连接后,会进行 全量同步 或 增量同步,具体取决于从节点的状态和主节点的运行 ID(runid
)和偏移量(offset
)。
① 全量同步(Full Sync)
- 触发条件:
- 从节点首次连接主节点。
- 从节点请求的
offset
超出主节点的复制缓冲区范围。 - 主节点重启导致
runid
变化。
- 同步过程:
- 从节点发送
PSYNC ? -1
:
表示请求全量同步(?
表示未知主节点runid
,-1
表示未知偏移量)。 - 主节点生成 RDB 文件:
主节点调用BGSAVE
命令异步生成当前数据的 RDB 快照文件(不阻塞主线程)。 - 传输 RDB 文件:
主节点将 RDB 文件发送给从节点,从节点清空本地数据并加载 RDB 文件。 - 同步缓冲区数据:
在 RDB 文件生成期间,主节点会将所有写操作记录到 复制缓冲区(repl_backlog
)。RDB 传输完成后,主节点将缓冲区中的写命令发送给从节点,确保数据一致性。 - 从节点确认同步完成:
从节点发送REPLCONF ACK
消息确认同步完成。
- 从节点发送
② 增量同步(Partial Resync)
- 触发条件:
从节点断线后重新连接,且断线期间的数据变更在主节点的复制缓冲区内。 - 同步过程:
- 从节点发送
PSYNC <runid> <offset>
:
使用主节点的runid
和当前偏移量请求增量同步。 - 主节点检查缓冲区:
如果从节点的offset
在复制缓冲区范围内,主节点将缓冲区中缺失的写命令发送给从节点。 - 从节点执行增量命令:
从节点直接执行接收到的写命令,无需重新加载 RDB 文件。
- 从节点发送
(3)命令传播阶段
- 实时同步写操作:
主节点将每次写操作的命令(如SET
、INCR
)以 Redis 协议格式 发送给所有从节点。 - 异步复制:
主从节点之间的数据同步是异步的,主节点不会等待从节点确认,因此可能存在短暂的数据延迟。
2. 关键技术细节
(1)PSYNC 命令
- 作用:
Redis 2.8 引入的PSYNC
命令替代了旧版的SYNC
,支持 全量同步 和 增量同步。 - 语法:
PSYNC <runid> <offset>
runid
:主节点的唯一标识(每次重启会变化)。offset
:从节点的复制偏移量(表示已接收的字节数)。
(2)复制缓冲区(Repl Backlog)
- 作用:
主节点维护一个固定大小的环形缓冲区(默认 1MB),用于存储最近的写命令。 - 作用场景:
当从节点断线后重新连接时,主节点通过缓冲区提供增量数据,避免全量同步。
(3)偏移量(Offset)
- 主节点偏移量:
记录主节点已发送的字节数(每发送一条命令,偏移量递增)。 - 从节点偏移量:
记录从节点已接收的字节数,用于判断是否需要增量同步。
(4)运行 ID(RunID)
- 作用:
每个 Redis 实例启动时生成唯一的runid
,用于标识主节点身份。 - 场景:
如果从节点请求的runid
与主节点当前runid
不匹配,则触发全量同步。
3. 主从复制的拓扑结构
- 一主多从:
一个主节点可以有多个从节点,适用于读写分离场景。 - 链式复制(级联复制):
从节点可以作为其他从节点的主节点,减轻主节点压力(如A → B → C
)。 - 反客为主(Promote to Master):
当主节点宕机后,从节点可通过SLAVEOF NO ONE
升级为主节点(需配合哨兵或集群模式使用)。
4. 主从复制的优势与局限性
优势
- 读写分离:
主节点负责写操作,从节点负责读操作,提升系统吞吐量。 - 高可用性:
主节点宕机后,从节点可接管服务(需配合哨兵或集群模式)。 - 数据备份:
从节点可作为主节点的热备份,防止数据丢失。
局限性
- 异步复制:
主从节点间存在数据延迟,可能导致短暂不一致。 - 全量同步开销:
首次同步或断线后全量同步时,主节点生成 RDB 文件会占用内存和网络带宽。 - 单点故障:
主节点宕机后,需手动切换或依赖哨兵自动处理。
5. 示例代码
配置从节点
# 修改配置文件(持久化)
replicaof 192.168.1.100 6379
# 动态配置(无需重启)
redis-cli -h 192.168.1.101 -p 6380 replicaof 192.168.1.100 6379
验证主从状态
# 在从节点执行
redis-cli -h 192.168.1.101 -p 6380 info replication
总结
Redis 主从复制的核心是通过 全量同步 + 增量同步 保证数据一致性,结合 PSYNC 命令 和 复制缓冲区 实现高效的数据传播。其设计兼顾性能与可靠性,是 Redis 高可用架构(如哨兵、集群)的基础。理解其原理有助于优化主从部署和排查同步问题。
THE END