分布式事务及解决方案

1 篇文章 0 订阅

什么是分布式事务

什么是分布式

分布式是指将一个任务或应用程序分割成多个部分,并在多台计算机上同时执行这些部分。分布式系统可以提高计算能力、资源利用率和可扩展性。

什么是事务

在计算机科学中,事务是指作为单个逻辑工作单元执行的一系列操作。这些操作要么全部成功执行,要么全部失败,不存在中间状态。事务具有 ACID 属性,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。

  • 原子性(Atomicity): 事务中的所有操作要么全部执行成功,要么全部失败。如果其中一个操作失败,整个事务将被回滚,使数据保持一致性。

  • 一致性(Consistency): 事务的执行使系统从一个一致性状态转移到另一个一致性状态。即,事务执行的结果必须符合系统预定义的一致性规则。

  • 隔离性(Isolation): 事务的执行是相互隔离的,一个事务的执行不能被其他事务干扰。这意味着事务之间的操作应该相互独立,一个事务对数据的修改在另一个事务看来是不可见的,直到第一个事务提交。

  • 持久性(Durability): 一旦事务提交,其结果应该持久保存在系统中,即使在系统发生故障或重启时也不会丢失。

什么是分布式事务

分布式事务是指涉及多个节点、服务或数据库的事务操作。在分布式系统中,由于涉及到网络通信、不同节点的数据库等因素,保证 ACID 属性变得更加复杂。分布式事务的目标是确保所有参与者都能够按照一致的方式执行事务,即使在面临网络故障、节点故障等问题时也能保持数据的一致性。

为什么会有分布式事务?

假设有一个在线购物系统,该系统涉及到多个服务和数据库,包括订单服务、支付服务和库存服务。用户下单时,系统需要确保订单的创建、支付的扣款和库存的减少都是一个原子操作,以保证数据的一致性。

在这种场景下,如果【采用传统的单机事务】,可能会存在性能瓶颈,而且不适用于分布式环境。因此,引入了分布式事务来确保整个购物过程的一致性。

举例说明:

1. 用户下单:用户在前端下单,订单服务收到创建订单的请求。

2. 创建订单:订单服务负责在订单数据库中创建订单记录。

3. 扣款:订单创建成功后,支付服务负责进行支付操作,从用户账户中扣款。

4. 减库存:支付成功后,库存服务负责减少商品库存。

在上述过程中,如果在创建订单之后扣款操作失败,或者扣款成功后减库存操作失败,就可能导致数据不一致的情况。为了解决这个问题,可以引入分布式事务。

使用分布式事务的步骤可能包括:

1. 全局事务协调:引入一个全局事务管理器,负责协调各个参与者(订单服务、支付服务、库存服务)的事务。这可以使用两阶段提交(2PC)等协议。

2. 事务参与者:订单服务、支付服务和库存服务作为事务的参与者,在全局事务协调下执行各自的本地事务。

3. 事务的提交或回滚:在所有本地事务执行完成后,根据每个参与者的反馈,全局事务协调器决定提交或回滚整个分布式事务。如果任何一个参与者反馈失败,整个事务会回滚,以保证数据的一致性。

这样,通过引入分布式事务机制,系统可以在多个服务之间保持一致性,确保订单创建、支付和库存操作要么全部成功,要么全部失败。这是分布式事务在实际场景中的一个简单示例。

分布式事务是指一个事务的操作涉及多个资源管理器,这些资源管理器可能位于不同的服务器上,甚至不同的网络上。分布式事务需要保证所有操作要么全部成功,要么全部失败,以保持数据的一致性。

分布式事务的难点

  • 协调性: 如何保证所有资源管理器都按照预期的顺序执行操作,并且最终达成一致。
  • 可靠性: 如何保证即使发生故障,也要保证事务的完整性和一致性。
  • 性能: 如何尽可能减少分布式事务对系统性能的影响。

分布式事务的解决方案

  • 两阶段提交 (2PC): 2PC 是解决分布式事务问题的经典方案,它将事务分为两个阶段: 准备阶段和提交阶段。在准备阶段,协调器询问所有资源管理器是否可以提交事务。如果所有资源管理器都同意,则协调器通知所有资源管理器提交事务。如果任何一个资源管理器不同意,则协调器通知所有资源管理器回滚事务。
  • 三阶段提交 (3PC): 3PC 是 2PC 的改进方案,它在 2PC 的基础上增加了一个“预提交”阶段。在预提交阶段,协调器询问所有资源管理器是否可以准备提交事务。如果所有资源管理器都同意,则协调器通知所有资源管理器进入准备状态。如果任何一个资源管理器不同意,则协调器通知所有资源管理器回滚事务。
  • XA 协议: XA 协议是一种标准的事务处理协议,它可以用于解决分布式事务问题。XA 协议定义了两个角色: 事务管理器和资源管理器。事务管理器负责协调事务的执行,资源管理器负责管理具体的资源。
  • 最终一致性: 最终一致性是一种弱一致性模型,它允许数据在短期内存在不一致,但最终会一致。最终一致性通常用于对数据一致性要求不高的场景。

