面试题答案
一键面试- 主观下线(SDOWN):
- Sentinel节点会定期向其他Redis实例(包括主节点和从节点)发送PING命令来检测其健康状态。如果在一定时间内(由配置项
down - after - milliseconds
决定)没有收到有效回复,Sentinel会将该实例标记为“主观下线”,即认为该实例在当前Sentinel节点视角下已经不可用。
- Sentinel节点会定期向其他Redis实例(包括主节点和从节点)发送PING命令来检测其健康状态。如果在一定时间内(由配置项
- 客观下线(ODOWN):
- 当一个Sentinel节点将主节点标记为SDOWN后,它会向其他Sentinel节点发送
SENTINEL is - master - down - by - addr
命令,询问其他Sentinel节点是否也认为该主节点下线。 - 如果超过配置的
quorum
个Sentinel节点都认为主节点下线(包括当前发起询问的Sentinel节点),那么该主节点会被标记为“客观下线”(ODOWN)。这意味着从多个Sentinel节点的综合判断来看,主节点确实不可用了。
- 当一个Sentinel节点将主节点标记为SDOWN后,它会向其他Sentinel节点发送
- 选举领头Sentinel:
- 当主节点被标记为ODOWN后,各个Sentinel节点会进入领头Sentinel选举阶段。
- Sentinel节点之间通过
SENTINEL is - master - down - by - addr
命令的交互,互相交换自己的配置纪元(一个自增的整数,用于标识选举轮次)和自身的运行ID。 - 每个发现主节点客观下线的Sentinel节点会要求其他Sentinel节点将它选举为领头Sentinel。要求发送的是
SENTINEL ELECT
命令。 - Sentinel节点在接收到
SENTINEL ELECT
命令时,会进行判断:- 如果它还没有投票给其他Sentinel节点,并且要求选举的Sentinel节点的配置纪元大于它当前记录的配置纪元,或者配置纪元相同但要求选举的Sentinel节点的运行ID小于它当前记录的运行ID(运行ID是唯一且固定的,较小的运行ID代表优先级更高),那么它会投票给这个要求选举的Sentinel节点。
- 当一个Sentinel节点获得了超过半数且大于
quorum
的Sentinel节点的投票时,它就会成为领头Sentinel。
- 故障转移:
- 领头Sentinel负责执行故障转移操作。它会从主节点的从节点中挑选一个作为新的主节点,挑选规则包括:
- 首先排除处于下线或断线状态的从节点。
- 选择优先级最高的从节点(优先级由
slave - priority
配置项决定,数值越小优先级越高)。如果多个从节点优先级相同,则选择复制偏移量最大的从节点(即复制数据最完整的从节点)。如果仍然相同,则选择运行ID最小的从节点。
- 领头Sentinel会向选中的从节点发送
SLAVEOF no one
命令,使其成为新的主节点。 - 然后领头Sentinel会向其他从节点发送
SLAVEOF <new - master - ip> <new - master - port>
命令,让它们成为新主节点的从节点。 - 最后,领头Sentinel会更新对主节点和从节点的配置记录,将新主节点的信息同步给其他Sentinel节点。
- 领头Sentinel负责执行故障转移操作。它会从主节点的从节点中挑选一个作为新的主节点,挑选规则包括: