书接上文
在一个分布式系统(指互相连接并共享数据的节点的集合)中,当涉及到读写操作时,只能保证
一致性(Consistence)
、可用性(Availability)
、分区容错性(Partition Tolerance)
三者中的两个,另外一个必须被牺牲
对某个指定的客户端来说,读操作保证能够返回最新的写操作数据
非故障的节点在合理的时间内返回合理的响应(不是错误和超时的响应)
当出现网络分区(发生丢包、连接中断、拥塞等)后,系统能够继续按预期工作
首先,你肯定是要选P分区容忍性
的,因为网络本身是无法100%可靠的,所以分区是必然的,你也不想网络一点抖动你系统就挂了吧。如果不选分区容忍性
,那么发生分区时,为了保障一致性
,系统要禁止写操作,当发生写操作时返回err,这又和可用性
冲突了,所以理论上你必须选P分区容忍性
。
CP一致性+分区容忍性:前面说了,当发生分区时,为了保障一致性
,要禁止写操作返回err,所以这时候可用性
是不能被满足的,所说CAP只能满足CP。
AP可用性+分区容忍性:为了保障可用性
,发生分区时,底层数据无法同步,必然造成数据的不一致,这时系统还要对外提供服务,所以CAP只能满足AP。
CAP还有一些细节需要注意。
一致性
是不可能完美实现的可用性
和一致性
是可以同时被满足的ACID是数据库管理系统为了保证事务的正确性而提出来的一个理论,包含四个约束: