在上篇文章中,想到一个问题就是redis与zookeeper在CAP理论中的不同之处?
今天就整理一份CAP与BASE理论,然后再讨论一下上面的这个问题;
1. 分布式理论-CAP
CAP理论指的是一个分布式系统最多只能同时满足一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance)这三项中的两项。参考下图(图片来源于网络)
Consistency
Consistency:一致性,数据在多个实例之间能够保证数据的一致性;
相当于集群中的每个节点的数据状态是一致的,如果用户1设置的是value3,而用户2读取到的是value2,则就产生了数据不一致问题,不满足一致性要求了;
Availability
Availability:可用性,表示只要收到用户请求,服务器就必须做出响应;
用户只要向s1或者s2发出请求,不管数据是否一致,都必须要返回数据;
Partition tolerance
Partition tolerance:分区容错性,首先说一下这个分区:假如有两个机房:A区和B区,A区节点互通,但是无法与B区中的节点连通时,就导致了整个服务被切分成了两个独立的区;
分区容错性:在遇到任何网络分区故障时,仍然能够对外提供满足一致性和可用性的服务,也就是支持容忍被服务被分布A区和B区独立的情况;
分区1和分区2网络不通的时候,可以各自提供服务(相当于被切分成了两份服务);
1.1 CA without P
两个问题:为什么CA不可同时满足?为什么必须要有P?
为什么CA不可同时满足?
比如上图这种场景:
用户1在写入value2到s1时,s1还未将数据同步到s2,此时用户2从s2读取数据,读取到未更新的value1;(满足可用性,不满足可用性)
用户1在写入value2到s1时,s1将数据同步到s2期间,禁止s2接收请求,s1与s2数据一致后,再允许s2接收请求;(满足一致性,不满足可用性);
所以无法做到CA;
为什么必须要有P?
分区容错性P其实就是每个服务都会部署多个节点,这样就可以保证此服务的一个节点挂了之后,此服务的其他节点依然可以响应,这就是分区容错性。如果不能够容忍区容错性,那就相当于有一个节点挂了之后,整个服务都不可用;这对于分布式系统来说,肯定是不合理的;
1.2 CP without A
放弃可用性,但必须保证数据的一致性,比如zookeeper的设计就是基于此模式;
1.3 AP wihtout C
放弃一致性,但必须保证可用性,允许数据出现某种情况的不一致,但必须保证可用性,比如一些nosql;
2. 分布式理论-BASE
什么是BASE?
BASE理论是Basically Available(基本可用),Soft State(软状态)和Eventually Consistent(最终一致性)的缩写,BASE的核心思想就是即使无法做到强一致性(Strong consistency),但每个应用都可以根据自身的业务特点,采用适当的方式来使系统达到最终一致性(Eventual consistency)。
2.1 基本可用(Basically Available)
是当服务出现问题时,能保证核心功能可用,比如双11购物:不允许修改收货地址等,但能保障下单整体流程的可用;
2.2 软状态(Soft State)
系统中数据可以存在中间状态,比如订单正在支付,状态可以是支付中,数据同步时可以是同步中等;
2.3 最终一致性(Eventually Consistent)
最终一致性强调的是系统中的数据副本,在经过一段时间的同步后,最终能达到一致的状态。如订单的"支付中"状态,最终会变 为“支付成功”或者"支付失败",使订单状态与实际交易结果达成一致,但需要一定时间的延迟、等待。
总之:BASE通过牺牲强一致性来获得可用性,并允许数据段时间内的不一致,但是最终达到一致状态。