CAP 定理,指出对于一个分布式系统来说,不可能同时满足以下三点:

  • Consistence(A read is guaranteed to return the most recent write for a given client.)
  • Availability(A non-failing node will return a reasonable response within a reasonable amount of time (no error or timeout).)
  • Partition Tolerance(The system will continue to function when network partitions occur.)

将我自己的理解对上面的三点进行翻译:

  • 数据一致性(Consistence),如果一个系统对一个写操作返回成功,那么之后的读请求都必须读到这个新数据;如果返回失败,那么所有读操作都不能读到这个数据。
  • 服务可用性(Availability),所有读写请求在一定时间内得到响应,可终止不会一直等待。
  • 分区容错性(Partition Tolerance),在网络分区的情况下,被分隔的节点仍能正常对外提供服务。

首先需要明确下 CAP 定理是针对分布式系统来说的,那么需要先明确什么是分布式系统。

摘录维基百科上的一段描述:

分布式系统是一组电脑,通过网络相互连接传递消息与通信后并协调它们的行为而形成的系统。
详细参见

分布式系统当中的多台电脑之间是通过网络之间传递消息,那么一定会由于网络的不可靠产生分区的情况。如下图示例:

网络分区示意图

从上图可以看出来,网路分区之前的集群当中有 4 个 NODE 节点组成。网络分区后,集群网络被分成了 2 个分区,NODE1 和 NODE2 是一个分区。NODE3 和 NODE4 是一个分区。对客户端来看,这 2 个分区都可以提供服务,但是如果是更新数据的话,可能引起两个分区的数据不一致。

在分布式系统当中理解 Partition Tolerance 很关键,下面是对它的一些理解:

The network will be allowed to lose arbitrarily many messages sent from one node to another

网络分区的情况符合该定义,网络丢包的情况也符合以上定义,另外节点宕机,其他节点发往宕机节点的包也将丢失,这种情况同样符合定义。现实情况下我们面对的是一个不可靠的网络、有一定概率宕机的设备,这两个因素都会导致 Partition,因而分布式系统实现中 P 是一个必须项,而不是可选项。

对于分布式系统工程实践,CAP理论更合适的描述是:在满足分区容错的前提下,没有算法能同时满足数据一致性和服务可用性。

CAP 理论指出:无法设计一种分布式协议,使得同时完全具备 CAP 三个属性

  • 该种协议 下的副本始终是强一致性
  • 服务始终是可用的
  • 协议可以容忍任何网络分区异常

分布式系统协议只能在 CAP 这三者间所有折中。

用一个反例证明不存在 CAP 兼具的系统。

假设系统只有两个副本 A 和 B,Client 更新这两个副本。
假设在网络分化时,Client 与副本 A 可以正常通信,但副本 B 与 Client、副本 B 与副本 A 无法通信,此时,Client 对副本 A 更新的信息永远无法同步到副本 B 上。
如果希望系统依旧具有强一致的属性,则此时需要停止更新服务,即不再修改数据,从而让副本 A 与副本 B 保持一致。
如果希望系统依旧可以提供更新服务,则只能更新副本 A 而无法更新副本 B,此时无法保证副本 A 与副本 B 一致。

【参考资料】

  1. https://www.cnblogs.com/bangerlee/p/5328888.html
  2. https://zh.wikipedia.org/wiki/CAP%E5%AE%9A%E7%90%86
  3. https://zh.wikipedia.org/wiki/%E5%88%86%E5%B8%83%E5%BC%8F%E8%AE%A1%E7%AE%97
  4. http://robertgreiner.com/2014/08/cap-theorem-revisited/
  5. https://github.com/feixiao/Distributed-Systems

—EOF—