含义

CAP原则又称CAP定理,指的是在一个分布式系统中,一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance)。CAP 原则指的是,这三个要素最多只能同时实现两点,不可能三者兼顾。

  • C:Consistency 中文叫做”一致性”。意思是,写操作之后的读操作,必须返回该值。
  • A:Availability 中文叫做”可用性”,意思是只要收到用户的请求,服务器就必须给出回应。
  • P:Partition tolerance,中文叫做”分区容错”。大多数分布式系统都分布在多个子网络。每个子网络就叫做一个区(partition)。分区容错的意思是,区间通信可能失败。 :::tips 注:一般来说,分区容错无法避免,因此可以认为 CAP 的 P 总是会出现。分区相当于对通信的时限要求。系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在C和A之间做出选择CAP 定理告诉我们,剩下的 C 和 A 无法同时做到。 :::

    为什么一致性和可用性不可能同时成立?

    答案很简单,因为可能通信失败(即出现分区容错)

举例来讲:
CAP理论 - 图1
如图G1和G2是一个分布式系统,用户通过client进行操作。
某条记录是v0,用户向G1发起一个写操作,将其改为v1。接下来,用户的读操作就会得到v1。这就叫一致性。
问题是,用户有可能向G2发起读操作,由于G2的值没有发生变化,因此返回的是v0。G1和G2读操作的结果不一致,这就不满足一致性了。
如果保证G2的一致性,那么G1必须在写操作时,锁定G2的读操作和写操作。只有数据同步后,才能重新开放读写。锁定期间,G2不能读写,没有可用性。
如果保证G2的可用性,那么势必不能锁定G2,所以一致性不成立。
综上所述,G2无法同时做到一致性和可用性。系统设计时只能选择一个目标。如果追求一致性,那么无法保证所有节点的可用性;如果追求所有节点的可用性,那就没法做到一致性。

:::info 实际上,是为了P(分区容错性),才必须在C(一致性)和A(可用性)之间任选其一。分区的情况很少出现,CAP在大多时间能够同时满足C和A。但是实际设计分布式系统的时候须考虑到。 :::