在分布式系统架构下,CAP理论已经成为公认的定理,随着二十年技术的发展,CAP理论的解读也发生了些变化。本文简要介绍CAP理论的原理及证明思路,以及在分布式架构下的适用性,以加深理解。
CAP理论是计算机科学家Eric Brewer在2000年提出的理论猜想,在2002年被证明并成为分布式计算领域公认的定理,其理论的基本观念是,在分布式系统中不可能同时满足以下三个特性:
在"CAP Twelve Years Later: How the “Rules” Have Changed"一文中给CAP做了简单的定义:
The CAP theorem states that any networked shared-data system can have at most two of three desirable properties:consistency © equivalent to having a single up-to-date copy of the data; high availability (A) of that data (for updates); and tolerance to network partitions §
CAP理论中的一致性指的是Serializability可线性化的意思,也就是非常特殊的强一致性,但是这里的Consistency和ACID中的一致性是两回事,事务中的一致性包含了对状态的后续处理而CAP定理并不涉及到状态的后续处理。因此CAP中的一致性指"all nodes see the same data at the same time",即更新操作成功后,所有节点在同一时间的数据完全一致。对于一致性的理解,可以从客户端和服务端两个不同的视角来分析。
一致性一般在并发读写的时候才出现这个问题,需要结合并发读写的场景考虑
上述例子用可线性化解释就是:
如果 B 操作在成功完成 A 操作之后,那么整个系统对 B 操作来说必须表现为 A 操作已经完成了或者更新的状态。
如果系统内部发生了故障从而导致系统的节点无法发生一致性变化,比如N2节点无法同步N1节点的数据。这也意味着客户端查询最新数据的时候,部分节点很可能会看到旧数据,或者说获取到不同版本的数据。此时,为了保证分布式系统对外的数据一致性,于是选择不返回任何数据。
可用性指"reads and writes always succeed",即要求系统内的节点们接收到了无论是写请求还是读请求,都要能处理并给回响应结果。同时有几点必须满足的条件:
一般在描述一个系统可用性时,通过停机时间来计算,比如某某系统可用性可以达到5个9,意思就是说该系统的可用水平是99.999%,即全年停机时间不超过(1-0.99999)36524*60 = 5.256min,这是一个极高的要求。
可用性分类 | 可用水平(%) | 年可容忍停机时间 |
---|---|---|
容错可用性 | 99.9999 | <1 min |
极高可用性 | 99.999 | <5 min |
具有故障自动恢复能力的可用性 | 99.99 | <53 min |
高可用性 | 99.9 | <8.8h |
分布式系统架构下会有多个节点,这些节点之间通过网络进行通信,但是当网络故障或其它原因节点之间通信出现异常,当前的分布式系统就出现了分区。分区容错性指"the system continues to operate despite arbitrary message loss or failure of part of the system",即分布式系统在遇到某节点或网络分区故障的时候,仍然能够对外提供满足一致性和可用性的服务。
CAP的证明是基于异步网络的,假设两个节点集{DC1, DC2},由于网络异常导致DC1和DC2之间所有的通讯都断开了,如果在DC1中写,在DC2中读刚写的数据,DC2中返回的值不可能是DC1中的更新值。由于A的要求,DC2一定要返回这次读请求,由于P的存在,导致C一定是不可满足的。
1)分布式系统中正常运行流程
下图展示了分布式系统正常运转的流程,用户向N1节点请求数据更新,程序A更新数据库V0->V1,分布式系统将数据进行同步操作,将V1更新同步到N2节点,使得N2中的数据V0也更新为V1,N2中的数据再响应N2的请求。
2)网络分区出现故障场景
假设在N1和N2之间网络出现通信故障,有用户向N1发送数据更新请求,N1中的数据V0将被更新为V1,由于网络异常数据更新没有同步到N2,所以N2中的数据依旧是V0。这个时候,有用户向N2发送数据读取请求,由于数据还没有进行同步,应用程序没办法立即给用户返回最新的数据V1。
上述过程证明了要满足分区容错性的分布式系统,只能在一致性和可用性两者中,选择其中一个。
根据CAP理论,在分布式系统中无法同时满足一致性、可用性和分区容错性,在实际应用中又如何来进行取舍。
舍弃分区容错性意味着将所有的服务器搬到一个网络节点内,显然不满足分布式系统的可伸缩性扩展要求。因此在分布式系统中P是一个基本要求,不选 P,一旦发生分区错误,整个分布式系统就完全无法使用了,这是不符合实际需要的。所以,对于分布式系统,我们只能能考虑当发生分区错误时,如何选择一致性和可用性。CA模型常见的例子包括单站点数据库、集群数据库、LDAP和XFS文件系统等,通常是通过两阶段提交和缓存验证协议实现的。
舍弃A保证Consistency,不同节点之间需要保证数据的一致性,但是因为网络分区的不稳定,可能出现其它节点的数据没有及时更新。如果一个分布式系统不要求强的可用性,即允许系统停机或者长时间无响应的话,就可以在CAP三者中保障CP而舍弃A。这样的分布式系统一旦发生网络故障或者消息丢失等情况,就要牺牲用户体验,等数据一致后再让用户访问系统。CP模型下典型的场景是分布式数据库,通过悲观锁机制或少数分区不可用来优先保证数据一致性。像分布式缓存Redis、分布式协调中心Zookeeper,满足分布式系统下的数据一致性是最基本的要求。
AP模型是在保证高可用和分区容错性的同时,舍弃数据一致性。为了保证高可用性,分布式系统下的不同节点需要立即返回结果给客户端,这样可能会出现不同节点之间的数据不一致,也就是会出现全局数据的不一致。也可以说是舍弃了数据的强一致性,保证的是数据的最终一致性(BASE理论)。AP模型使用的场景非常多,在一些高并发的系统中利用排队和乐观锁机制优先保证系统的可用性,避免造成系统的阻塞。
CAP理论的三种特性不是Boolean类型,而是范围类型。比如对于可用性,与业务的时延要求有关,当业务的时延要求降低后,又能达到可用性要求。对于分区容错性,在Raft多数派选举机制下,当多数节点出现问题后才会投票确认分区出现故障。
CAP理论中三个特性只能满足二个其实又一定的误导性。首先,在系统不存在分区P的情况下就没什么理由牺牲C和A。其次,C与A之间的取舍可以在同一系统内以非常细小的粒度反复发生,而每一次的决策可能因为具体的操作,甚至因为特定的数据或用户需求而有所不同。最后,这三种性质都可以在程度上衡量,并不是非黑即白的有或无。可用性显然是在0%到100%之间连续变化的,一致性分很多级别(强一致性、弱一致性和最终一致性),连分区也可以细分为不同含义,如系统内的不同部分对于是否存在分区可以有不一样的认知。
在大规模的分布式系统里,会把海量的数据进行切分存储到不同的节点上,同时保证高可用也需要对这些节点配置副本备份。
在分布式数据库系统中,分区容忍性是必须的,分区是始终会存在的,因此需要在一致性和可用性之间进行权衡。
在实际的分布式数据库系统中,基于分片解决扩展性问题并可以实现负载均衡,当某个分片服务不可用时,只会影响部分业务,即服务降级。同时基于多副本构成集群架构,提升系统的高可用。
假设N表示数据的副本总数、W表示更新数据时需要保证写完成的节点数、R表示读取数据时需要读取的节点数。
不同的N,W,R组合,是在可用性和一致性之间取一个平衡,以适应不同的应用场景。
根据专家的分析,CAP并不是一个严谨的定律,并不是牺牲了Consistency,就一定能同时获得Availability和Partition Tolerance。CAP定理有以下不足:
在分布式系统中,面对CAP权衡时,通常的做法会选择AP舍弃C(舍弃强一致性但保证最终一致性),这其实也是分布式领域的另外一个理论,叫BASE理论。BASE是指基本可用(Basically Available)、软状态( Soft State)、最终一致性( Eventual Consistency)。BASE理论是对CAP理论的延伸,其核心思想是:
即使无法做到强一致性(Strong consistency),但每个应用都可以根据自身的业务特点,采用适当的方式来使系统达到最终一致性(Eventual consistency)
基本可用是指分布式系统在出现故障时,允许损失部分可用性,即保证核心可用。
软状态是相对原子性来说的
比如在分布式数据库MySQL的复制中一般一份数据会有多个副本,允许不同节点间副本同步的延时就是软状态的体现。
系统不可能一直是软状态,必须有个时间期限。在期限过后,应当保证所有副本保持数据一致性,从而达到数据的最终一致性。这个时间期限取决于网络延时,系统负载,数据复制方案设计等等因素。最终一致性是弱一致性的特定形式,官方的定义是:
系统能够保证在没有其他新的更新操作的情况下,数据最终一定能够达到一致的状态,因此所有客户端对系统的数据访问最终都能够获取到最新的值。
最终一致性模型有5种变种:
参考资料:
转载请注明原文地址:https://blog.csdn.net/solihawk/article/details/124442443
文章会同步在公众号“牧羊人的方向”更新,感兴趣的可以关注公众号,谢谢!