1. RDB 快照同步
触发条件
当一个从节点启动并连接到主节点,或者从节点与主节点断开连接一段时间后重新连接,且主节点判断需要进行全量同步时,就会触发 RDB 快照同步。从节点向主节点发送 PSYNC 命令(Redis 2.8 及以后版本)来请求同步。
详细步骤
- 主节点生成 RDB 文件:主节点接收到从节点的同步请求后,会执行
BGSAVE命令。BGSAVE会在后台 fork 一个子进程,由子进程负责将当前内存中的数据以 RDB 文件的形式持久化到磁盘上。在生成 RDB 文件的过程中,主节点会继续处理客户端的写请求,并将这些写请求缓存在内存中。 - 发送 RDB 文件:主节点完成 RDB 文件的生成后,会将该文件发送给从节点。从节点接收到 RDB 文件后,会先清空自己当前的数据库,然后将 RDB 文件加载到内存中,这样从节点就拥有了与主节点在生成 RDB 文件那一刻相同的数据状态。
- 处理缓存命令:主节点在发送 RDB 文件期间缓存的写命令,会在 RDB 文件发送完成后发送给从节点,从节点执行这些命令,进一步保证数据的一致性。
2. AOF 命令传播(增量同步)
基本原理
在完成 RDB 快照同步后,主从节点之间的数据基本一致,但主节点后续还会不断接收新的写请求。为了保持主从节点数据的实时一致性,主节点会将新接收到的写命令实时地传播给从节点,这一过程类似于 AOF(Append - Only File)持久化机制中记录写命令到 AOF 文件的操作,只不过这里是将命令发送给从节点。
详细步骤
- 主节点记录写命令:主节点在处理每一个写操作时,会将相应的写命令记录下来。这些命令会先存储在复制积压缓冲区(replication backlog buffer)中,该缓冲区是一个固定大小的先进先出队列。
- 从节点请求增量数据:从节点会定期向主节点发送
PSYNC命令,并携带自己当前的复制偏移量(replication offset)。这个偏移量表示从节点已经同步到的位置。 - 主节点发送增量命令:主节点接收到从节点的请求后,会根据从节点的复制偏移量,从复制积压缓冲区中找出从该偏移量开始的所有写命令,并将这些命令发送给从节点。
- 从节点执行命令:从节点接收到主节点发送的增量写命令后,会依次执行这些命令,从而将自己的数据状态更新到与主节点一致。
966

被折叠的 条评论
为什么被折叠?



