C : Consistency 一致性,A : Availability 可用性, P : Partition tolerance 分区容错
C A P ,在分布式系统中,不可能同时满足,只能满足其中的两个
1. P-> 分区容错:一个分布式系统,是由多个子网络组成的,分区容错就是指:各个子网络之前的通信可以失败,这个我们无法保证100%避免。所以,CAP中的P,是一定存在的。剩下的C和A就只能满足一个了。
2. A -> 可用性:可用性是指:当前系统只要收到客户端的请求,就必须要给出回应。就下图来讲,无论是客户端请求A服务,还是B服务,都会给到客户端一个响应。要实现高可用,就需要通过集群来保证。
3. C -> 一致性:一致性是指:客户端写入的数据,在下一次读取时,是否一定能读取到。
一致性又分为:(1)强一致性,(2)弱一致性,(3)最终一致性
强一致性:对数据的一致性要求极其严格,客户端写入数据后,无论访问集群中的哪一个节点,都需要获取到最新的数据。也就势必会已损失性能为代价。
弱一致性:对数据实时的准确性不是特别的高,可能系统在一段时间内,才能将数据同步,实现一致性。最终一致性是一致性的特例。
4. 为什么一致性和可用性,不能同时满足:
如上图:客户端向DB1写入了a=1的数据,如果系统要保证严格的强一致性,那么一定要保证将当前数据同步到DB2以后,DB2才能对外提供服务,那么这段时间,对于DB2来说,是不可用的。
如果系统为若一致性,那么可能在数据还没有同步到DB2时,DB2就已经对外提供访问,它提供的数据就是不准确的,也就做不到一致性。
导致两者不能同时成立的原因:有可能是分区容错导致的,也有可能是自身的原因。比如当前服务器配置较低,同步数据较慢
CAP可以产生三种组合,为什么P是一定要得呢?为什么不需要保证CA呢?
因为要能完全避免分区容错性,那么就要避免服务之间有网络的通信,既然是分布式架构系统,就一定会有网络通信,所以如果想要保证CA,系统就会演变成单体架构