在 2000 年以前,人们曾经寄希望于 XA(eXtended Architecture) 的事务机制可以在本节所说的分布式环境中也能良好地应用,但这个美好的愿望今天已经被 CAP 理论彻底地击碎了,接下来就先从 CAP 与 ACID 的矛盾说起。

CAP 与 ACID

CAP 定理(Consistency、Availability、Partition Tolerance Theorem),也称为 Brewer 定理,起源于在 2000 年 7 月,是加州大学伯克利分校的 Eric Brewer 教授于“ACM 分布式计算原理研讨会(PODC)”上提出的一个猜想。

                                          图 CAP 理论原稿(那时候还只是猜想)

两年之后,麻省理工学院的 Seth Gilbert 和 Nancy Lynch 以严谨的数学推理证明了 CAP 猜想。自此,CAP 正式从猜想变为分布式计算领域所公认的著名定理。这个定理里描述了一个分布式的系统中,涉及共享数据问题时,以下三个特性最多只能同时满足其中两个:

  • 一致性Consistency):代表数据在任何时刻、任何分布式节点中所看到的都是符合预期的。一致性在分布式研究中是有严肃定义、有多种细分类型的概念,以后讨论分布式共识算法时,我们还会再提到一致性,那种面向副本复制的一致性与这里面向数据库状态的一致性严格来说并不完全等同,具体差别我们将在后续分布式共识算法中再作探讨。
  • 可用性Availability):代表系统不间断地提供服务的能力,理解可用性要先理解与其密切相关两个指标:可靠性(Reliability)和可维护性(Serviceability)。可靠性使用平均无故障时间(Mean Time Between Failure,MTBF)来度量;可维护性使用平均可修复时间(Mean Time To Repair,MTTR)来度量。可用性衡量系统可以正常使用的时间与总时间之比,其表征为:A=MTBF/(MTBF+MTTR),即可用性是由可靠性和可维护性计算得出的比例值,譬如 99.9999%可用,即代表平均年故障修复时间为 32 秒。
  • 分区容忍性Partition Tolerance):代表分布式环境中部分节点因网络原因而彼此失联后,即与其他节点形成“网络分区”时,系统仍能正确地提供服务的能力。

CAP 不可兼得,如果舍弃 C、A、P 时所带来的不同影响。

  • 如果放弃分区容忍性(CA without P),意味着我们将假设节点之间通信永远是可靠的。永远可靠的通信在分布式系统中必定不成立的,这不是你想不想的问题,而是只要用到网络来共享数据,分区现象就会始终存在。在现实中,最容易找到放弃分区容忍性的例子便是传统的关系数据库集群,这样的集群虽然依然采用由网络连接的多个节点来协同工作,但数据却不是通过网络来实现共享的。以 Oracle 的 RAC 集群为例,它的每一个节点均有自己独立的 SGA、重做日志、回滚日志等部件,但各个节点是通过共享存储中的同一份数据文件和控制文件来获取数据的,通过共享磁盘的方式来避免出现网络分区。因而 Oracle RAC 虽然也是由多个实例组成的数据库,但它并不能称作是分布式数据库。
  • 如果放弃可用性(CP without A),意味着我们将假设一旦网络发生分区,节点之间的信息同步时间可以无限制地延长,此时,问题相当于退化到前面“全局事务”中讨论的一个系统使用多个数据源的场景之中,我们可以通过 2PC/3PC 等手段,同时获得分区容忍性和一致性。在现实中,选择放弃可用性的 CP 系统情况一般用于对数据质量要求很高的场合中,除了 DTP 模型的分布式数据库事务外,著名的 HBase 也是属于 CP 系统,以 HBase 集群为例,假如某个 RegionServer 宕机了,这个 RegionServer 持有的所有键值范围都将离线,直到数据恢复过程完成为止,这个过程要消耗的时间是无法预先估计的。
  • 如果放弃一致性(AP without C),意味着我们将假设一旦发生分区,节点之间所提供的数据可能不一致。选择放弃一致性的 AP 系统目前是设计分布式系统的主流选择,因为 P 是分布式网络的天然属性,你再不想要也无法丢弃;而 A 通常是建设分布式的目的,如果可用性随着节点数量增加反而降低的话,很多分布式系统可能就失去了存在的价值,除非银行、证券这些涉及金钱交易的服务,宁可中断也不能出错,否则多数系统是不能容忍节点越多可用性反而越低的。目前大多数 NoSQL 库和支持分布式的缓存框架都是 AP 系统,以 Redis 集群为例,如果某个 Redis 节点出现网络分区,那仍不妨碍各个节点以自己本地存储的数据对外提供缓存服务,但这时有可能出现请求分配到不同节点时返回给客户端的是不一致的数据。

