面试题答案
一键面试3PC确保数据一致性原理
- 引入预提交阶段:3PC在2PC的基础上增加了预提交(PreCommit)阶段。在CanCommit阶段,协调者询问参与者是否可以执行事务操作,参与者反馈自身状态。进入PreCommit阶段,若所有参与者都回复可以操作,协调者发送预提交请求,参与者执行事务操作但不提交,等待最终的提交或回滚指令。这种设计通过预提交阶段增加了缓冲,在一定程度上减少了参与者在网络分区下的阻塞时间,从而有助于确保数据一致性。
- 超时机制:3PC 引入了超时机制。参与者在等待协调者指令时,如果超过一定时间未收到指令,会根据自身所处阶段进行相应处理。这避免了参与者因长时间等待协调者指令而造成的数据不一致问题。例如在PreCommit阶段等待最终提交指令超时,参与者可能会根据本地策略决定提交或回滚事务。
不同网络分区场景下3PC各阶段问题及应对措施
- CanCommit阶段
- 问题:
- 协调者与部分参与者网络分区:协调者无法收到这部分参与者的响应,导致无法准确判断是否可以进入下一阶段。
- 参与者之间网络分区:可能会出现部分参与者已收到CanCommit请求并回复,而另一部分未收到的情况,使得系统状态不一致。
- 应对措施:
- 协调者方面:协调者设置超时时间,若在超时时间内未收到所有参与者的响应,则中断事务,向所有已回复的参与者发送回滚指令。
- 参与者方面:若参与者在合理时间内未收到CanCommit请求,可主动询问协调者当前事务状态。
- 问题:
- PreCommit阶段
- 问题:
- 协调者与部分参与者网络分区:这部分参与者收不到PreCommit请求,而其他参与者已进入预提交状态,可能导致数据不一致。
- 协调者故障:新的协调者选举过程中,已预提交的参与者处于等待状态,可能出现长时间阻塞。
- 应对措施:
- 对于未收到PreCommit请求的参与者:设置超时时间,超时后主动询问协调者。若协调者无响应,可根据本地策略决定回滚事务。
- 针对协调者故障:快速进行协调者选举,新协调者通过日志等机制了解事务当前状态,向各参与者发送相应指令(提交或回滚)。
- 问题:
- DoCommit阶段
- 问题:
- 协调者与部分参与者网络分区:已收到DoCommit请求的参与者提交事务,而未收到的参与者保持预提交状态,造成数据不一致。
- 网络时断时续:可能导致部分参与者重复收到DoCommit请求,出现重复提交问题。
- 应对措施:
- 对于未收到DoCommit请求的参与者:设置超时时间,超时后询问协调者。若协调者无响应,可根据本地事务日志判断是否已提交,若未提交则回滚。
- 针对重复提交问题:参与者通过事务日志和唯一事务ID进行判断,若接收到重复的DoCommit请求且事务已提交,则忽略该请求。
- 问题: