CAP概述

CAP其实就是一致性,可用性,分区容错性这三个词的缩写

一致性(C:Consistency)
可用性(A:Available)
分区容错性(P:Partition Tolerance)

一致性:

Consistency 中文叫做”一致性”。意思就是在写操作之后,后面Consumer无论访问集群中的任何一台机器,数据都是一模一样的.Zookeeper就是强一致性.


可用性:

Availability 中文叫做”可用性”,意思是只要收到用户的请求,服务器就必须给出回应。 用户可以选择向 G1 或 G2 发起读操作。不管是哪台服务器,只要收到请求,就必须告诉用户,到底是 v0 还是 v1,否则就不满足可用性。

分区容错性:

Partition tolerance,中文叫做”分区容错”。 分布式系统在遇到任何网络分区故障的时候,仍然需要能够对外提供满足一致性和可用性的服务,除非是整个网络环境都发生了故障,不能出现脑裂的情况. 大多数分布式系统都分布在多个子网络。每个子网络就叫做一个区(partition)。分区容错的意思是,区间通信可能失败。比如,一台服务器放在中国,另一台服务器放在美国,这就是两个区,它们之间可能无法通信.

具体描述


一个分布式系统不可能同时满足一致性、可用性和分区容错性这三个基本需求,最多只能同时满足其中的两项

放弃P满足AC,将数据和服务都放在一个节点上,避免因网络引起的负面影响,充分保证系统的可用性和一致性,但是放弃了P就意味着放弃了系统的可扩展性,这是最不可能的,不能不用分布式和微服务
放弃A,满足PC,当节点故障或者网络故障的时候,受到影响的服务需要等待一定的时间,在这个时间内,系统无法对外提供服务,暂时是不可用的状态
放弃C满足AP,系统无法保证数据的事实一致性,是最终一致性,成的可能是,尤其是读写分离的时候,我明明插入了一个数据库的一条记录,但是我从另外一个数据库里面就是查不出来,那我放弃C是合适的吗.


TIPS:不可能把所有应用全部放到一个节点上,因此架构师的精力往往就花在怎么样根据业务场景在A和C直接寻求平衡;

为什么一致性和可用性不能同时存在


假如有 A B C三台机器,如何保证三台机器的一致性,假设A机器在写操作,此时必须暂时不能让Consumer访问B机器和C机器,因为此时B机器和C机器数据都不是最新的.只能等A机器写操作完毕,和B机器C机器进行数据同步之后(数据同步完了就是最新的),才能允许Consumer对B机器和C机器进行读写操作.在这个锁定期间B机器和C机器是不可用的.

所以无法同时做到一致性和可用性.

一致性的分类

一致性是指从系统外部读取系统内部的数据时,在一定约束条件下相同,即数据变动在系统内部各节点应该是同步的。根据一致性的强弱程度不同,可以将一致性的分类为如下几种:

强一致性:(strong consistency)。任何时刻,任何用户都能读取到最近一次成功更新的数据。

单调一致性:(monotonic consistency)。任何时刻,任何用户一旦读到某个数据在某次更新后的值,那么就不会再读到比这个值更旧的值。也就是说,可获取的数据顺序必是单调递增的。

会话一致性:(session consistency)。任何用户在某次会话中,一旦读到某个数据在某次更新后的值,那么在本次会话中就不会再读到比这值更旧的值,会话一致性是在单调一致性的基础上进一步放松约束,只保证单个用户单个会话内的单调性,在不同用户或同一用户不同会话间则没有保障。

最终一致性:(eventual consistency)。用户只能读到某次更新后的值,但系统保证数据将最终达到完全一致的状态,只是所需时间不能保障。

弱一致性:(weak consistency)。用户无法在确定时间内读到最新更新的值。