CAP 是一个分布式系统中的定理。
“定理”这个词,自带一种让人信服的魅力——定理就是真理,是经过逻辑推演后被证明为正确的陈述。就像勾股定理:任意直角三角形的两条直角边平方和,一定等于斜边的平方。它简单、直接、绝对正确,我们完全可以放心地用它指导工程实践。
那么,CAP 定理到底在说什么?我们分两次聊透它。今天先从工程实践的角度,谈谈如何正确理解 CAP 定理。
要准确掌握 CAP 定理,可以从下面三个维度切入。
一、应用场景
CAP 定理只适用于 存在数据共享的分布式系统,并且只针对 数据的读、写操作。
- 单点部署的系统,肯定不是分布式系统,不适用于 CAP 定理(有同学会说单点部署的系统就是 CA 模型,我个人并不认同)。
- 多节点部署的分布式系统,如果节点之间没有连接,或者虽有连接但不存在数据同步或共享,同样不适用 CAP 定理。
- 分布式系统中的操作有很多,比如心跳探活、选主等,但这些都不适用 CAP。只有对数据的读、写操作,才是 CAP 定理讨论的范围。
二、CAP 释义
C 即数据的一致性(Consistency),A 即读写的可用性(Availability),P 即分区的容错性(Partition Tolerance)。
- C——一致性:不能简单理解为两个有数据同步关系的节点就拥有一致的数据,这不现实。更准确的角度是站在客户端:访问分布式系统中任何一个非故障节点,都能拿到任意一条写入成功的数据。换句话说,只要数据写入成功,换到任何一个非故障节点去读,都应该能读出来。
- A——可用性:也不能只解释成“每个请求都能得到响应”,失败响应同样是响应,但这不能算“可用”。依然站在客户端来看:访问任何一个非故障节点,都能在合理时间内得到一个合理的结果。
- 这个结果可以不是最新的,允许是老数据,但绝不能是错误数据,也不能是失败或超时响应。
- P——分区容错性:即使分布式系统中各节点之间发生了网络中断(分区),系统仍然要正常工作,履行自己的职责。打个比方:一个团被打散之后,各连、各排、各班之间虽然不能直接通信,但仍然会自发组织巷战,继续消灭敌人——这就是分区容错。
- 本质上,C、A、P 是从三个不同维度对分布式系统提出的需求描述。
三、CAP 三者的关系
在一个分布式系统中、在同一时空中,C、A、P 三个需求不可能同时被满足,最多只能满足其中两项:要么 CA、要么 CP、要么 AP。未被满足的那一项,只能暂时舍弃,再在事后选择性地弥补。
- CA 模型:客户端从任何一个非故障节点都能读到最新数据,且访问时能在合理时间内得到合理结果。CA 模型的分布式系统意味着 P 需求未满足,即系统所处的网络一切正常,没有发生分区。注意,它仍然是分布式系统,不是单点部署。未满足的 P 需求,无需事后弥补。
- CP 模型:网络已经发生了分区。客户端可以从任何一个非故障节点读到最新数据(保证了 C),但不能对非故障节点进行数据写入,因为此时一旦写入,就无法再保证“从任何一个非故障节点都能读到最新数据”,所以写操作是失败的。也就是说,A 需求只满足了 50%(读操作可用),未满足的 50%(写操作)只能在分区消失后尽快恢复。
- AP 模型:网络发生分区时,客户端可以从任何一个非故障节点进行读取和写入,但无法保证读到的数据是最新的(牺牲了 C)。数据虽然不是最新的,但一定是合理的;写入的数据因为分区暂时无法同步,这部分未满足的 C 需求,也需要在分区消失后尽快通过技术手段恢复。
在大部分时间里,分布式系统的网络是正常的,可以简单理解为 99.9% 的时间网络未分区,此时系统处于 CA 模型;只有 0.1% 的时间,系统才会切换到 CP 或 AP 模型。
所以,CAP 定理虽然看上去更像一种静态描述,但我们必须动态地看到分布式系统中 CAP 模型的转换:大多数时间系统处于 CA 状态,当分区出现后:
- 如果选择保 C,则:CA → CP;分区消失后,CP → CA。
- 如果选择保 A,则:CA → AP;分区消失后,AP → CA。
总结一下本文的关键点:
- CAP 定理仅适用于 存在数据共享的分布式系统,而且只针对 数据的读、写操作。
- CAP 的完整解释:
- C:访问任何一个非故障节点,都能拿到任意写入成功的数据;
- A:访问任何一个非故障节点,都能在合理时间内得到合理结果;
- P:节点间即便发生网络中断,系统仍要继续履行职责。
- 在同一时空下,分布式系统无法同时满足 C、A、P 三个需求,最多只能满足其中两者,第三者会被暂时舍弃。
- 大多数时间分布式系统运行在 CA 模型下,只在极少数时间才会转入 CP 或 AP 模型,并在分区恢复后回到 CA。
|