- 分布式系统 要么CA, 要么CP,要么AP。无法同时满足CAP
一致性(Consistency)
原子的、串行的。分布式系统 的每一个节点在同一时刻有同样的值可用性(Availability)
非失败节点都应该在有限时间内给出请求的回应。(请求的可终止性)分区容错性(Partition tolerance)
分布式系统中的某个节点或者网络出现了故障的时候,整个系统仍然能对外提供满足一致性和可用性的服务举例理解:
假设分布式系统有G1,G2两个节点,初始值都是v0。
现在有一个client向系统写入了值v1,这里假设直接写的是节点G1。写完之后client再去从G2节点读取这个值,G1节点与G2节点网络故障。
满足了可用性,失去了一致性:
这时G1节点上的数据还未同步到G2节点,因此客户端读取到的是修改之前的值v0。
满足了一致性,失去了可用性:
client再去读取G2节点的数据时,client就会一直处于等待状态,需要等同步上才能使用。
该如何取舍:
- CA: 优先保证一致性和可用性,放弃分区容错。 这也意味着放弃系统的扩展性,系统不再是分布式的,有违设计的初衷。
- CP: 优先保证一致性和分区容错性,放弃可用性。在数据一致性要求比较高的场合(譬如:zookeeper,Hbase) 是比较常见的做法,一旦发生网络故障或者消息丢失,就会牺牲用户体验,等恢复之后用户才逐渐能访问。
- AP: 优先保证可用性和分区容错性,放弃一致性。NoSQL中的Cassandra 就是这种架构。跟CP一样,放弃一致性不是说一致性就不保证了,而是逐渐的变得一致。
