• 分布式系统 要么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一样,放弃一致性不是说一致性就不保证了,而是逐渐的变得一致。