摘要
原子事务提交(ACP)是一个和一致性相似的单次协议问题,旨在模拟易出错的分布式系统的事务提交协议属性。我们认为,ACP 限制太多以至于不能捕获现代事务数据存储的复杂性,其中提交协议和并发控制集成,并且他们对不同事务的执行是相互依赖的。作为替代方案,我们引入了传输认证服务(TCS),一个新的正式问题,它通过集成的并发控制来捕获多发事务提交协议的安全保证。TCS 由可实例化的认证函数参数化,以支持常见的隔离级别,如可串行化和快照隔离。然后,我们推导出一个可证明正确性的弹性崩溃协议,用于通过连续改进来实现 TCS。我们的协议比主流方法实现了更好的时间复杂度,主流方法在 Paxos 风格的复制之上分两阶段提交。
概论
现代数据存储通常被需要管理大量数据,同时为用户提供严格的事务保证。它们通过将数据划分为独立管理的分片和容错性来实现可伸缩性,方法是在一组服务器上复制每个分片。实现这样的系统需要复杂的协议来确保分布式事务满足通常称为 ACID 的所需属性的组合:原子性,一致性,隔离性和持久性。
传统上,分布式计算文献将实现这些属性的方法抽象为单独的问题:特别是保证原子性的原子提交问题(ACP)和保证隔离性的并发控制(CC)。ACP 正式化作为一个一次性协议问题,其中涉及事务的多个分片需要就其最终结果作出决策:如果所有分片都投票提交,则决策提交,否则放弃。并发控制负责确保全局历史符合所需的隔离级别。在典型的实现中,每个分片跟踪事务访问的本地对象,并根据本地观察到的与其他活动事务的冲突确定其对事务结果的投票(提交或放弃)。虽然 ACP 和 CC 都必须在任何现实的事务处理系统中解决,但它们在现有文献中被视为不相交的。特别是,ACP 的解决方案将投票视为问题的输入,并把与负责产生投票的 CC 进行交互这件事遗留在问题范围之外。
然而,这种分离过于简单,无法捕捉到许多实际实现的复杂性,其中提交协议和并发控制紧密集成,因此可能会以微妙的方式相互影响。例如,考虑经典的两阶段提交(2PC)协议,用于解决可靠进程之间的
ACP。事务处理系统通常为每个事务执行一个 2PC 实例。当管理分片
目前,缺乏一个正式的框架来捕捉实际实现的这些复杂方面使得它们难以理解和证明。在本文中,我们迈出了弥合这一差距的第一步。我们介绍了事务认证服务(TCS,第
2
节),这是一个新的正式问题,用于捕获具有集成并发控制的多次事务提交协议的安全保证。TCS
暴露了一个简单的接口,允许客户端通过一个返回提交或放弃的
我们利用 TCS 开发一个正式的框架,用于构建具有可定制隔离级别的可证明正确的多次事务提交协议。我们框架的核心是一个新的多次两阶段提交协议(第 3 节)。它形式化了经典 2PC 如何与许多实际事务处理系统中的并发控制交互,其方式在提供的隔离级别中是参数化的。该协议还用作派生更复杂的 TCS 实现的模板。我们证明了多次两阶段提交协议正确地实现了具有给定认证功能的 TCS,前提是每个分片使用的并发控制策略与此函数匹配。
接下来,我们提出了一个崩溃容错 TCS 实现,并通过证明它模拟多次 2PC(第 4 节)来确定其正确性。使 2PC 容错的一种常见方法是让每个分片使用复制协议(例如 Paxos)来模拟可靠的 2PC 进程。与最近的工作类似,我们的实现通过将 2PC 和 Paxos 编织在一起来优化该方案的时间复杂度。特别是,我们的协议避免持续复制 2PC 协调者,以换取协调者单方面中止事务的能力。反过来,这允许消除普通容错 2PC 中所需的 Paxos 一致性,以在分片上保留对事务的最终决策:如果发生故障,可以从分片的当前状态重建决策。与以前遵循相同设计的协议相比,我们的协议在隔离级别上是通用的,并且经过严格证明是正确的。因此,它可以作为未来分布式事务提交实现的参考解决方案。此外,我们协议的一个变体具有与一致性和非阻塞原子提交的下限相匹配的时间复杂度。
我们协议的一个特性使得证明其正确性变得特别微妙,即避免就事务的最终决策达成共识,而是将决策异步传播到相关的分片副本。这意味着不同的分片副本可能在不同的时间收到决策,因此它们的状态可能不一致。为了解决这个问题,在我们的协议中,投票由单个分片领导者根据可用的信息在本地计算; 其他进程仅存储投票。这种被动复制方法在设计从领导者故障中恢复的方式并证明其正确性时要小心。
事务确认服务(TCS)
接口
事务认证服务 (TCS)接受来自
在本文中,我们关注使用(向后)乐观并发控制的事务处理系统。因此,我们假设提交给
TCS 的事务包括其乐观执行产生的所有信息。例如,考虑一个事务系统管理集合
- 读集
: 读取的对象及其版本的集合,每个对象包含一个版本。 - 写集
: 写入的具有其值的对象集合,其中每个对象包含一个值。我们要求任何写入的对象也已被读取: 。 - 提交版本
:分配给 写入的版本。我们要求此版本高于读取的任何版本: 。
认证函数
TCS 由认证函数
其中操作符
例如,给定上述事务域,以下认证函数封装了可串行化的经典并发控制策略:
快照隔离(SI)的认证函数类似,但将认证检查限制在事务
很容易检查认证函数 (2) 和 (3) 是分布式的。
历史
我们使用历史来表示 TCS
执行——验证和决定动作的有限序列,使得每个事务最多出现一次作为
和 包含相同的动作
TCS 正确性
一个完整的序列历史
如果
使用 TCS 规范
可以在事务处理系统 (TPS) 中轻松使用正确的
TCS。例如,考虑前面定义的事务域。基于乐观并发控制的典型 TPS
将确保提交的认证事务读取数据库中已经存在的版本。形式上,这意味着对于由
TCS 接口的动作引起的每个历史
多次 2PC 和本地分片认证函数
我们现在展示经典两阶段提交 (2PC) 协议的多次版本,它是每个分片使用的并发控制策略中的参数。然后,我们证明该协议实现了由给定认证函数参数化的正确事务认证服务,前提是每个分片的并发控制与该函数匹配。与 2PC 一样,我们的协议假设过程可靠。在下一节中,我们通过证明它模拟多次 2PC 的行为来确定允许崩溃的协议的正确性。
系统模型
我们考虑一个由一组进程
一般情况协议
我们在图 1 中给出了协议的伪代码,并在图 2a 中说明了它的消息流。图 1 中的每个处理程序都是原子执行的。
1 |
|

