分布式事务理论(ACID、CAP、BASE)

时间:2022-08-15 06:15:55

      1、分布式系统的特点

       分布式系统是一个由硬件或软件组件分布在不同的网络计算机上,彼此之间仅仅通过消息传递进行通信和协调的系统。其拥有如下特点

  分布性

  分布式系统中的多台计算机都会在空间中随意分布,同时,机器的分布情况也会随时变动。

  对等性

  分布式系统中的计算机没有主/从之分,既没有控制整个系统的主机,也没有被控制的从机,组成分布式系统的所有计算机节点都是对等的,副本指的是分布式系统对数据和服务提供的一种冗余方式,为了对外提供高可用的服务,我们往往会对数据和服务进行副本处理。数据副本是指在不同的节点上持久化同一份数据,当某一个节点上存储的数据丢失时,可以从副本上读取到该数据,这是解决分布式系统数据丢失问题最为有效的手段。服务副本是只多个节点提供同样的服务,每个节点都有能力接受来自外部的请求并进行相应的处理。

  并发性

  同一分布式系统中的多个节点,可能会并发地操作一些共享资源,诸如数据库或分布式存储等,如何高效地协调分布式并发操作也成为了分布式系统架构与设计中最大的挑战之一。

  缺乏全局时钟

  典型的分布式系统由一系列在空间上随意分布的多个进程组成,具有明显的分布性,这些进程之间通过交换消息来进行互相通信,因此,在分布式系统中,很难定义两个时间究竟谁先谁后,原因就是因为分布式系统缺乏一个全局的时钟序列控制。

  故障总是会发生

  组成分布式系统的所有计算机,都有可能发生任何形式的故障,任何在设计阶段考虑到的异常情况,一定会在系统实际运行中发生。

2、分布式环境的问题

  2.1 通信异常

  从集中式到分布式,必然引入了网络因素,而由于网络本身的不可靠性,因此就引入了额外的问题。分布式系统各节点之间的网络通信能够正常进行,其延时也会远大于单机操作,在消息的收发过程中,消息丢失和消息延迟变得十分普遍。

  2.2 网络分区

  当网络发生异常情况时,导致分布式系统中部分节点之间的网络延时不断增大,最终导致组成分布式胸的所有节点中,只有部分节点之间能够正常通信,而另一些节点则不能,这种现象称之为网络分区,当网络分区出现时,分布式系统会出现局部小集群,在极端情况下,这些局部小集群会独立完成原本需要整个分布式系统才能完成的功能,包括对数据的事务处理,这就对分布式一致性提出了非常大的挑战。

  2.3 三态

  由于网络可能会出现各种各样的问题,因此分布式系统的每一次请求与响应,存在特有的三态概念:成功、失败、超时。当网络在异常情况下,可能会出现超时现象,通常由以下两种情况:1. 由于网络原因,该请求并没有被成功地发送到接收方,而是在发送过程就发生了消息丢失现象。2. 该请求成功的被接收方接受后,并进行了处理,但是在将响应反馈给发送方时,发生了消息丢失现象。

  2.4 节点故障

  节点故障是指组成分布式系统的服务器节点出现宕机或僵死现象,每个节点都有可能出现故障,并且煤炭都在发生。

分布式事务理论

      ACID

      ACID,是指在数据库管理系统(DBMS)中,事务(transaction)所具有的四个特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)。

      在数据库系统中,一个事务是指:由一系列数据库操作组成的一个完整的逻辑过程。例如银行转帐,从原账户扣除金额,以及向目标账户添加金额,这两个数据库操作的总和,构成一个完整的逻辑过程,不可拆分。这个过程被称为一个事务,具有ACID特性。

       原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。

       一致性:在事务开始之前和事务结束以后,数据库的完整性限制没有被破坏。

      隔离性:当两个或者多个事务并发访问(此处访问指查询和修改的操作)数据库的同一数据时所表现出的相互关系。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。

      持久性:在事务完成以后,该事务对数据库所作的更改便持久地保存在数据库之中,并且是完全的。

      分布式事务是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于分布式系统的不同节点上,通常一个分布式事务中会涉及对多个数据源或业务系统的操作。一个分布式事务可以看做是由多个分布式的操作序列组成,通常可以把这一系列分布式的操作序列称为子事务。由于在分布式事务中,各个子事务的执行是分布式的,因此要实现一种能够保证ACID特性的分布式事务处理系统就显得格外复杂。

