【分布式基础】7.cap原则与base理论

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/CharJay_Lin/article/details/83216517

1.CAP原则

C:一致性(Consistency): 所有节点上的数据,时刻保持一致
A:可用性(Availability):每个请求都能够收到一个响应,无论响应成功或者失败
P:分区容错 (Partition-tolerance):表示系统出现脑裂以后,可能导致某些server与集群中的其他机器失去联系
CP / AP
CAP理论仅适用于原子读写的Nosql场景,不适用于数据库系统(因为容错在数据库系统是不可能的!)

熟悉CAP的人都知道,三者不能共有,如果感兴趣可以搜索CAP的证明,在分布式系统中,网络无法100%可靠,分区其实是一个必然现象,如果我们选择了CA而放弃了P,那么当发生分区现象时,为了保证一致性,这个时候必须拒绝请求,但是A又不允许,所以分布式系统理论上不可能选择CA架构,只能选择CP或者AP架构。

对于CP来说,放弃可用性,追求一致性和分区容错性,我们的zookeeper其实就是追求的强一致。

对于AP来说,放弃一致性(这里说的一致性是强一致性),追求分区容错性和可用性,这是很多分布式系统设计时的选择,后面的BASE也是根据AP来扩展。

2.BASE理论

基于CAP理论,CAP理论并不适用于数据库事务(因为更新一些错误的数据而导致数据出现紊乱,无论什么样的数据库高可用方案都是徒劳) ,虽然XA事务可以保证数据库在分布式系统下的ACID特性,但是会带来性能方面的影响;

eBay尝试了一种完全不同的套路,放宽了对事务ACID的要求。提出了BASE理论
(1)Basically available : 数据库采用分片模式, 把100W的用户数据分布在5个实例上。如果破坏了其中一个实例,仍然可以保证80%的用户可用
(2)soft-state: 在基于client-server模式的系统中,server端是否有状态,决定了系统是否具备良好的水平扩展、负载均衡、故障恢复等特性。(比如支付,有个下单待支付的状态,这个就是软状态,直到异步回调更新支付状态
Server端承诺会维护client端状态数据,这个状态仅仅维持一小段时间, 这段时间以后,server端就会丢弃这个状态,恢复正常状态
(3)Eventually consistent:数据的最终一致性

BASE解决了CAP中理论没有网络延迟,在BASE中用软状态和最终一致,保证了延迟后的一致性。BASE和 ACID 是相反的,它完全不同于ACID的强一致性模型,而是通过牺牲强一致性来获得可用性,并允许数据在一段时间内是不一致的,但最终达到一致状态。

3.为什么不能同时满足CAP原则

3.1cap定义

Consistency (一致性):
“all nodes see the same data at the same time”,即更新操作成功并返回客户端后,所有节点在同一时间的数据完全一致,这就是分布式的一致性。一致性的问题在并发系统中不可避免,对于客户端来说,一致性指的是并发访问时更新过的数据如何获取的问题。从服务端来看,则是更新如何复制分布到整个系统,以保证数据最终一致。

Availability (可用性):
可用性指“Reads and writes always succeed”,即服务一直可用,而且是正常响应时间。好的可用性主要是指系统能够很好的为用户服务,不出现用户操作失败或者访问超时等用户体验不好的情况。

Partition Tolerance (分区容错性):
即分布式系统在遇到某节点或网络分区故障的时候,仍然能够对外提供满足一致性和可用性的服务。

分区容错性要求能够使应用虽然是一个分布式系统,而看上去却好像是在一个可以运转正常的整体。比如现在的分布式系统中有某一个或者几个机器宕掉了,其他剩下的机器还能够正常运转满足系统需求,对于用户而言并没有什么体验上的影响。

3.2证明例子

只能满足CA不能满足P的理解
用异地DB来举例。假如分别在A和B两地部署了DB。两个DB均能提供数据读写服务。对DB的要求是如果进行一个数据写入操作,必须是两地DB同时更新才能算成功。那么此时这个部署是满足C以及A,因为写入一个数据后,在两个结点是同时可以看到,而且在进行一个操作后,也是有成功的结果,所以同时满足CA。如果此时出现网络故障,那么CA是不能保证的,也就是说P的条件达不到。因此在这种情况只能满足CA不能满足P。
只能满足AP不能满足C的理解
还用异地DB来举例。此时对DB的要求改为操作其中一个DB成功就算成功,另一个DB会根据binlog之类的进行同步。那么此时这个部署是满足A以及P的,因为写入一个数据后,可以返回一个结果,同时当A地或者B地出现故障,不影响仍然能提供服务,所以同时满足AP,但是在进行一个操作后,因为同步的原因两边会出现短暂的数据不一致,这是无法满足C的,当AB两地出现网络故障时,数据的差异会增大,更加无法满足C。
只能满足CP不能满足A的理解
继续用异地DB来举例。此时对DB的要求是写数据时,必须同时写入到两个DB才能算成功,同时如果有一个写入失败,将停止写入操作的权限只提供读的操作。那么此时这个部署是满足C以及P的,因为写入一个数据后,在两个结点同时能看到,当出现网络故障时,将会停止写入操作权限只提供读取操作。那么CP是可以满足的而A是无法满足的。
当然在目前海量数据面前,往往会舍弃C,而保证AP,对与数据的一致性,只要求最终一致即可,在过程中是会出现差异的状况,比如在不同地方的人对某个新闻或者商品进行评论,在一定时刻内是不需要实时显示出来的,只要保证最终会出现即可。

猜你喜欢

转载自blog.csdn.net/CharJay_Lin/article/details/83216517
今日推荐