面试题答案
一键面试旧版复制功能主从数据同步过程
- 同步初始化:
- 从节点通过
SLAVEOF
命令(或者在配置文件中设置slaveof
相关配置)指定主节点的地址和端口,发起复制请求。 - 主节点收到请求后,为从节点创建相应的数据结构,准备进行数据同步。
- 从节点通过
- 全量同步:
- 步骤一:发送
SYNC
命令:从节点向主节点发送SYNC
命令,请求进行全量同步。 - 步骤二:生成
RDB
文件:主节点收到SYNC
命令后,执行BGSAVE
命令,在后台生成一个RDB
文件,这个文件包含了主节点当前的所有数据。 - 步骤三:发送
RDB
文件和缓冲区数据:主节点将生成的RDB
文件发送给从节点,同时在生成RDB
文件期间,主节点会将新收到的写命令缓存到缓冲区。当RDB
文件发送完毕后,主节点接着将缓冲区中的写命令发送给从节点。 - 步骤四:加载
RDB
文件和执行写命令:从节点收到RDB
文件后,会先清空自身的数据,然后加载RDB
文件,将数据恢复到主节点执行BGSAVE
时的状态。接着从节点执行主节点发送过来的缓冲区中的写命令,使自身数据状态与主节点保持一致。
- 步骤一:发送
- 部分同步(若支持):
- 步骤一:断线重连:如果在同步过程中或同步完成后,从节点与主节点之间的连接断开,从节点重新连接主节点时,会尝试进行部分同步。
- 步骤二:发送
PSYNC
命令:从节点向主节点发送PSYNC
命令(Redis 2.8 之前使用SYNC
命令,2.8 之后使用PSYNC
命令进行部分同步尝试),携带从节点的复制偏移量(记录从节点已经复制的数据量)和主节点的 run ID(标识主节点的唯一 ID)。 - 步骤三:判断是否可以部分同步:主节点收到
PSYNC
命令后,根据从节点发送的 run ID 和复制偏移量判断是否可以进行部分同步。如果主节点保存的 run ID 与从节点发送的一致,且偏移量在主节点的复制积压缓冲区(一个环形缓冲区,记录主节点最近发送的写命令)范围内,则主节点向从节点发送CONTINUE
消息,告知从节点可以进行部分同步。 - 步骤四:部分同步数据:主节点将复制积压缓冲区中从节点缺少的数据发送给从节点,从节点接收并执行这些数据,完成部分同步。如果主节点判断不能进行部分同步(如 run ID 不一致或偏移量超出范围),则主节点会向从节点发送
FULLRESYNC
消息,要求从节点进行全量同步,流程又回到全量同步的步骤。
消息交互
- 从节点 -> 主节点:
SLAVEOF
命令:用于指定主节点,开启复制过程。SYNC
命令(旧版全量同步)或PSYNC
命令(部分同步尝试):请求数据同步。
- 主节点 -> 从节点:
RDB
文件数据:全量同步时发送。- 缓冲区写命令数据:全量同步时,
RDB
文件发送完毕后发送。 CONTINUE
消息:告知从节点可以进行部分同步。FULLRESYNC
消息:告知从节点需要进行全量同步。