知识卡片
三段式提交如何改善单点问题却未解决一致性风险
内容
三段式提交(3PC)是针对[[两段式提交的两阶段流程与三大缺陷]]中单点问题和 准备阶段性能问题的改进:把原来的准备阶段一分为二——先加一轮CanCommit “询问阶段”(协调者只是问各参与者”评估一下这事能不能成”,不锁资源、不写 重做日志),得到普遍正面回应后才进入真正加锁写日志的PreCommit阶段,最后 是DoCommit阶段。加这一轮询问的意义在于:原来一旦进入准备阶段就要立即 锁资源写日志,如果最后有参与者说不行,前面全体都白做了;现在先低成本 问一轮,成功率大的把握下才进入重负载的准备操作,事务需要回滚时的性能因此 明显改善。同时,3PC还改变了协调者宕机后的默认策略:如果参与者在PreCommit 之后一直没等到DoCommit指令,默认选择直接提交而非等待或回滚,这就避免了 2PC里”参与者只能死等协调者”的单点风险。但3PC并没有解决一致性风险,反而 可能更糟——如果协调者发出的其实是Abort指令,却因网络问题部分参与者超时 没收到,这些参与者会按”默认提交”的策略错误地提交事务,制造出参与者之间 数据不一致的新问题,而且事务能正常提交的场景下3PC比2PC还多一轮询问, 性能更差。
参考来源
- 位置:《凤凰架构:构建可靠的大型分布式系统》第3章"事务处理"3.2节
"全局事务"(源文件:_epub-src对应OEBPS/Text/chapter28.xhtml)
- 结论依据:原文说明3PC新增CanCommit询问阶段降低回滚场景的重复代价,
并指出PreCommit后协调者宕机时参与者默认选择提交以避免单点问题,同时
明确"3PC对一致性风险问题并未有任何改进,甚至是略有增加",直接支撑
本卡片结论。
- 原始内容:从以上过程可以看出,三段式提交对单点问题和回滚时的性能问题
有所改善,但是对一致性风险问题并未有任何改进,甚至是略有增加。譬如,
进入PreCommit阶段之后……有部分参与者直至超时都未能收到协调者的Abort
指令的话,这些参与者将会错误地提交事务。