面试题答案
一键面试故障检测机制
- 心跳检测:
- 主从节点之间会定期发送心跳消息(PING/PONG)。主节点默认每秒向从节点发送PING消息,从节点收到PING后回复PONG。
- 通过这种方式,主从节点可以检测彼此的连接状态。如果主节点在一定时间(默认10秒,可通过
repl-ping-slave-period
配置)内没有收到从节点的PONG回复,就会判定从节点可能出现故障。
- 主观下线(Subjective Down,SDOWN):
- 单个节点对另一个节点的状态判断。例如,哨兵节点(Sentinel)通过心跳检测,如果在一定时间内(可配置)没有收到被监控节点(主节点或从节点)的响应,该哨兵节点会将其标记为SDOWN状态。
- 客观下线(Objective Down,ODOWN):
- 多个哨兵节点达成共识的故障判定。当多个哨兵节点(超过配置的
quorum
数量)都认为某个主节点处于SDOWN状态时,它们会通过互相通信达成共识,将该主节点标记为ODOWN状态,意味着主节点确实发生了故障。
- 多个哨兵节点达成共识的故障判定。当多个哨兵节点(超过配置的
故障转移机制
- 哨兵选举:
- 当主节点被判定为ODOWN后,哨兵之间会进行选举,选出一个领导者哨兵来执行故障转移操作。选举过程基于Raft算法的简化版本。
- 每个哨兵节点都有选举权,它会向其他哨兵节点发送选举请求。收到请求的哨兵节点如果还没有投过票,且认为请求者具备一定条件(如运行时长等),就会投出一票。
- 率先获得超过半数投票的哨兵节点成为领导者哨兵。
- 从节点晋升:
- 领导者哨兵从当前存活的从节点中选择一个作为新的主节点。选择规则主要基于从节点的优先级(通过
slave - priority
配置,值越小优先级越高)、复制偏移量(复制数据越完整优先级越高)以及运行ID(越小越优先)。 - 领导者哨兵会向选中的从节点发送
SLAVEOF NO ONE
命令,使其晋升为新的主节点。
- 领导者哨兵从当前存活的从节点中选择一个作为新的主节点。选择规则主要基于从节点的优先级(通过
- 重新配置其他从节点:
- 领导者哨兵会向其他从节点发送
SLAVEOF <new - master - ip> <new - master - port>
命令,让它们成为新主节点的从节点,从而重新建立复制关系。
- 领导者哨兵会向其他从节点发送
重新同步机制
- 全量同步:
- 当新的从节点连接到主节点,或者从节点长时间与主节点失去连接后重新连接,通常会进行全量同步。
- 主节点收到从节点的同步请求后,会执行
BGSAVE
命令生成RDB文件,并将RDB文件发送给从节点。在发送RDB文件的同时,主节点会将这段时间内产生的写命令缓存起来。 - 从节点收到RDB文件后,会先清空自身数据,然后加载RDB文件,完成数据初始化。接着,从节点接收主节点缓存的写命令并执行,从而达到与主节点数据一致。
- 部分同步:
- 当从节点与主节点之间的连接短暂中断后恢复时,可能会进行部分同步。
- 主从节点之间通过复制偏移量(replication offset)和复制积压缓冲区(replication backlog)来实现部分同步。主节点会在复制积压缓冲区中记录最近一段时间内的写命令。
- 从节点在重新连接时,会向主节点发送自己的复制偏移量。主节点检查复制积压缓冲区,如果从节点的偏移量在缓冲区范围内,主节点就只将缓冲区中从该偏移量之后的写命令发送给从节点,从而实现部分同步,减少数据传输量,快速恢复数据一致性。