面试题答案
一键面试- 旧版(Redis 2.8 之前):
- 网络中断后恢复,主从节点会进行全量同步。主节点将所有数据生成 RDB 文件发送给从节点,从节点丢弃旧数据,加载主节点发送的 RDB 文件进行数据同步。这种方式在网络短暂中断时,即使只有少量数据变化,也会导致大量数据传输,效率较低。
- 新版(Redis 2.8 及之后):
- 偏移量(offset)与复制积压缓冲区(replication buffer):
- 主节点维护一个复制积压缓冲区,这是一个固定长度的先进先出(FIFO)队列。主节点在向从节点同步数据时,会同时将数据写入复制积压缓冲区,并记录当前的复制偏移量(offset)。从节点在正常同步数据时,也会记录自己的复制偏移量。
- 部分同步的触发:
- 当网络中断恢复后,从节点向主节点发送
PSYNC
命令,带上自己之前记录的偏移量。
- 当网络中断恢复后,从节点向主节点发送
- 主节点判断:
- 主节点收到
PSYNC
命令及从节点的偏移量后,会检查复制积压缓冲区。如果从节点的偏移量在复制积压缓冲区的范围内,说明主节点可以通过复制积压缓冲区获取从节点丢失的数据。 - 主节点会从复制积压缓冲区中提取从节点缺失的数据部分,发送给从节点,这就是部分数据同步。同时,主节点和从节点更新偏移量。
- 主节点收到
- 全量同步情况:
- 如果从节点的偏移量不在复制积压缓冲区范围内,比如从节点是新加入的或者网络中断时间过长,复制积压缓冲区中已没有从节点缺失的数据,主节点会进行全量同步,重新生成 RDB 文件发送给从节点。
- 偏移量(offset)与复制积压缓冲区(replication buffer):