📜  从两阶段提交协议(分布式事务)中的故障中恢复

📅  最后修改于: 2021-08-27 07:01:49             🧑  作者: Mango

先决条件:两阶段提交协议
在两阶段提交协议中,参与分布式事务的站点以及在全局范围内管理整个事务的协调器可能会失败或崩溃,这可能会导致整个事务失败。由于如果任何一个站点失败都需要一致才能成功提交分布式事务,因此整个事务都将中止。

两阶段提交协议中可能会遇到以下几种故障:
站点失败如果协调器(C)检测到站点崩溃,则协调器将采取以下措施:

如果站点(Si)在向协调员(C)发出消息之前已失败,则协调器认为该站点已响应消息。
如果在向C发送消息后站点已失败,则协调器将忽略站点故障,并将以通常的方式执行其余提交协议。
当故障站点(Si)从故障中恢复时,该站点将检查其日志记录,以了解事务T的命运。无论是否失败-

  • 如果日志包含记录,在这种情况下,站点将执行
  • 如果日志包含记录,则在这种情况下,站点将执行
  • 一种最重要的情况是,如果日志记录包含,则在这种情况下,站点必须联系协调员(C)。但是,如果C自身发生故障,则在这种情况下,站点(Si)必须查阅相邻站点并检查其日志状态,以了解事务(T)是否已执行或中止。
  • 如果所有站点都无法给出适当的响应,则在这种情况下,站点(Si)必须等待协调器恢复或相邻站点的适当响应。
  • 因此, Si必须通过向其他站点发送查询消息来定期查询事务处理T命运。

如果日志中不包含有关事务T的记录(中止,提交,准备就绪),则我们知道Si在响应Ci的消息之前已失败。因此, Ci必须中止并执行

协调器(Ci)的失败-如果协调器在两阶段提交协议中执行事务T的过程中失败,则参与站点必须确定事务T的命运。在某些情况下,参与站点无法决定是提交还是中止事务T ,因此这些站点必须等待失败的协调器的恢复。

  • 如果所有站点的日志中都包含记录,则必须提交T。
  • 如果所有站点的日志中都包含记录,则T必须中止。
  • 如果某些站点的日志中不包含记录,则失败的协调器(C)无法决定提交/中止,因此该站点无法响应协调器消息。因此,最好中止事务而不是等待。
  • 如果先前的情况均不成立,则所有活动站点的日志中都具有记录,但是由于协调器失败,将找不到其他记录,除非协调器无法确定是否已做出提交/中止的决定(C)恢复。因此,所有站点都必须等待协调器的恢复。这种情况称为阻塞问题。

网络分区-只是一种故障,由于故障,网络连接在分区或节点之间分离。当发生网络分区时,可能发生以下两种情况:

  • 协调器和所有参与站点都保留在一个网络分区中,然后网络故障会影响提交协议。
  • 如果所有参与的站点和协调器都属于两个或多个不同的分区,那么从该站点的角度来看,其分区没有协调器的站点将失败并启动恢复协议,而其他站点将被简单执行,其分区包含协调器和协调器。遵循通常的2PC协议。

参考: 亨利·科思