CAP

一致性(Consistency) 、可用性 (Availability) 、分区容忍性(Partitiontolerance) CAP原理指的是,这三个要素最多只能同时实现两点,不可能三者兼顾。这是Brewer教授于2000年提出的,后人也论证了CAP理论的正确性。

l 一致性(Consistency) :

      对于分布式的存储系统,一个数据往往会存在多份。简单的说,一致性会让客户对数据的修改操作(增/删/改),要么在所有的数据副本(replica)全部成功,要么全部失败。即,修改操作对于一份数据的所有副本(整个系统)而言,是原子(atomic)的操作。

      如果一个存储系统可以保证一致性,那么则客户读写的数据完全可以保证是最新的。不会发生两个不同的客户端在不同的存储节点中读取到不同副本的情况。

l 可用性(Availability) :

      可用性很简单,顾名思义,就是指在客户端想要访问数据的时候,可以得到响应。但是注意,系统可用(Available)并不代表存储系统所有节点提供的数据是一致的。这种情况,我们仍然说系统是可用的。往往我们会对不同的应用设定一个最长响应时间,超过这个响应时间的服务我们仍然称之为不可用的。

l 分区容忍性(Partition Tolerance) :

      如果你的存储系统只运行在一个节点上,要么系统整个崩溃,要么全部运行良好。一旦针对同一服务的存储系统分布到了多个节点后,整个存储系统就存在分区的可能性。比如,两个存储节点之间联通的网络断开(无论长时间或者短暂的),就形成了分区。一般来讲,为了提高服务质量,同一份数据放置在不同城市非常正常的。因此节点之间形成分区也很正常。

      Gilbert 和Lynch将分区容忍性定义如下:Noset of failures less than total network failure is allowed to cause the systemto respond incorrectly。除全部网络节点全部故障以外,所有子节点集合的故障都不允许导致整个系统不正确响应。另外一篇文章(BASE: An Acid Alternative)中对分区容忍性的解释:Operationswill complete, even if individual components are unavailable。即使部分的组件不可用,施加的操作也可以完成。

      对于一个大规模分布式数据系统来说,CAP三要素是不可兼得的,同一系统至多只能实现其中的两个,而必须放宽第3个要素来保证其他两个要素被满足。一般在网络环境下,运行环境出现网络分区是不可避免的,所以系统必须具备分区容忍性(P)特性,所以在一般在这种场景下设计大规模分布式系统时,往往在AP和CP中进行权衡和选择。

为什么分布式环境下CAP三者不可兼得呢?

      由于上面已经提到对于分布式环境下,P是必须要有的,所以该问题可以转化为:如果P已经得到,那么C和A是否可以兼得?可以分为两种情况来进行推演:

       (1) 如果在这个分布式系统中数据没有副本,那么系统必然满足强一致性条件,因为只有独本数据,不会出现数据不一致的问题,此时C和P都具备。但是如果某些服务
器宕机,那必然会导致某些数据是不能访问的,那A就不符合了。

      (2) 如果在这个分布式系统中数据是有副本的,那么如果某些服务器宕机时,系统还是可以提供服务的,即符合A。但是很难保证数据的一致性,因为宕机的时候,可能
有些数据还没有拷贝到副本中,那么副本中提供的数据就不准确了。

       所以一般情况下,会根据具体业务来侧重于C或者A,对于一致性要求比较高的业务,那么对访问延迟时间要求就会低点;对于访问延时有要求的业务,那么对于数据一致性要求就会低点。一致性模型主要可以分为下面几类:强一致性、弱一致性、最终一致性、因果一致性、读你所写一致性、会话一致性、单调读一致性、以及单调写一致性,所以需要根据不同的业务选择合适的一致性模型。

