来自维基百科的CAP定理定义: https://en.wikipedia.org/wiki/CAP_theorem
分布式计算机系统不可能同时提供以下所有三种保证:
- 一致性(每次读取都会收到最近的写入或错误)
- 可用性(每个请求都收到响应,但不保证它包含最新版本的信息)
- 分区容差(尽管由于网络故障导致任意分区,系统仍继续运行)
我的想法:
对于任何具有CA的系统,它们可以在没有分区的情况下正常运行。当存在分区时,系统可以回退到CP或AP,这可以继续运行。由于系统可以继续运行,因此它也满足P.因此,任何CA系统也是CAP系统。因此,声称所有CAP不可能在系统中共存是错误的。
答案 0 :(得分:2)
C和A意味着系统在分区面前提供这些保证。因此,在分区期间放弃这些属性会使属性保持不变。
CA权衡仅在分区期间相关(因为没有分区我们可以放弃P并获得CA)。然后,你需要决定。
实际相关的选择是CP与AP,因为分区总是可以发生。
答案 1 :(得分:1)
首先,关于你的假设。
其实CA
和CP
是一样的,如果CA
系统得到一个网络分区,它会丢失Availiability
。所以迟早会发生这种情况,因为随着节点数量的增加,您的任何节点失败的可能性都会增加 exponentially
。
您需要知道,当您忽略 CAP Theorem
中的一个选项,即选择 CA
并忽略或离开 P
时,这将适用于您的分布式系统的整个生命周期。并且,因此我们实际上无法实现 CA
,虽然我们可以像使用 Google Cloud Spanner 数据库那样有效地实现它,该数据库声明它是 99.999%
可用,因此它不保证会有 {{ 1}} 可用性,但它保证它会非常小,以至于企业可能会忽略它。
另外,Postgresql 数据库可以通过复制有效地实现100%
。
上述所有数据库都试图通过保持一定程度的一致性和可用性来维护 CA
。
其次,CAP定理错了吗?
CA
有一些批评点:
CAP Theorem
考虑的唯一故障是网络分区,这种故障绝对会发生,但这并不是唯一可能出错的事情,因为节点可能会崩溃,您可能会在软件,因此我们需要考虑更广泛的权衡。CAP Theorem
没有提及 CAP Theorem
,人们往往更关心的是可用性。实际上,latency
可用系统允许任意慢响应,仍然可以称为可用。如果加载页面需要 2 分钟,用户就不会调用我们的系统 CAP Theorem
。Available
时倾向于放弃 Consistency
以换取 Availability
的系统,当存在 partition
时也倾向于放弃 Consistency
以换取 latency
{1}} no
。Partition
中的 C
和 A
是 CAP Theorem
,因为牺牲 Asymmetric
(AP 系统)的系统往往会一直这样做,而不仅仅是当有网络分区时。此外,对于牺牲 Consistency
(CP 系统)的系统而言,它往往会一直这样做,而不仅仅是在存在网络分区时。这意味着它不是一直 Availability
或不是一直 Consistent
。在前两种情况下,它们是不可用的无用系统,因为 Available
无法让我们了解系统正常运行时会发生什么。