分布式事务
对于单机系统我们很容易实现一套满足ACID的事务处理系统,但是在分布式数据库中,数字分散在各台不同的机器上,如何对这些数据进行分布式的事务处理具有非常大的调整。在分布式环境中会碰到很多问题,比如机器宕机和各种网络异常等。虽然问题很多,但是为了保证分布式应用程序的可靠性,分布式事务是无法回避的。
分布式事务是指事务的参与者,支持事务的服务器,资源服务器以及事务管理器分别位于分布式系统的不同节点上。一个分布式事务中会涉及多个数据源或业务系统的操作。
分布式事务场景
一个跨银行的转账操作涉及调用两个异地的银行服务,其中一个是本地银行提供的取款服务,另一个则是目标银行提供的存款服务,这两个服务本身是无状态并且是相互独立的,共同构成了一个完整的分布式事务。如果从本地银行取款成功,但是因为某种原因存款服务失败了,那么就必须回滚到取款前的状态,否则用户可能会发现自己的钱消失了。
CAP和BASE理论
对于本地事务或集中式事务处理系统,显然我们可以采用被实践证明很成熟的ACID模型来保证数据的严格一致性。但是随着分布式事务的出现,传统的单机事务已经无法胜任了。特别是对于高并发的互联网分布式系统来说,如果我们期望实现一套严格满足ACID特性的分布式事务,很可能出现在系统可用性和严格一致性之间的冲突----因为当我们要求分布式系统具有严格一致性时,就很可能会牺牲掉系统的可用性。但是,可用性又是所有消费者不允许我们讨价还价的系统属性。而对于一致性则是消费者对一个软件系统的刚需。因此,在可用性和一致性之间我们无法存在一个两全其美的方案,如何构建一个兼顾可用性和一致性的分布式系统呢?于是出现了CAP和BASE理论。
CAP理论
根据CAP理论,一个分布式系统不可能同时满足一致性(C:Consistency),可用性(A:Availability)和分区容错性(P:Partition tolerance)这三个基本需求,最多只能同时满足其中的两项。
一致性
在分布式环境中,一致性指数据在多个副本之间保持一致的特性。当一个系统在数据一致的状态下执行更新操作后,应该保证系统的数据仍然处于一致的状态。
对于一个将数据副本分布在不同分布式节点上的系统来说,如果对第一个节点的数据进行了更新操作并且更新成功后,并没有使其它的节点上的数据得到相应的更新,于是对其它节点的数据进行读取的时候,获取的依然是老的数据(脏数据),这就是典型的分布式数据不一致的情况。在分布式系统中如果能做到针对一个数据项的更新操作执行成功后,所有的用户都可以读取到最新的值,那么这样的系统就被认为具有强一致性(或严格的一致性)。
可用性
可用性是指系统提供的服务必须一致处于可用的状态,对于用户的每一个操作请求总是在有限的时间内返回结果。
“有限的时间内”是指,对于用户的一个操作的请求,系统必须能够在指定的时间(即响应时间)内返回对应的处理结果,如果超过了这个时间范围,那么系统就被认为是不可用的。而且,“有限的时间内”是一个系统设计之初就设定好的系统运行指标,不同的系统之间会有很大的不同。比如,在支付系统中要求能够在3秒返回,这样不会影响用户的体验。而在搜索引擎中,比如Google要在0.3秒钟返回上千万个检索结果,否则用户会很失望,影响用户的体验。所以,“有限的时间内”在不同的系统差别很大。
“返回结果”是可用性另一个非常重要的指标,它要求系统在完成对用户请求的处理后,返回一个正常的响应结果。正常的响应结果通常能够明确地反映出对请求的处理结果,即成功或失败,而不是一个令用户感到困惑的结果。比如,返回结果是一个系统错误,如“OutOfMemoryError”等提示语,那么我们就认为此时这个系统不可用。
分区容错性
约束了一个分布式系统需要具有如下特征:分布式系统在遇到任何网络分区故障的时候,需要能够保证对外提供满足一致性和可用性的服务,除非整个网络环境都发送了故障。
网络分区是指在分布式系统中,不同的节点分布在不同的自网络(机房或异地网络等)中,由于一些特殊的原因导致这些自网络之间出现网络不连通的状况,但是各个自网络的内部网络是正常的,这样会导致整个系统的网络被切分成了若干孤立的区域。
CAP定理应用
放弃CAP定理 | 说明 |
---|---|
放弃P | 如果希望能够避免系统出现分区容错性的问题,简单做法就是将所有的数据(或者那些仅仅与事务相关的数据)都放到一个分布式节点上。这样的做法虽然无法100%地保证系统不会出错,但至少不会碰到由于网络分区带来的负面影响。但同时需要注意的是,放弃P就放弃了系统的可扩展性 |
放弃A | 相对于放弃“分区容错性”来说,放弃可用性则正好相反,做法是一旦系统遇到网络分区或其他故障时,那么受到影响的服务需要等待一定的时间,因此在等待期间系统无法对外提供正常的服务,即不可用 |
放弃C | 这里的放弃一致性,并不是完全不要数据的一致性了,如果这样的话,那么系统的数据就都没有意义了,整个系统就没有意义了。事实上,放弃一致性指的是放弃数据的强一致性,而保留数据的最终一致性。这样的系统无法保证数据保持实时一致性,但是能够保证的是:数据最终会达到一致的状态,这就引入了一个时间窗口的概念,具体多久能够达到数据一致性取决于系统的设计,主要包括数据副本在不同节点之间的复制时间长短 |
CAP定理结论
一个分布式系统不可能同时满足一致性,可用性和分区容错性这三个需求。另一个方面,对于一个分布式系统而言,分区容错性可以说是一个最基本的要求。因为既然是一个分布式系统,那么必然出现子网络,网络问题是一个必定会出现的异常情况,因此分区容错性也就成为了一个分布式系统必然要面对和解决的问题。因此,对于分布式系统而言,我们要把精力用在如何根据业务特点在C(一致性)和A(可用性)之间寻求平衡。