在说分布式事务之前,先看看事务本身。
事务定义
事务是一组单元化的操作,这组操作可以保证要么全部成功,要么全部失败(只要有一个失败的操作,就会把其他已经成功的操作回滚)。
数据库事务
为数据库操作序列提供了一个从失败中恢复到正常状态的方法,同时提供了数据库即使在异常状态下仍能保持一致性的方法。当多个应用程序在并发访问数据库时,可以在这些应用程序之间提供一个隔离方法,以防止彼此的操作互相干扰。访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。
数据库事务特点
原子性(atomicity)。一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。
一致性(consistency):在事务开始以前,数据库处于一致性的状态,事务结束后,数据库也必须处于一致性的状态;一致性与原子性是密切相关的。
隔离性(isolation)。一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
持久性(durability)。持久性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。
分布式理论
当我们的单个数据库的性能产生瓶颈的时候,我们可能会对数据库进行分区,这里所说的分区指的是物理分区,分区之后可能不同的库就处于不同的服务器上了,这个时候单个数据库的ACID已经不能适应这种情况了,这时我们就需要引入一个新的理论原则来适应这种集群的情况,就是 CAP 原则或者叫CAP定理。
CAP
consistency数据一致性,availability可用性,partition tolerance分区容错性。
由于网络分割(P: Network Partition)的存在,用户不得不在一致性(C Consistency)与可用性(A: Avaliable)之前做权衡。如果要保证强一致性(主要是应用层面的强一致性),那么在网络分割的时候,系统就不可用;如果要保证高可用性,那么就只能提供弱一致性,保证最终一致。需要在一致性与可用性之间权衡。
CAP理论是说对于分布式数据存储,最多只能同时满足一致性(C,Consistency)、可用性(A, Availability)、分区容错性(P,Partition Tolerance)中的两者。 一致性,是指对于每一次读操作,要么都能够读到最新写入的数据,要么错误。 可用性,是指对于每一次请求,都能够得到一个及时的、非错的响应,但是不保证请求的结果是基于最新写入的数据。 分区容错性,是指由于节点之间的网络问题,即使一些消息对包或者延迟,整个系统能继续提供服务(提供一致性或者可用性)。
节点间的数据复制一定存在延迟,如果需要保证一致性(对所有读请求都能够读到最新写入的数据),那么势必在一定时间内是不可用的(不能读取),即牺牲了可用性,反之亦然。
在这么严苛的规定下,于是提出了BASE来削弱这些要求。BASE是对CAP中一致性和可用性权衡的结果,其来源于对大规模互联网系统分布式实践的总结,是基于CAP定理逐步演化而来的,其核心思想是即使无法做到强一致性,但每个应用都可以根据自身的业务特点,采用适当的方法来使系统达到最终一致性。
BASE弱一致性协议
基本可用(Basically Available):系统能够基本运行、一直提供服务。
软状态(Soft-state):系统不要求一直保持强一致状态(允许系统中的数据存在中间状态,并认为该中间状态的存在不会影响系统的整体可用性,即允许系统在不同的数据副本之间进行数据同步的过程存在延时)
最终一致性(Eventual consistency):强调的是系统中所有的数据副本,在经过一段时间的同步后,最终能够达到一个一致的状态。因此,最终一致性的本质是需要系统保证最终数据能够达到一致,而不需要实时保证系统数据的强一致性。
FLP不可能定理
现实生活中的系统往往都是异步系统。因为系统中各个节点之间的延时,是否宕机等等都是不确定的。那么,在最小化异步模型系统中,是否存在一个可以解决一致性问题的确定性共识算法?
由Fischer、Lynch和Patterson三位科学家于1985年发表的论文《Impossibility of Distributed Consensus with One Faulty Process》指出:在网络可靠,但允许节点失效(即便只有一个)的最小化异步模型系统中,不存在一个可以解决一致性问题的确定性共识算法(No completely asynchronous consensus protocol can tolerate even a single unannounced process death)。
以上结论被称为FLP不可能原理。该定理被认为是分布式系统中重要的原理之一。
此定理实际上告诉人们,不要浪费时间去为异步分布式系统设计在任意场景下都能实现共识的算法。学术研究,往往考虑地是数学和物理意义上理想化的情形,很多时候现实世界要稳定得多(感谢这个世界如此鲁棒!)。例如,上面例子中描述的最坏情形,每次都发生的概率其实并没有那么大。工程实现上某次共识失败,再尝试几次,很大可能就成功了。科学告诉你什么是不可能的;工程则告诉你,付出一些代价,可以把它变成可行。