0
点赞
收藏
分享

微信扫一扫

分布式相关概念:ACID特性,CAP理论,BASE理论


汇总一下几个常见的理论的概念:

1.ACID特性

数据库管理系统中事务(transaction)的四个特性:
原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)

1、原子性

原子性是指事务是一个不可再分割的工作单元,事务中的操作要么全部成功,要么全部失败。

2、一致性

一致性是指在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。这是说数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性。

3、隔离性

多个事务并发访问时,事务之间是隔离的,一个事务不应该影响其它事务运行效果。

4、持久性

持久性,意味着在事务完成以后,该事务对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。

2.CAP理论

CAP理论,指的是在一个分布式系统中,不可能同时满足Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性)这三个基本需求,最多只能满足其中的两项。

1、一致性:

指数据在多个副本之间是否能够保持一致的特性。当执行数据更新操作后,仍然可以保证系统数据处于一致的状态。

2、可用性:

系统提供的服务必须一直处于可用的状态。对于用户的每一个操作请求总是能够在“有限的时间内”返回结果。这个有限时间是系统设计之初就指定好的系统运行指标。返回的结果指的是系统返回用户的一个正常响应结果,而不是“out ot memory error”之类的系统错误信息。

3、分区容错性:

分布式系统在遇到任何网络分区故障的时候,仍然需要能够保证对外提供满足一致性和可用性的服务,除非是整个网络环境都发生了故障。组成分布式系统的每个节点的加入与退出都可以看成是一个特殊的网络分区。

3.BASE理论

BASE理论是指:Basically Available(基本可用)、Soft-state( 软状态/柔性事务)、Eventual Consistency(最终一致性)。是基于CAP定理演化而来,是对CAP中一致性和可用性权衡的结果。

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

1、基本可用:

指分布式系统在出现故障的时候,允许损失部分可用性,保证核心可用。但不等价于不可用。比如:搜索引擎0.5秒返回查询结果,但由于故障,2秒响应查询结果;网页访问过大时,部分用户提供降级服务,等。

2、软状态:

软状态是指允许系统存在中间状态,并且该中间状态不会影响系统整体可用性。即允许系统在不同节点间副本同步的时候存在延时。

3、最终一致性:

系统中的所有数据副本经过一定时间后,最终能够达到一致的状态,不需要实时保证系统数据的强一致性。最终一致性是弱一致性的一种特殊情况。

4.CAP理论详解

在分布式环境下设计和部署系统时,有三个核心的系统需求:Consistency(一致性),Availability(可用性)和 PartitionTolerance(分区容忍性),但三者无法在分布式系统中同时被满足,并且最多只能满足其中两个,该理论简称 为 CAP。

CAP 理论最早是2000年由 Eric Brewer 教授在 PODC 的研讨会上提出猜想,后来 Lynch 等人进行了证明。该理论被认为是分布式系统领域的重要理论之一, 有着广泛的知名度,很多工程师将其作为衡量系统设计的准则。

4.1 一致性(Consistency)

如果系统对一个写操作返回成功,那么之后的读请求都必须读到这个新数据;如果返回失败,那么所有读操作都不能读到这个数据,对调用者而言数据具有强一致性(Strong Consistency)(又叫原子性 Atomic、线性一致性 Linearizable Consistency)。

4.2 可用性(Availability)

用户的每个请求都能接受到一个响应,无论响应是成功或失败,即服务在任何时刻都是可用的,这就要求系统当中不应该有单点的存在(如果服务是单节点部署,一旦节点宕机,服务便不可用了),通常可用性都是通过冗余的方式来实现的。

4.3 分区容忍性(PartitionTolerance)

关于分区容忍性,Brewer 给出的定义是:“No set of failures less than total network failure is allowed to cause the system to respond incorrectly”, 即除了整个网络出现故障外,其它的故障都不能导致整个系统无法正确响应。分区容忍比较抽象,在此特别说明一下。

分布式系统中,节点间通过网络进行通信,然而可能因为一些故障,导致有些节点之间不连通,整个网络就分成了几块区域。数据就散布在了这些不连通的区域中,从而形成了分区。

当一个数据项只在一个节点中保存时,如果分区出现,那和该节点不连通的部分将无法访问这个数据了(即单点故障问题),这时的分区是无法容忍的。提高分区容忍性的办法就是将一个数据项复制到多个节点上(副本思想),在出现分区后,这一数据项就可能分布到各个区里,容忍性就提高了。

然而,要把数据复制到多个节点,就会带来一致性的问题,就是多个节点上面的数据可能是不一致的。要保证一致,每次写操作都要等待全部节点写成功,而等待期间系统是不可用的,从而带来可用性的问题。总的来说,数据存在的节点越多(副本越多),分区容忍性越高,但同时需要复制、更新的数据就越多,一致性就越难保证。为了保证一致性,更新所有节点数据所需要的时间就越长,可用性就会降低。

4.4 CAP——鱼与熊掌不可兼得

根据 CAP 理论,在分布式系统中,CAP 三者不可能同时被满足,在设计分布式系统时,工程师必须做出取舍,一般认为,CAP 只能选择其二。

CA without P

放弃 P(分区容忍),以保证 C(强一致性)和 A(可用性)。其实分区容忍并不是能否放弃的问题,只能是阻止,即不允许分区出现,一种直接的策略就是所有服务部署在一台服务器上,退化为单机系统。

这里存在一个争议问题,即怎样才算“舍弃 P”?其含义并不明确。

在分布式系统中,分区是无法完全避免的,设计师即便舍弃分区容忍,就一定可以保证一致性和可用性吗?当分区出现的时候,还是需要在 C 和 A 之间做出选择:选择一致性则需等待分区恢复,在此期间牺牲可用性;选择可用性,则无法保证各个分区数据的一致性。

某种意义上,舍弃分区容忍是基于一种假设,即分区出现的概率很低,远低于其它系统性错误。基于不存在分区问题的假设,CA 之间仍然存在矛盾:为了保证服务的可用性,那就必须避免单节点故障问题,即服务需部署在多个节点上,即便其中一个节点故障而不能提供服务,其它节点也能替代它继续提供服务,从而保证可用性;但是,这些服务是分布在不同节点上的,为了保证一致性,节点之间必须进行同步,任何一个节点的更新都需要向其它节点同步,只有同步完成之后,才能继续提供服务,而同步期间,服务是不可用的,因此,即便没有分区,可用性和一致性也不可能在任何时刻都同时成立。

对于分布式系统,鉴于分区不可避免,通常不会考虑舍弃分区容忍,同时考虑到分区出现的概率极低,可以采取一些策略来平衡分区对一致性和可用性的影响,这对设计师来说是一个不小的挑战,在本课程的后续章节中,我会结合具体的应用实例进一步说明。

CP without A

放弃 A(可用性),一旦分区发生,部分节点之间失去联系,为了保证一致性,需要等待受影响的服务所在的节点数据一致(本质上就是等待分区恢复),而等待期间无法对外提供服务。如此,CP 也是可以保证的,很多传统的数据库分布式事务都属于这种模式。

AP wihtout C

放弃 C(一致性),保证高可用并允许分区。一旦分区发生,节点之间可能会失去联系,为了高可用,每个节点只能用本地数据提供服务,而这样会导致全局数据的不一致性。


举报

相关推荐

0 条评论