面试题答案
一键面试- 主观下线(SDOWN):
- Sentinel节点会定期向主节点和从节点发送PING命令来检测其健康状态。当某个Sentinel节点在一定时间(可配置,默认30秒)内连续多次未收到主节点的有效回复时,该Sentinel节点会将主节点标记为“主观下线”(Subjectively Down,简称SDOWN)。这只是单个Sentinel节点的判断,并不意味着主节点真的不可用。
- 客观下线(ODOWN):
- 当一个Sentinel节点将主节点标记为SDOWN后,它会向其他Sentinel节点发送
SENTINEL is - master - down - by - addr
命令,询问其他Sentinel节点对主节点状态的判断。 - 如果在一定时间内,超过指定数量(可配置,一般为Sentinel节点总数的半数以上)的Sentinel节点都认为主节点处于下线状态,那么该主节点就会被标记为“客观下线”(Objectively Down,简称ODOWN)。这表明主节点确实发生了故障,需要进行故障转移。
- 当一个Sentinel节点将主节点标记为SDOWN后,它会向其他Sentinel节点发送
- 选举领导者Sentinel:
- 当主节点被标记为ODOWN后,Sentinel集群需要选举出一个领导者Sentinel节点来执行故障转移操作。选举过程如下:
- 每个发现主节点客观下线的Sentinel节点都有资格成为领导者。
- 这些Sentinel节点会向其他Sentinel节点发送
SENTINEL is - master - down - by - addr
命令,并带上自己的选举票数。 - 其他Sentinel节点在接收到这些命令后,会根据一定的规则(如先到先得,且每个Sentinel节点只能投一票)进行投票。
- 当某个Sentinel节点获得超过半数以上(且大于等于配置的quorum值)的选票时,它就会被选举为领导者Sentinel节点。
- 当主节点被标记为ODOWN后,Sentinel集群需要选举出一个领导者Sentinel节点来执行故障转移操作。选举过程如下:
- 选择新的主节点:
- 领导者Sentinel节点开始从该主节点的从节点中选择一个作为新的主节点。选择规则如下:
- 过滤掉处于主观下线或断线状态的从节点。
- 过滤掉最近5秒内没有回复过领导者Sentinel节点INFO命令的从节点。
- 过滤掉与已下线主节点连接断开超过指定时长(down - after - milliseconds配置的时长的10倍)的从节点。
- 优先选择优先级最高的从节点(可通过
slave - priority
配置,数值越低优先级越高)。 - 如果优先级相同,则优先选择复制偏移量最大(即数据最完整)的从节点。
- 如果复制偏移量也相同,则选择运行ID最小的从节点。
- 领导者Sentinel节点开始从该主节点的从节点中选择一个作为新的主节点。选择规则如下:
- 故障转移操作:
- 领导者Sentinel节点向选中的从节点发送
SLAVEOF no one
命令,将其提升为新的主节点。 - 领导者Sentinel节点向其他从节点发送
SLAVEOF <new - master - ip> <new - master - port>
命令,让它们成为新主节点的从节点,开始复制新主节点的数据。
- 领导者Sentinel节点向选中的从节点发送
- 配置更新:
- 领导者Sentinel节点更新自身关于主节点和从节点的配置信息,记录新的主节点地址和端口等信息。
- 领导者Sentinel节点向其他Sentinel节点发送
SENTINEL set <master - name> <config - option> <value>
命令,通知其他Sentinel节点更新主节点的配置信息。 - 各个Sentinel节点会将新的配置信息持久化到本地的配置文件中,以便在重启后仍然能够使用最新的配置。同时,客户端连接的Sentinel节点也会将新的主节点信息返回给客户端,客户端可以根据这些信息重新连接到新的主节点,从而完成整个故障转移过程。