为了验证事务
事务
投票计算
管理分片
例如,考虑第 2 节中给出的事务模型。并假设对象集
并且

遗忘和回忆决策
图 1 中的协议在 21 行和 24 行有两个额外的函数,它们并不确定性地执行。在第 4 部分我们将展示,这些是为了抽象协议能够捕捉乐观容错 TCS 实现的行为。因为进程被破坏,这些执行可能临时丢失和最终决策有关的信息,并且之后从相关的分片的投票重构它。同时,正如我们之前解释过的,决策的丢失可能影响到一些投票计算。21 行的函数遗忘某一事务的决策(而不是投票)。24 行的函数允许进程向协调者重新发送他们知道的投票,这些协调者之后会重新发送最终决策(14 行)。这让遗忘决策的进程从相关分片存储的投票重构它。
正确性
如果
定理略。
容错提交协议
系统模型
我们现在通过允许进程因崩溃而失败(即永久停止执行)来削弱上一节的假设。
我们仍然假设进程是通过可靠的 FIFO 通道连接的,在以下意义上:消息按 FIFO
顺序传递,并且非故障进程之间的消息保证最终传递。 每个分片
一般协议
在上述模型中实现 TCS 的一种直接方法是使用状态机复制使分片模拟多次 2PC 中的可靠过程; 这通常基于共识协议,例如 Paxos。在这种情况下,永远不会忘记事务的最终决定,因此不会模拟第 21 行和第 24 行的处理程序。尽管这种方法被多个系统使用,但多名研究人员观察到,由此产生的协议需要大量不必要的消息延迟。即,图 2a 中的多次 2PC 的每个动作都需要额外往返同一分片中的一组进程以保持其效果,从而产生图 2b 中的消息流图。 请注意,协调者的操作也必须被复制,因为如果协调者宕机,多次 2PC 将阻塞。生成的协议需要 7 次消息延迟,客户端才能了解事务决策。
优化的协议概述
在图 5 中,我们给出了一个提交协议,该协议通过将跨分片的多次 2PC 和每个分片内的类 Paxos 协议编织在一起来减少消息延迟的数量。 我们从代码中省略了与消息重传相关的细节。我们在图 2c 中说明了协议的消息流,并在图 6 中总结了其正确性证明中使用的关键不变量。
一个进程维护与多次 2PC 协议中相同的变量(图 1)和一些额外的变量。
分片中的每个进程要么是分片的领导者,要么是追随者。
如果领导者失败,则其中一个追随者接管。
与图 2b 中所示的一般协议不同,我们的协议不执行共识以将
无故障案例
为了验证事务
在接收到
只有当一个进程参与相应的投票(第 25 行)时,它才会处理
事务
领导者恢复
协调者恢复
优化
协议正确性
相关工作
结论
在本文中,我们迈出了在现代事务处理系统中构建分布式事务提交理论的第一步,该理论捕获了原子提交和并发控制之间的交互。我们提出了一个事务认证服务的新问题,以及一个在可靠进程之间解决它的抽象协议。由此,我们系统地推导出了一个可证明正确的优化容错协议。