Sql CAP定理错了吗?
CAP定理定义摘自维基百科: 分布式计算机系统不可能同时提供以下三种保证:Sql CAP定理错了吗?,sql,database,database-design,nosql,Sql,Database,Database Design,Nosql,CAP定理定义摘自维基百科: 分布式计算机系统不可能同时提供以下三种保证: 一致性(每次读取都会收到最近的写入或错误) 可用性(每个请求都会收到响应,但不保证其中包含最新版本的信息) 分区容差(即使由于网络故障而进行任意分区,系统仍能继续运行) 我的想法是: 对于任何具有CA的系统,它们都可以在没有分区的情况下正常运行。当存在分区时,系统可以退回到CP或AP,后者可以继续运行。由于系统可以继续运行,因此它也满足P。因此,任何CA系统也是CAP系统。因此,声称所有CAP不可能在一个系统中共存
- 一致性(每次读取都会收到最近的写入或错误)
- 可用性(每个请求都会收到响应,但不保证其中包含最新版本的信息)
- 分区容差(即使由于网络故障而进行任意分区,系统仍能继续运行)
对于任何具有CA的系统,它们都可以在没有分区的情况下正常运行。当存在分区时,系统可以退回到CP或AP,后者可以继续运行。由于系统可以继续运行,因此它也满足P。因此,任何CA系统也是CAP系统。因此,声称所有CAP不可能在一个系统中共存的说法是错误的。C这意味着系统在面对分区时提供了这些保证。因此,在分区期间放弃这些属性会使该属性无法保存 CA权衡仅在分区期间相关(因为没有分区,我们可以放弃p而获得CA)。然后,你需要做出决定 实际上相关的选择是CP与AP,因为分区总是可能发生的 首先,关于你的假设 实际上,
CA
和CP
是相同的,因为如果CA
系统获得一个网络分区,它将失去可用性
。因此,这种情况迟早会发生,因为随着节点数量的增加,任何节点发生故障的概率都会呈指数级增加
您需要知道,当您忽略CAP定理
中选择CA
并忽略或离开p
的选项时,这将在分布式系统的整个生命周期内保持不变。因此,我们无法实际实现CA
,而我们可以有效地实现这一点,就像Google Cloud Paner数据库一样,该数据库声明它是99.999%
可用的,因此它并不保证会有100%
可用性,但它保证它将非常小,以至于可能会被业务忽略
同时,Postgresql数据库可以通过复制有效地实现CA
上述所有数据库都试图通过保持一定程度的一致性和可用性来维护CA
第二,CAP定理错了吗
对CAP定理有一些批评意见
:
CAP定理
没有提到延迟,人们往往关心的不仅仅是可用性。事实上,CAP定理
可用系统的响应速度可以任意变慢,并且仍然可以被称为可用系统。如果加载页面需要2分钟,用户就不会调用我们的系统Available
分区时,倾向于放弃一致性
以获得可用性
,当存在无分区时,也倾向于放弃一致性
以获得延迟
CAP定理
中的C
和A
是不对称的
,因为牺牲一致性的系统(AP系统)往往总是这样做,而不仅仅是在存在网络分区时。同样,对于牺牲可用性(CP系统)的系统也是如此,它往往总是这样做,而不仅仅是在存在网络分区时。这意味着它不是始终一致的,也不是始终可用的。在前两种情况下,它们是不可用的无用系统,因为CAP定理
没有给出系统正常运行时会发生什么的视图
不确定这个问题出了什么问题?完全正确,尽管是错误的理论。谢谢你的回答。你的意思是CAP是一种状态,因为你说过“没有分区,我们可以放弃P并获得CA”?CAP是系统的一个属性,一个属性必须始终保持它。更好的说法是“如果我们假设没有分区,我们应该构建一个CA系统,因为我们不需要属性P。”所以CAP定理实际上是从CA中选择1,而不是从CAP中选择2。若CAP是一个必须始终为真的属性,那个么在存在分区的情况下,CA系统将无法保持其保证。谢谢你消除了我的困惑。@netok这仍然是三分之二。阅读维基百科文章中引用的内容。“允许至少一个节点更新状态将导致节点变得不一致,从而放弃C。同样,如果选择保持一致性,则分区的一侧必须充当不可用的角色,从而放弃A。只有当节点通信时,才能同时保持一致性和可用性,从而放弃P。”。一般认为,对于广域系统,设计师不能放弃P…。”或者,另一句话是“假设没有分区,我们会得到一个更强的结果,即CAP的所有3个。”