面试题答案
一键面试故障检测
- 心跳检测:
- MySQL 组复制使用组通信协议(如 Paxos 相关协议的变体)来实现节点间的心跳检测。每个节点定期向组内其他节点发送心跳消息。
- 例如,节点 A 定时向节点 B、C 等发送心跳,这些心跳消息包含节点自身的状态等信息。
- 成员关系监测:
- 组内节点维护着一个成员关系视图,记录组内所有节点的状态。当一个节点没有按时收到某个节点的心跳时,它会将该节点标记为疑似故障节点。
- 比如,节点 B 未在规定时间内收到节点 D 的心跳,B 就会在本地视图中将 D 标记为疑似故障。
- 共识机制判定:
- 当有节点标记某个节点疑似故障后,组内会通过共识算法(如 Raft 类似机制)来确定该节点是否真的故障。
- 各个节点会交换关于疑似故障节点的信息,经过投票等过程,如果多数节点都认为该节点故障,那么就判定该节点为故障节点,并将其从成员关系视图中移除。
恢复复制组正常运行
- 重新选举主节点(如果必要):
- 如果故障节点是主节点,组内会触发主节点选举流程。
- 剩余节点根据一定的选举规则(如节点优先级、日志同步进度等)进行选举。例如,节点 E 和 F 竞争主节点,E 的优先级高且日志同步更完整,那么 E 会被选举为新的主节点。
- 数据同步:
- 故障节点恢复后(如果恢复),新的主节点会协调将其状态同步到与组内其他节点一致。
- 这可能涉及从主节点拉取缺失的二进制日志并应用,使故障恢复节点的数据与组内其他节点保持一致。例如,故障恢复的节点 G 从新主节点 E 拉取在其故障期间产生的日志并回放,以达到数据同步。
- 重新加入组:
- 故障恢复节点在完成数据同步后,会尝试重新加入复制组。
- 它向组内节点发送加入请求,组内节点通过共识机制决定是否允许其加入。如果通过,该节点就重新成为复制组的一员,复制组恢复到正常运行状态。