Redis 主从复制是其高可用性和数据冗余的关键特性之一,允许数据从一个主节点(Master)自动复制到一个或多个从节点(Slave)。以下是Redis主从复制的核心源码解析:
1. 初始化与配置
- 从节点配置:从节点通过
replicaof
命令(或在配置文件中设置replicaof <master_ip> <master_port>
)指定要复制的主节点。在源码中,该配置会设置到从节点的server
结构体中,触发复制初始化。
2. 同步过程
-
同步初始化:从节点通过定时任务
replicationCron
(在serverCron
函数中调用)检查是否需要与主节点建立连接。一旦确定需要复制,从节点会尝试与主节点建立连接。 -
全量复制(SYNC):
- SYNC命令发送:从节点向主节点发送
SYNC
命令请求全量复制。 - RDB快照:主节点接收到
SYNC
命令后,执行BGSAVE
生成RDB快照文件。在此期间,主节点会将新接收的写操作暂存在内存缓冲区中。 - 数据传输:RDB快照完成后,主节点将快照文件发送给从节点,并随后将内存缓冲区中的写操作也发送过去。
- 数据加载:从节点接收RDB文件并清空现有数据,加载快照恢复数据状态,然后执行接收到的写操作,以达到与主节点一致的状态。
- SYNC命令发送:从节点向主节点发送
-
增量复制(PSYNC):
- 在初次同步之后,从节点会进入持续的增量复制状态。如果从节点断线重连,会尝试使用
PSYNC
命令携带已知的复制偏移量或主节点ID,请求部分同步,避免全量复制。 - 主节点会根据从节点提供的信息判断是否可以进行增量复制,如果可以,则只发送断线期间缺失的数据。
- 在初次同步之后,从节点会进入持续的增量复制状态。如果从节点断线重连,会尝试使用
3. 数据同步与命令传播
- 命令传播:主节点在处理写命令时,不仅执行命令,还会将命令记录到复制缓冲区,并通过复制连接发送给所有已连接的从节点。
- 心跳维持:从节点定期向主节点发送PING命令以检测连接状态,并在心跳包中携带复制偏移量和主节点运行ID,用于故障恢复时快速定位断点。
4. 源码文件与关键函数
- replication.c:包含主从复制的核心逻辑,如连接建立、数据同步、命令传播等。
- server.c:包含服务器生命周期管理,如定时任务
serverCron
,以及与复制相关的配置处理。 - networking.c:处理网络连接和数据传输,包括命令请求和响应。
深入理解Redis主从复制的源码,需要关注上述文件中与复制相关的函数实现,如replicationCron
、replicationFeedSlaves
、syncWithMaster
、psync
等,以及网络通信和事件处理的机制。