分布式事务以及背后的思考CAP理论和BASE理论

分布式事务

在单机数据库中,我们很容易能够实现一套满足ACID特性的事务处理系统,在在分布式数据库中,数据分散在各台不同的机器上,如何对这些数据进行分布式的事务处理具有非常大的挑。

分布式事务是指事务的参与者、支持事务的机器、资源服务器以及事务管理器分别位于分布式系统的不同节点上,通常一个分布式事务中会涉及对多个数据源或业务系统的操作。

可以想象一下典型的分布式事务场景:

例子:一个跨银行的转账操作设计调用两个异地的银行服务,其中一个是本地银行提供的取款服务,另一个则是目标银行提供的存款服务,这两个服务本身是无状态并且相互独立的,共同构成了一个完整的分布式服务。如果从本地银行取款成功,但是因为某种原因存款服务失败了,那么久必须回滚到取款之前的状态,否则用户可能会发现自己的钱不翼而飞了。

分析:从上面这个例子就可以了解到,一个分布式事务可以看做是多个分布式操作序列组成的,例如上面例子的取款服务和存款服务,通常可以把这一系列分布式的操作序列称为子事务。因此,分布式事务也可以被定义为一种嵌套型的事务

同时也就具有了ACID事务特性。

但由于在分布式事务中,各个子事务的执行是分布式的,因此要实现一种能够保证ACID特性的分布式事务处理系统就显得格外复杂,尤其是对于一个高访问量,高并发的互联网分布式系统来说,

如果我们期望设计一套严格满足ACID特性的分布式事务,很可能出现的情况就是在系统的可用性和严格一致性之间出现冲突-----因为当我们要求分布式系统具有严格一致性时,很可能就需要牺牲掉系统的可用性。但是毋庸置疑的一点就是,可用性又是一个消费者不允许我们讨价还价的系统属性,比如像淘宝这样的在线购物网站,就要求7*24小时不间断对外提供服务,而对于一致性,则更加是所有消费者对于一个软件的刚需。因此,在可用性和一致性之间永远无法存在一个两全其美的方案来解决一致性和可用性存在的问题。于是如何构建一个兼顾可用性和一致性的分布式系统其实已经成为无数的研发人员探讨的难题,所以说呢,在此就出现了CAP和BASE这样的分布式系统经典理论

CAP

什么是CAP定理呢?

其实在2000年7月的时候,加州大学伯克利分销的Eric Brewer教授提出了CAP猜想,2年后,被来自于麻省理工的Seth Gilbert和Nancy Lynch从理论上证明了猜想的可能性,从此,CAP定理正式在学术上成为了分布式计算领域的工人定理。并且深深的影响了分布式计算的发展。

CAP理论告诉我们,一个分布式系统不可能同时满足一致性(C:Consistency)可用性:(A:Availability)和分区容错性(P:Partition tolerance)这三个基本需求,最多只能同时满足其中的两个。

特性

描述

C:Consistency

一致性:分布式环境中,数据在多个副本之间能够保持一致的特性(严格的一致性)。在一致性的需求下,当一个系统在数据一致的状态下,执行更新操作后,应该保证系统的数据仍然处在一致的状态

A:Availability

可用性:指系统提供的服务必须一直处于可用的状态,每次请求都能获取到非错的响应—但是不保证获取的数据为最新数据

P:Partition tolerance

分区容错性,分布式系统在遇到任何网络分区故障的时候,仍然能够对外提供满足一致性和可用性的服务,除非整个网络环境都发生了故障

  • 为什么只能3选2呢?

首先,能不能同时满足三个条件呢?

如下图所示:

整个系统由两个节点配合组成,之间通过网络通信进行数据的传输,当节点A进行更新数据库操作的时候,需要同时更新节点B的DB的数据库(这是一个原子性的操作)。

上面这个系统如何满足cap呢?C:当节点A更新的时候,节点B也要进行更新 A:必须保证两个节点都是可用的  P:当节点A/B 当出现了节点故障或者网络分区等,必须保证对外可用。

综上面所述的几点,根本不可能完全兼顾CAP啊,因为只要出现了网络分区,C就无法满足。  因为节点A根本连接不上节点B。如果要强行满足一致性的话,这个时候A 就无法保证了,就必须停止B服务运行,从而放弃了可用性。

所以最多只能满足两个条件

组合方式

分析结果

CA

满足一致性和可用性,但是放弃了分区容错性。说白了,就是一个整体的应用,如果希望能够避免系统出现分区容错性的问题,一种较为简单的做法是将所有的数据(或者仅仅是那些与实务相关的数据)都放在一个分布式节点上。这样做虽然无法100%保证系统不会出错,但至少不会碰到网络分区带来的负面影响。但同时需要注意的是,放弃P的同时也就意味着方式了系统的可扩展性。

CP

满足一致性和分区容错性,一旦系统遇到网络分区或者其他故障或者为了保证一致性时,放弃了可用性,那么受到影响的服务需要等待一定的时候,因此在等待期间系统无法对外提供正常的服务,即不可用

AP

