1、什么是CAP
C代表一致性(Consistency),A代表可用性(Availability),P代表分区容错性(Partition Tolerance)。
1.1 一致性
定义:对某个指定的客户端来说,读操作保证能返回最新的写操作结果。
因为无法保证实时一致性,所以得从客户端角度来看。咋看这个定义还有点像java里volatile的可见性语义。
1.2 可用性
定义:非故障的节点在合理的时间内返回合理的响应(不是错误和超时的响应)。
这个定义中有三个注意的点即非故障节点、合理的时间内、合理的响应。
只有非故障节点才能满足业务正常;只有在合理的时间内,用户才能接受;只有返回合理的响应,用户才能接受。
1.3 分区容错性
定义:当出现网络分区后,系统能够继续“履行职责”。
定义中的网络分区出现的情况有很多,比如丢包、连接中断、拥塞。
定义中的履行职责代表系统能够返回合理的响应。
2、讨论CAP的场景
讨论CAP就脱离不了具体的场景,这个场景会考虑一致性、可用性、分区容错性问题。
场景:在一个分布式系统(指互相连接并共享数据的节点的集合)中,当涉及读写操作时,只能保证一致性、可用性、分区容错性三者中的两个,另外一个必须牺牲。
实际上只能保证CP或AP。如果我们选择了CA而放弃了P,当发生分区现象时,为了保证C,系统要禁止写入,当有写入请求时,系统返回error(例如,当前系统不允许写入),这又和A冲突了,因为A要求合理的响应。
2.1 CP架构
当出现网络分区时,N1已被更新为了y,N2已被更新为了x,y无法同步到x。当C访问N2时,系统返回错误。当C访问N1,就可得到最新的y值,所以保证了一致性。因为返回错误,所以牺牲了可用性。因为分区出现时,系统还可以履行职责,所以就保证了分区容错性。
2.2 AP架构
当出现网络分区时,N1已被更新为了y,N2已被更新为了x,y无法同步到x。当C访问N2时,系统返回x。当C访问N1,就可得到最新的y值。因为访问N1或N2,会返回不同的值,所以牺牲了一致性。因为访问N1或N2都可以返回合理的值,所以保证了可用性。因为分区出现时,系统还可以履行职责,所以就保证了分区容错性。