两阶段提交

在一个原子操作中更新多个节点上的资源

问题

当数据需要在多个集群节点上原子存储时,节点在知道其他集群节点的决定之前,不能使数据对客户端可用。每个节点都需要知道其他节点是否成功存储了数据,或者是否失败。

解决方案

毫不奇怪,两阶段提交的本质是它分两个阶段执行更新。

  1. 准备阶段询问每个节点是否可以承诺执行更新。
  2. 提交阶段实际上执行了更新。

作为准备阶段的一部分,参与事务的每个节点都会获取它需要确保它能够在第二阶段执行提交的任何东西——例如,任何所需的锁。一旦每个节点能够确保它能够在第二阶段提交,它就会让协调器知道,向协调器承诺它能够并且将在第二阶段提交。如果任何节点无法做出承诺,那么协调器会告诉所有节点回滚,释放它们持有的任何锁,并且事务被中止。只有当所有参与者都同意继续时,第二阶段才会开始——此时,预计它们都将成功更新。对于每个参与者来说,使用类似于预写日志的模式来确保其决定的持久性至关重要。这意味着即使节点崩溃并随后重新启动,它也应该能够完成协议而没有任何问题。

有关更多详细信息,请访问第 21 章,该章节位于 oreilly.com 上的在线电子书中。

此模式是分布式系统模式的一部分。

2023 年 11 月 23 日