满足可用性和分区容错性,当出现网络分区,同时保证了可用性,必须让节点继续对外服务,这样必然导致失去一致性了,并不是完全不需要数据一致性,如果真是这样的话,那系统数据就没有意义了,这里实际上指的是放弃数据的强一致性,而保留数据的最终一致性。这样的系统无法保证数据保证实时的一致性,但是能够承诺的是,数据最终会达到一个一致的状态。这就引入了一个时间窗口的概念,具体多久能够达到一致取决于系统的设计,主要包括数据副本在不同节点之间的复制时间长短。

从CAP定理可以看出,一个分布式系统不可能同时满足C/A/P这三个基本需求。最多只能满足其中的2个,还需要明确的一点是:对于一个分布式而言,分区容错性可以说是一个最基本的要求。因为既然是一个分布式系统,那么分布式系统中的组件必然需要被部署到不同的节点,否则也就没有所谓的分布式而言了,因此必然出现子网络。而对于分布式系统而言,网络问题又是一个必定会出现的异常情况,因此分区容错性也就成为了一个分布式系统必然需要去面对和解决的问题。因此我们需要把精力花在根据自己的业务场景在C和A之间寻求一个平衡。

  • 能不能解决3选2的问题呢?

想要解决3选2的问题,首先我们需要思考的就是分区是百分百出现的吗?如果不出现分区的话,那么久能够同时满足CAP。如果出现分区,可以根据策略进行调整。比如C不必使用那么强的一致性,可以先将数据存起来,实现最终“一致性”

基于这个思路,也就引出了BASE 理论

Base理论

在CAP理论中,介绍了不可能同时满足,而分区容错性对于分布式系统而言,是必须的。但如果系统能够同时实现CAP是最好的,所以提出了Base理论。

什么是Base理论呢?

BASE 全程:Basically Available(基本可用),Soft state(软状态),和Eventually consistent (最终一致性)三个短语的缩写,来自ebay的架构师提出。Base理论对Cap中一致性和可用性权衡的结果,其来源于对大型互联网分布式实践的总结,是基于CAP定理演化而来的。

其核心思想是:既然无法做到强一致性,但每个应用都可以根据自身的业务特点,采用适当的方式来使系统达到最终一致性。

  • Basicaully Available 基本可用

什么是基本可用呢?

基本可用是指分布式系统在出现不可预知故障的时候,允许损失部分可用性—但请注意,这绝不等价于系统不可用。

例如:

1.响应时间上的损失:正常情况下,一个在线搜索引擎需要在0.5s之内返回用户相应的查询结果,但由于出现故障(比如:系统部分机房发生断电或者断网故障),查询结果的相应时间增加到了1-2秒,比如说有些机器的配置较高,性能较高,运行速度较快,有些机器配置较低,但是配置较高的权重也较高,配置低的反之,但是正常情况下会优先走配置高的,但是这个时候配置高的机器出现了故障,在这个时候,必然会出现响应时间变长的问题。但是对于系统而言,还是可用状态

2.功能上的损失:正常情况下,在一个电子商务网站,京东啊,淘宝,pdd等,消费者机会能够顺利的完成每一比订单。但在一些节日大促购物高峰的时候,比如双11,由于消费者的购物需求激增,为了保护系统的稳定性或者保证一致性,部分消费者可能会被引导到另一个降级页面。

  • 软状态:

什么是软状态呢?相对于一致性,要求多个节点的数据副本都是一致的,这是一种”硬状态”。什么是软状态呢?

软状态指的事:允许系统中的数据存在中间状态,并认为该状态不影响系统的整体可用性,即允许系统在多个不同节点的数据副本之间进行数据同步的过程存在延迟。

  • Eventually consistent 最终一致性

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

在实际工程实践中,最终一致性存在以下五类主要变种:

1.因果一致性(Causal consistency)

指的是:如果节点A在更新完某个数据后通知了节点B,那么节点B之后对该数据的访问和修改都是基于A更新后的值。于此同时,和节点A无因果关系的节点C的数据则没有这样的限制。

2.读已之所写 (Read your writes)

节点A更新一个数据后,它自身总是能访问到自身更新过的最新值,而不会看到旧值。也就是说,对于单个数据获取而言,其读取到的数据,一定不会比上次写入的值旧,因此,读已之所写也可以看成是一种特殊的因果一致性。

3.会话一致性

会话一致性将系统数据的访问过程框定在了一个会话当中:系统能保证在同一个有效的会话中实现”读已知所写”的一致性,也就是说,执行更新操作之后,客户端能够在同一个会话中始终读取到该数据项的最新值。

4.单调写一致性

单调读一致性是指如果一个节点从系统中读取一个数据项的某个值后,那么系统对于该节点后续的任何数据访问都不应该返回更旧的值

5.单调写一致性

指一个系统要能够保证来自同一个节点的写操作被顺序的执行

上面这五种是最终一致性比较常见的变种,在实际系统实践中呢,可以将其中的若干个变种互相结合起来,以构建一个具有最终一致性特性的分布式系统。

总体来说呢,BASE理论是面向的大型高可用可扩展的分布式系统,和传统事务的ACID是相反的,它完全不同于ACID的强一致性模型,而是通过牺牲强一致性来获得可用性,并允许数据在一段时间是不一致的,但是最终要保持一致。

针对一致性和可用性要客观的来分析这方面的问题,机器层面和系统层面来客观的去看待这方面的问题,而不应该有固话思维,因为不同层面对这方面的理解必然是不同的。

猜你喜欢

转载自blog.csdn.net/crossroads10/article/details/108167499