Redis主从复制机制中的主从握手流程是一个关键步骤,用于建立两者间的通信和数据同步关系。以下是Redis主从握手的源码解析概要:
主从握手流程
-
从节点初始化连接:从节点启动后,会主动连接主节点。这个过程通常是通过从节点的配置直接指定主节点的地址(IP和端口),或者通过
REPLICAOF
命令动态指定。 -
发送PSYNC命令:连接建立后,从节点首先向主节点发送
PSYNC
命令。这个命令携带了从节点的信息,包括复制ID(replication ID)和复制偏移量(replication offset)。 -
主节点响应:
- 增量同步:如果从节点提供的复制ID和偏移量有效,且主节点支持增量同步,主节点将回复
+CONTINUE
,随后开始发送从复制偏移量之后的数据给从节点。 - 全量同步:如果从节点提供的复制ID无效或偏移量与主节点数据不匹配(如初次复制或复制中断后重新同步),主节点会回复
+FULLRESYNC
,后面跟着新的复制ID和一个RDB文件的校验和。之后,主节点会启动一个后台进程生成RDB文件,并将其发送给从节点,从节点接收并载入RDB文件以完成全量数据同步。
- 增量同步:如果从节点提供的复制ID和偏移量有效,且主节点支持增量同步,主节点将回复
-
握手完成与数据同步:无论增量还是全量同步,从节点在收到数据后,会根据同步的数据更新自己的状态,并开始持续监听主节点,接收后续的写操作命令(通过
command
或lua
脚本产生的写操作),以维持数据的一致性。
关键源码位置
- replication.c:这个文件是Redis复制功能的主要实现,包含了处理
PSYNC
命令、主从同步、复制状态机等逻辑。 - networking.c:虽然不是专门针对复制,但它处理网络连接和命令的收发,是握手过程中的基础。
实现细节
- 握手协议兼容性:握手过程中,Redis会考虑协议的版本兼容性,确保老版本的从节点也能正确同步。
- 心跳与断线重连:除了初始的握手,主从之间还会有心跳机制维护连接,一旦连接中断,从节点会尝试重新连接并重新发起握手流程。
- 异步复制:Redis的复制是异步的,主节点在发送完命令给从节点后不会等待确认,这种设计有利于保持低延迟,但可能会导致短暂的数据不一致。
深入理解Redis主从握手,需关注上述源码文件中的具体实现逻辑,特别是replication.c
中的握手处理流程,以及如何根据不同的同步需求选择合适的同步策略。