读到这里,不知道你是否对“选择放弃一致性的 AP 系统目前是设计分布式系统的主流选择”这个结论感到一丝无奈,本章讨论的话题“事务”原本的目的就是获得“一致性”,而在分布式环境中,“一致性”却不得不成为通常被牺牲、被放弃的那一项属性。但无论如何,我们建设信息系统,终究还是要确保操作结果至少在最终交付的时候是正确的,这句话的意思是允许数据在中间过程出错(不一致),但应该在输出时被修正过来。为此,人们又重新给一致性下了定义,将前面我们在 CAP、ACID 中讨论的一致性称为"强一致性(Strong Consistency)"、而把牺牲了 C 的 AP 系统又要尽可能获得正确的结果的行为称为追求“弱一致性”。不过,如果单纯只说“弱一致性”那其实就是“不保证一致性”的意思……人类语言这东西真的是博大精深。在弱一致性里,人们又总结出了一种稍微强一点的特例,被称为"最终一致性(Eventual Consistency)",它是指:如果数据在一段时间之内没有被另外的操作所更改,那它最终将会达到与强一致性过程相同的结果。

从之前的强一致性,降低为追求获得“最终一致性”。由于一致性的定义变动,“事务”一词的含义其实也同样被拓展了,人们把使用 ACID 的事务称为“刚性事务”,下面将要介绍几种分布式事务的常见做法统称为“柔性事务”。

分布式事务的柔性做法

在分布式系统中,由于 CAP 理论的限制,不可能同时满足强一致性、可用性和分区容错性。为了在满足可用性和分区容错性的前提下,尽可能地保证数据一致性,人们提出了一些分布式事务的柔性做法,也称为“柔性事务”。

柔性事务的常见做法包括:

  • 最终一致性: 最终一致性是一种弱一致性模型,它允许数据在短期内存在不一致,但最终会一致。最终一致性可以通过数据异步复制、定期数据同步等方式实现。最终一致性的概念是 eBay 的系统架构师 Dan Pritchett 在 2008 年在 ACM 发表的论文《Base: An Acid Alternative》中提出的,该论文总结了一种独立于 ACID 获得的强一致性之外的、使用 BASE 来达成一致性目的的途径。
  • TCC 事务: TCC 事务是一种两阶段提交协议,它将事务分为 Try、Confirm 和 Cancel 三个阶段。在 Try 阶段,事务参与者检查资源是否可用并进行预留。在 Confirm 阶段,事务参与者提交事务。在 Cancel 阶段,事务参与者回滚事务。TCC 是另一种常见的分布式事务机制,它是“Try-Confirm-Cancel”三个单词的缩写,是由数据库专家 Pat Helland 在 2007 年撰写的论文《Life beyond Distributed Transactions: An Apostate’s Opinion》中提出。
  • SAGA 事务: SAGA 事务是一种补偿事务,它将事务分为多个子事务,每个子事务都具有补偿操作。如果某个子事务失败,则可以执行补偿操作来恢复数据一致性。它源于 1987 年普林斯顿大学的 Hector Garcia-Molina 和 Kenneth Salem 在 ACM 发表的一篇论文《SAGAS》(这就是论文的全名)。文中提出了一种提升“长时间事务”(Long Lived Transaction)运作效率的方法,大致思路是把一个大事务分解为可以交错运行的一系列子事务集合。原本 SAGA 的目的是避免大事务长时间锁定数据库的资源,后来才发展成将一个分布式环境中的大事务分解为一系列本地事务的设计模式。

柔性事务的优缺点:

优点:

  • 可用性高: 柔性事务通常可以牺牲一致性来保证可用性。
  • 性能好: 柔性事务通常比强一致性事务的性能更好。

缺点:

  • 一致性弱: 柔性事务只能保证最终一致性,无法保证强一致性。
  • 实现复杂: 柔性事务的实现比强一致性事务更复杂。

柔性事务的应用场景:

  • 对一致性要求不高,但对可用性和性能要求较高的场景: 例如社交网络、电商平台等。
  • 数据可以异步更新的场景: 例如数据仓库、日志分析等。

以下是一些选择柔性事务的建议:

  • 对一致性要求较高的场景,不建议使用柔性事务。
  • 对可用性和性能要求较高的场景,可以考虑使用柔性事务。
  • 在选择柔性事务之前,需要仔细评估业务需求。

  • 26
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值