0

我试图推理保证同步数据源的系统/框架可以采取的故障恢复操作。我一直无法找到关于 Narayana 恢复机制的明确解释。

Q1:Narayana 是否本质上采用两阶段提交来确保跨 2 个数据源的分布式事务?

Q2:有人可以解释 Narayana 在这种情况下的行为吗?

  1. 应用程序想要将 X 保存到 2 个数据存储
  2. Narayana 的事务管理器 (TM) 生成事务 ID 并将信息写入磁盘
  3. TM 现在向两个数据存储发送一条准备消息
  4. 每个数据存储都以 prepare_success 响应
  5. TM 更新本地事务日志并向两个数据存储发送提交消息
  6. TM 失败(永久)。并且由于网络上的丢包,只有一个数据存储接收到提交消息。但其他数据存储接收并成功处理提交消息。

这两个数据存储现在彼此不同步(一个源具有另一个源中不存在的附加事务)。

启动新 TM 时,它无法访问旧的事务状态记录。因此,TM 无法在其中一个数据存储中启动丢失事务的恢复。

那么 2PC/Narayana/XA 如何声称他们保证分布式事务可以保持 2 个数据存储同步呢?从我的角度来看,他们只能以非常高的概率保持同步数据存储,但他们不能保证。

Q3:另一种情况,我不清楚应用程序/框架的行为。考虑以下交错事务(都在同一记录上 - 或至少具有部分重叠的记录集):

  • Di = 数据源 i
  • Ti = 事务 i
  • Pi = 为事务 i 准备消息

D1接收P1;响应 P1_success

D2接收P2;响应 P2_success

D1接收P2;响应 P2_failure

D2接收P1;响应 P1_failure

网络数据包到达不同数据源的顺序可以决定哪个准备请求成功。这是否意味着有争议的记录在高交易速度下 - 所有交易都可能会继续失败(直到记录经历较低的交易请求率)?

有人可能会争辩说,我们选择的是一致性而不是可用性,但与 ACID 系统不同,不能保证至少有一个事务会成功(从而避免潜在的长期死锁)。

4

1 回答 1

1

我会向您推荐我关于 Narayana 2PC 如何工作的文章 https://developer.jboss.org/wiki/TwoPhaseCommit2PC

对您的问题

Q1:您已经在评论中提到过——是的,Narayana 使用 2PC = Narayana 实现了 XA 规范(pubs.opengroup.org/onlinepubs/009680699/toc.pdf)。

Q2:场景中的步骤不准确。Narayana 在调用准备时写入磁盘,而不是在事务启动时写入。

  1. 应用程序将 X 保存到 2 个数据存储
  2. TM 现在向两个数据存储发送一条准备消息
  3. 每个数据存储都以 prepare_success 响应
  4. TM 将有关准备好的事务及其 ID 的信息永久保存到事务日志存储中
  5. TM 向两个数据存储发送提交消息
  6. ...

我不同意 2PC 声称保证保持 2 个数据存储同步。我也想知道这个(例如在这里问https://developer.jboss.org/message/954043)。2PC 声称保证 ACID 特性。让 2 个存储同步是 CAP 一致性的意义所在。

在此 Narayana 严格依赖于特定资源管理器(数据存储或数据存储的 jdbc 驱动程序)的能力。ACID 声明

  • 原子性 - 整个事务被提交或回滚(没有信息发生时,没有关于同步资源的信息)
  • 一致性 - 在事务结束之前和结束时系统处于一致状态
  • 耐用性 - 即使发生崩溃,也会存储所有内容
  • 隔离 - (棘手的一个,放在最后) - 作为 ACID,我们必须是可序列化的。那就是你可以观察“一个接一个”发生的交易。如果我举一个非常简化的例子来说明我的观点 - 期望 DB 以一种在事务开始时锁定整个数据库的幼稚方式实现 - 你提交了 jms 消息,它已被处理,现在你不提交 db 记录。当 DB 在可序列化隔离级别下工作时(这就是 ACID 所要求的!),那么您的下一个写/读操作必须等到“飞行中准备好的”事务得到解决。DB 只是卡住并等待。如果您阅读,您将不会得到答案,因此您无法说出价值是什么。然后,Narayana 的恢复管理器会在建立连接后进入准备好的事务并提交它。

Q3:我不明白这个问题,对不起。但是如果你说The order in which the network packets arrive at the different data sources can determine which prepare request succeeds.你是对的,那么在网络变得更加稳定之前,你注定会失败交易。

于 2017-09-05T18:57:39.533 回答