面试题答案
一键面试1. 网络分区异常处理
- 协调者视角:
- 分区内协调者正常:若协调者所在分区网络正常,它应持续尝试向处于其他分区的参与者发送消息。例如,设置重试机制,每次重试间隔一定时间(如指数退避策略,初始间隔1秒,每次翻倍),直到达到最大重试次数(如10次)。若仍无法与部分参与者通信,协调者应标记这些参与者为疑似故障,并向本分区内的参与者发送预提交消息,若本分区内所有参与者预提交成功,则进入提交阶段;若有参与者预提交失败,则进入回滚阶段。
- 协调者所在分区网络故障:当协调者所在分区出现网络故障,协调者可在本分区内选举备用协调者(若有备份机制)。新的协调者需要重新发起2PC流程,向所有参与者发送预提交消息,重新进行两轮提交。
- 参与者视角:
- 分区内参与者正常:若参与者所在分区网络正常且收到协调者的预提交消息,应正常执行预提交操作,如锁定资源、记录日志等。若在等待协调者进一步指令过程中网络分区恢复,根据协调者最终指令进行提交或回滚。若在等待过程中网络分区未恢复,且达到一定超时时间(如30秒),参与者可主动向协调者所在分区发送状态查询消息(若网络允许),以确认后续操作。
- 参与者所在分区网络故障:当参与者所在分区出现网络故障,参与者应在本地记录当前事务状态(预提交成功与否)。待网络恢复后,主动向协调者汇报自身状态,若预提交成功,等待协调者指令进行提交或回滚;若预提交失败,直接进行本地回滚操作。
2. 节点故障异常处理
- 协调者故障:
- 故障发生在预提交阶段前:若协调者在发送预提交消息前故障,系统可通过选举机制选出新的协调者(如基于Raft或Paxos算法)。新协调者重新发起2PC流程,向所有参与者发送预提交消息。
- 故障发生在预提交阶段后:协调者在收到部分或全部参与者的预提交响应后故障。此时新选举出的协调者需从参与者处收集预提交状态。可通过广播消息要求所有参与者回复预提交状态,根据多数参与者的状态决定后续操作。若多数参与者预提交成功,则新协调者发起提交操作;若多数参与者预提交失败,则发起回滚操作。
- 参与者故障:
- 故障发生在预提交阶段:若参与者在收到预提交消息但未完成预提交操作时故障,其他参与者不受影响继续执行流程。协调者等待故障参与者恢复(设置一定等待时间,如2分钟),若超时未恢复,协调者根据其他参与者预提交结果决定后续操作。若其他参与者均预提交成功,协调者可尝试再次向故障参与者发送预提交消息(若故障恢复),若仍失败,则可考虑忽略该参与者(在某些允许部分提交的场景下),进行提交操作;若有其他参与者预提交失败,则直接发起回滚操作。
- 故障发生在预提交完成后:参与者预提交成功后故障,协调者同样等待其恢复。若在提交阶段故障参与者未恢复,协调者可向其他参与者发送提交消息,同时标记故障参与者状态。待故障参与者恢复后,协调者向其补发提交或回滚指令。
3. 一致性保障策略
- 日志记录:
- 协调者和参与者都应记录详细的事务日志。协调者记录事务发起、预提交、提交/回滚等关键步骤及对应参与者响应;参与者记录预提交、提交/回滚操作及本地事务状态变化。日志采用持久化存储(如磁盘),确保故障恢复后可依据日志恢复事务状态。
- 定期同步:
- 协调者和参与者定期同步事务状态。例如,每隔一定时间间隔(如5分钟),参与者向协调者发送自身事务状态报告,协调者汇总所有参与者状态,检查是否存在不一致情况。若发现不一致,及时采取措施纠正,如重新发送指令或要求参与者重新汇报状态。
- 最终一致性检查:
- 在系统空闲时段(如凌晨业务低谷期),执行最终一致性检查。通过遍历所有参与者的事务记录,与协调者记录对比,找出不一致事务并进行修复。修复方式可根据具体情况重新执行2PC流程或手动干预调整数据状态。