Narayana/XA 如何从 TM 故障中恢复?
How do Narayana/XA recover from TM failures?
我试图推理 systems/frameworks 可以采取的保证同步数据源的故障恢复操作。我一直无法找到 Narayana 恢复机制的明确解释。
Q1:Narayana 本质上是否采用两阶段提交来确保跨 2 个数据源的分布式事务?
问题 2:谁能解释一下 Narayana 在这种情况下的行为?
- 应用程序想要将 X 保存到 2 个数据存储
- Narayana 的事务管理器 (TM) 生成事务 ID 并将信息写入磁盘
- TM 现在向两个数据存储发送准备消息
- 每个数据存储响应 prepare_success
- TM 更新本地事务日志并向两个数据存储发送提交消息
- TM 失败(永久)。并且由于网络上的丢包,只有一个数据存储收到提交消息。但是其他数据存储收到并成功处理了提交消息。
这两个数据存储现在彼此不同步(一个源有另一个源中不存在的额外事务)。
启动新 TM 时,它无法访问旧的事务状态记录。因此 TM 无法在其中一个数据存储中启动丢失事务的恢复。
那么 2PC/Narayana/XA 怎么能声称他们保证可以保持 2 个数据存储同步的分布式事务呢?从我的立场来看,他们只能以很高的概率保持同步数据存储,但他们不能保证。
Q3:我不清楚 application/framework 行为的另一种情况。考虑以下交错事务(都在同一条记录上 - 或者至少有部分重叠的记录集):
- Di = 数据源 i
- Ti = 交易 i
- Pi = 为交易 i
准备消息
D1 receives P1; responds P1_success
D2 receives P2; responds P2_success
D1 receives P2; responds P2_failure
D2 receives P1; responds P1_failure
网络数据包到达不同数据源的顺序可以决定哪个准备请求成功。这是否意味着有争议的记录在高交易速度下 - 有可能所有交易都会失败(直到记录遇到较低的交易请求率)?
有人可能会争辩说我们选择的是一致性而不是可用性,但与 ACID 系统不同的是,不能保证至少有一个事务会成功(从而避免潜在的长期死锁)。
请参阅我关于 Narayana 2PC 工作原理的文章
https://developer.jboss.org/wiki/TwoPhaseCommit2PC
回答你的问题
Q1:您已经在评论中提到了这一点——是的,Narayana 使用 2PC = Narayana 实现了 XA 规范 (pubs.opengroup.org/onlinepubs/009680699/toc.pdf ).
Q2:场景中的步骤不准确。 Narayana 在调用准备时写入磁盘,而不是在事务启动时写入。
- 应用程序将 X 保存到 2 个数据存储
- TM 现在向两个数据存储发送准备消息
- 每个数据存储响应 prepare_success
- TM 将有关准备好的交易及其 ID 的信息永久保存到交易日志存储中
- TM 向两个数据存储发送提交消息
- ...
我不同意 2PC 声称保证保持 2 个数据存储同步。
我也想知道这个(例如在这里问 https://developer.jboss.org/message/954043)。
2PC 声称保证 ACID 属性。让 2 个存储同步是 CAP 一致性的一种表现。
在此 Narayana 中,严格取决于特定资源管理器(数据存储或 jdbc 数据存储驱动程序)的功能。
ACID 声明
- 原子性 - 整个事务被提交或回滚(发生时没有信息,没有关于同步资源的信息)
- 一致性——交易结束前和交易结束时系统处于一致状态
- 耐用性 - 即使发生崩溃也会存储所有内容
- 隔离——(棘手的一个,留在最后)——为了成为 ACID,我们必须是可序列化的。那就是您可以观察到发生的交易 "one by one"。
如果我举一个非常简单的例子来表明我的观点——期望数据库以一种在事务开始时锁定整个数据库的天真方式实现——你提交了 jms 消息,该消息已经处理,现在你不提交数据库记录。当 DB 在可序列化隔离级别工作时(这是 ACID 所要求的!),那么您的下一个 write/read 操作必须等到 'in-flight prepared' 事务被解决。 DB 只是卡住等待。如果你阅读你不会得到答案,所以你不能说什么是价值。
Narayana 的恢复管理器在连接建立后来到准备好的事务并提交它。而你读到的动作returns信息就是'correct'.
Q3: 没看懂,抱歉。但是如果你说 The order in which the network packets arrive at the different data sources can determine which prepare request succeeds.
那么你是对的,在网络变得更稳定之前你注定会失败交易。
我试图推理 systems/frameworks 可以采取的保证同步数据源的故障恢复操作。我一直无法找到 Narayana 恢复机制的明确解释。
Q1:Narayana 本质上是否采用两阶段提交来确保跨 2 个数据源的分布式事务?
问题 2:谁能解释一下 Narayana 在这种情况下的行为?
- 应用程序想要将 X 保存到 2 个数据存储
- Narayana 的事务管理器 (TM) 生成事务 ID 并将信息写入磁盘
- TM 现在向两个数据存储发送准备消息
- 每个数据存储响应 prepare_success
- TM 更新本地事务日志并向两个数据存储发送提交消息
- TM 失败(永久)。并且由于网络上的丢包,只有一个数据存储收到提交消息。但是其他数据存储收到并成功处理了提交消息。
这两个数据存储现在彼此不同步(一个源有另一个源中不存在的额外事务)。
启动新 TM 时,它无法访问旧的事务状态记录。因此 TM 无法在其中一个数据存储中启动丢失事务的恢复。
那么 2PC/Narayana/XA 怎么能声称他们保证可以保持 2 个数据存储同步的分布式事务呢?从我的立场来看,他们只能以很高的概率保持同步数据存储,但他们不能保证。
Q3:我不清楚 application/framework 行为的另一种情况。考虑以下交错事务(都在同一条记录上 - 或者至少有部分重叠的记录集):
- Di = 数据源 i
- Ti = 交易 i
- Pi = 为交易 i 准备消息
D1 receives P1; responds P1_success
D2 receives P2; responds P2_success
D1 receives P2; responds P2_failure
D2 receives P1; responds P1_failure
网络数据包到达不同数据源的顺序可以决定哪个准备请求成功。这是否意味着有争议的记录在高交易速度下 - 有可能所有交易都会失败(直到记录遇到较低的交易请求率)?
有人可能会争辩说我们选择的是一致性而不是可用性,但与 ACID 系统不同的是,不能保证至少有一个事务会成功(从而避免潜在的长期死锁)。
请参阅我关于 Narayana 2PC 工作原理的文章 https://developer.jboss.org/wiki/TwoPhaseCommit2PC
回答你的问题
Q1:您已经在评论中提到了这一点——是的,Narayana 使用 2PC = Narayana 实现了 XA 规范 (pubs.opengroup.org/onlinepubs/009680699/toc.pdf ).
Q2:场景中的步骤不准确。 Narayana 在调用准备时写入磁盘,而不是在事务启动时写入。
- 应用程序将 X 保存到 2 个数据存储
- TM 现在向两个数据存储发送准备消息
- 每个数据存储响应 prepare_success
- TM 将有关准备好的交易及其 ID 的信息永久保存到交易日志存储中
- TM 向两个数据存储发送提交消息
- ...
我不同意 2PC 声称保证保持 2 个数据存储同步。 我也想知道这个(例如在这里问 https://developer.jboss.org/message/954043)。 2PC 声称保证 ACID 属性。让 2 个存储同步是 CAP 一致性的一种表现。
在此 Narayana 中,严格取决于特定资源管理器(数据存储或 jdbc 数据存储驱动程序)的功能。 ACID 声明
- 原子性 - 整个事务被提交或回滚(发生时没有信息,没有关于同步资源的信息)
- 一致性——交易结束前和交易结束时系统处于一致状态
- 耐用性 - 即使发生崩溃也会存储所有内容
- 隔离——(棘手的一个,留在最后)——为了成为 ACID,我们必须是可序列化的。那就是您可以观察到发生的交易 "one by one"。 如果我举一个非常简单的例子来表明我的观点——期望数据库以一种在事务开始时锁定整个数据库的天真方式实现——你提交了 jms 消息,该消息已经处理,现在你不提交数据库记录。当 DB 在可序列化隔离级别工作时(这是 ACID 所要求的!),那么您的下一个 write/read 操作必须等到 'in-flight prepared' 事务被解决。 DB 只是卡住等待。如果你阅读你不会得到答案,所以你不能说什么是价值。 Narayana 的恢复管理器在连接建立后来到准备好的事务并提交它。而你读到的动作returns信息就是'correct'.
Q3: 没看懂,抱歉。但是如果你说 The order in which the network packets arrive at the different data sources can determine which prepare request succeeds.
那么你是对的,在网络变得更稳定之前你注定会失败交易。