BASE

      接受最终一致性的理论支撑是BASE模型,BASE全称是BasicallyAvailable(基本可用), Soft-state(软状态/柔性事务), Eventually Consistent(最终一致性)。BASE模型在理论逻辑上是相反于ACID(原子性Atomicity、一致性Consistency、隔离性Isolation、持久性Durability)模型的概念,它牺牲高一致性,获得可用性和分区容忍性。

      BASE是基本可用(Basically Available)、Soft state(弱状态)、Eventually consistent(最终一致性)三个短语的简写。

  • ① 基本可用,指分布式系统在出现不可预知故障时,允许损失部分可用性,如响应时间上的损失或功能上的损失。
  • ②弱状态,也称为软状态,指允许系统中的二数据存在中间状态,并认为该中间状态的存在不会影响系统的整体可用性,即允许系统在不同节点的数据副本之间进行数据同步的过程存在延时。

  • ③最终一致性,指系统中所有的数据副本,在经过一段时回见的同步后,最终能够达到一个一致的状态,因此最终一致性的本质是需要系统保证数据能够达到一致,而不需要实时保证系统数据的强一致性。

Data Replication

      数据复制(data replication)属于分布式计算的范畴,它并不仅仅局限于数据库,但这里主要是指分布式数据库的复制。

      在多副本构成的分布式数据库系统中, 其事务特性与单个数据库系统的差别主要表现在原子性和一致性两个方 面。在原子性方面, 要求同一分布式事务的所有操作在所有相关副本上要么提交, 要么回滚, 即除了保证原有的局部事务的原子性,还需要控制全局事务的原子性; 在一致性方面,多副本之间需要保证单一副本一致性。

      针对分布式事务的原子性和一致性这两个复制协议中的核心问题, 经过近20年的研究 , 人们提出了各种各样的复制协议。这些协议在外在功能和内部实现两方面都有较大的差别。据此,我们可以从这两个大的方面进行分类说明。

      从外在功能的角度看, 依据文献, 可以从事务执行的地点和时间两个方面进行分类。从事务执行的地点,可以分为两类: 主从( Priamry / Copy)方式和更新所有( Update-Anywhere ) 方式。

      前者的处理过程一般是系统中仅仅指定一个Primary节点接受更新请求 , 在事务操作执行完毕后, 在事务提交前或后将操作广播到其他Copy节点。

      后者的处理过程稍微复杂, 系统中的任何副本具有相同的地位,都可以接收Update请求 ,在检测事务冲突、 事务提交前或后将各个节点的Update传播到其他副本节点。

      Primary / Copy方式并发控制较为简单, 由Primary本地的事务控制即可实现, 事务的原子性的实现也较为简单, 一般由Primary节点作为协调节点来实现。但是, 其缺陷也显而易见: 仅仅单个节点提供Update请求处理能力, 对于Update密集类型的应用, 如OLTP, 容易形成单点性能瓶颈。Update-Anywhere方式则与其相辅相成, 可以通过多点提高事务吞吐率, 但随之而来的是多个分布式事务之间复杂的并发控制和原子性问题。

      从事务提交的时间点看, 可以分为积极 (Eager)和消极(Lazy) 两类。其区别在于, 前者是在事务提交前传播更新,后者则是在提交之后才将事务操作传播到其他副本。实际上,前者即通常无谓的同步复制(synchronous replication),后者即无谓的异步复制(asynchronous replication)。

      异步复制的优点是可以提高响应速度, 但牺牲了一致性 ,一般实现该类协议的算法需要增加额外的补偿机制。同步复制的优点是可以保证一致性(一般通过两阶段提交协议),但是开销较大,可用性不好(参见CAP部分),带来了更多的冲突和死锁等问题。值得一提的是Lazy+Primary/Copy的复制协议在实际生产环境中是非常实用的,MySQL的复制实际上就属于这种。