CAP定理是错误的吗?

时间:2016-10-24 12:35:08

标签: sql database database-design nosql

来自维基百科的CAP定理定义: https://en.wikipedia.org/wiki/CAP_theorem

  

分布式计算机系统不可能同时提供以下所有三种保证:

     
      
  • 一致性(每次读取都会收到最近的写入或错误)
  •   
  • 可用性(每个请求都收到响应,但不保证它包含最新版本的信息)
  •   
  • 分区容差(尽管由于网络故障导致任意分区,系统仍继续运行)
  •   

我的想法:

对于任何具有CA的系统,它们可以在没有分区的情况下正常运行。当存在分区时,系统可以回退到CP或AP,这可以继续运行。由于系统可以继续运行,因此它也满足P.因此,任何CA系统也是CAP系统。因此,声称所有CAP不可能在系统中共存是错误的。

2 个答案:

答案 0 :(得分:2)

C和A意味着系统在分区面前提供这些保证。因此,在分区期间放弃这些属性会使属性保持不变。

CA权衡仅在分区期间相关(因为没有分区我们可以放弃P并获得CA)。然后,你需要决定。

实际相关的选择是CP与AP,因为分区总是可以发生。

答案 1 :(得分:1)

<块引用>

首先,关于你的假设。

其实CACP是一样的,如果CA系统得到一个网络分区,它会丢失Availiability。所以迟早会发生这种情况,因为随着节点数量的增加,您的任何节点失败的可能性都会增加 exponentially

您需要知道,当您忽略 CAP Theorem 中的一个选项,即选择 CA 并忽略或离开 P 时,这将适用于您的分布式系统的整个生命周期。并且,因此我们实际上无法实现 CA,虽然我们可以像使用 Google Cloud Spanner 数据库那样有效地实现它,该数据库声明它是 99.999% 可用,因此它不保证会有 {{ 1}} 可用性,但它保证它会非常小,以至于企业可能会忽略它。

另外,Postgresql 数据库可以通过复制有效地实现100%

上述所有数据库都试图通过保持一定程度的一致性和可用性来维护 CA

<块引用>

其次,CAP定理错了吗?

CA 有一些批评点:

  1. CAP Theorem 考虑的唯一故障是网络分区,这种故障绝对会发生,但这并不是唯一可能出错的事情,因为节点可能会崩溃,您可能会在软件,因此我们需要考虑更广泛的权衡。
  2. CAP Theorem 没有提及 CAP Theorem,人们往往更关心的是可用性。实际上,latency可用系统允许任意慢响应,仍然可以称为可用。如果加载页面需要 2 分钟,用户就不会调用我们的系统 CAP Theorem
  3. 当存在 Available 时倾向于放弃 Consistency 以换取 Availability 的系统,当存在 partition 时也倾向于放弃 Consistency 以换取 latency {1}} no
  4. Partition 中的
  5. CACAP Theorem,因为牺牲 Asymmetric(AP 系统)的系统往往会一直这样做,而不仅仅是当有网络分区时。此外,对于牺牲 Consistency(CP 系统)的系统而言,它往往会一直这样做,而不仅仅是在存在网络分区时。这意味着它不是一直 Availability 或不是一直 Consistent。在前两种情况下,它们是不可用的无用系统,因为 Available 无法让我们了解系统正常运行时会发生什么。