当我试图理解CAP中的“Availability”(A)和“Partition tolerance”(P)时,我发现很难理解各种文章的解释。
我有一种感觉,a和P可以同时出现(我知道事实并非如此,这就是我不能理解的原因!)
简单地解释一下,什么是A和P以及它们之间的区别?
当我试图理解CAP中的“Availability”(A)和“Partition tolerance”(P)时,我发现很难理解各种文章的解释。
我有一种感觉,a和P可以同时出现(我知道事实并非如此,这就是我不能理解的原因!)
简单地解释一下,什么是A和P以及它们之间的区别?
当前回答
我将用这里提到的ATM机示例详细解释
CAP定理讨论了一致性和可用性之间的权衡,如果您的分布式系统遭受分区,您必须做出取舍。分布式系统意味着您将数据存储在多个节点中,分区意味着这些节点之间的连接以某种方式断开。
分区是分布式系统中的通信中断 两个节点之间的连接丢失或暂时延迟。分区 容忍度意味着集群必须在任何情况下继续工作 系统节点间通信中断次数。
假设我们有一家小银行,只有两台自动取款机。客户可以存、取、查余额。你必须确保余额不会低于零。这些atm机之间的连接可以通过三种方式断开
1-您要使用的ATM机不能用。你刚刚放了个坏了的牌子
2-你要用的ATM机在工作,但另一台不能工作
3-他们都在工作,但有一个网络问题,他们无法相互沟通。
这个分布式系统正在遭受分区,我们需要在可用性和一致性之间做出选择:
如果银行选择一致的设计,自动柜员机将不会处理您的请求,因为它无法更新另一台自动柜员机中的余额。 如果银行选择了可用性,你的ATM会处理请求,跟踪发生了什么,然后当连接建立时,它只是告诉其他ATM发生了什么,但余额同时会不一致。
其他回答
简单的CAP定理指出,分布式系统不可能同时提供所有三个保证:
一致性
每个节点同时包含相同的数据
可用性
每次必须至少有一个节点可用以提供数据
分区容忍
系统的故障是非常罕见的
大多数情况下,每个系统只能保证至少两个特性:CA、AP或CP。
我将用这里提到的ATM机示例详细解释
CAP定理讨论了一致性和可用性之间的权衡,如果您的分布式系统遭受分区,您必须做出取舍。分布式系统意味着您将数据存储在多个节点中,分区意味着这些节点之间的连接以某种方式断开。
分区是分布式系统中的通信中断 两个节点之间的连接丢失或暂时延迟。分区 容忍度意味着集群必须在任何情况下继续工作 系统节点间通信中断次数。
假设我们有一家小银行,只有两台自动取款机。客户可以存、取、查余额。你必须确保余额不会低于零。这些atm机之间的连接可以通过三种方式断开
1-您要使用的ATM机不能用。你刚刚放了个坏了的牌子
2-你要用的ATM机在工作,但另一台不能工作
3-他们都在工作,但有一个网络问题,他们无法相互沟通。
这个分布式系统正在遭受分区,我们需要在可用性和一致性之间做出选择:
如果银行选择一致的设计,自动柜员机将不会处理您的请求,因为它无法更新另一台自动柜员机中的余额。 如果银行选择了可用性,你的ATM会处理请求,跟踪发生了什么,然后当连接建立时,它只是告诉其他ATM发生了什么,但余额同时会不一致。
我觉得任何答案都没有很好地解释分区容忍,所以只是更详细地解释一下CAP定理的意思是:
C:(线性性或强一致性)大致是指
如果操作B在操作A成功完成后启动,则 操作B必须看到系统处于与打开时相同的状态 完成操作A,或更新状态(但绝不是旧状态)。
A:
“系统中非故障[数据库]节点接收到的每个请求 必须导致[非错误]响应”。这对某些人来说是不够的 节点能够处理请求:任何未失败的节点都需要这样做 能够处理它。许多所谓的“高可用性”(即低可用性) 停机时间)系统实际上不符合这个定义 可用性。
P:
分区容忍(命名不当)基本上意味着您 通过可能延迟或中断的异步网络进行通信 消息。互联网和我们所有的数据中心都有这个特性,所以 在这件事上你真的没有选择的余地。
来源:Martin kleppmann的作品
举个例子: 卡桑德拉最多只能是AP系统。但是,如果您将其配置为基于Quorum进行读写,那么它就不会保持CAP可用性(根据CAP定理的定义可用),而只是P系统。
我找了很多环节,但是没有一个环节能给我满意的答案,只有一个环节。
因此,我用非常简单的语言描述CAP。
Consistency: Must return same Data, regardless to from which node is it coming. Availability: Node should respond (must be available). Partition Tolerance: Cluster should respond (must be available), even if there is a a partition (i.e. network failure) between nodes. ( Also one main reason it confuses more is bad naming convention of it. If I had right, I might have given DNC theorem instead: Data Consistency, Node Availability, Cluster Availability, where each corresponds to Consistency, Availability and Partition Tolerance respectively )
CP数据库:CP数据库以牺牲可用性为代价提供一致性和分区容忍。当任意两个节点之间发生分区时,系统必须关闭不一致的节点(即使其不可用),直到分区被解决。
AP数据库:AP数据库提供了可用性和分区容忍,但牺牲了一致性。当分区发生时,所有节点仍然可用,但那些在分区错误一端的节点可能返回比其他节点更旧的数据版本。(当分区被解析时,AP数据库通常会重新同步节点,以修复系统中的所有不一致。)
CA数据库:CA数据库提供跨所有节点的一致性和可用性。但是,如果系统中的任意两个节点之间存在分区,则无法做到这一点,因此无法提供容错功能。在分布式系统中,分区是不可避免的。因此,虽然我们可以在理论上讨论CA分布式数据库,但出于所有实际目的,CA分布式数据库可以存在,但不应该存在。
因此,这并不意味着如果需要,就不能为分布式应用程序提供CA数据库。许多关系数据库,如PostgreSQL,提供一致性和可用性,并可以使用复制部署到多个节点。
来源:https://www.ibm.com/cloud/learn/cap-theorem
一致性意味着整个集群中的数据是相同的,因此您可以从/写入任何节点并获得相同的数据。
可用性意味着即使集群中的某个节点宕机,也能够访问集群。
分区容忍意味着即使两个节点之间存在“分区”(通信中断)(两个节点都在工作,但不能通信),集群也能继续工作。
为了同时获得可用性和分区容忍,您必须放弃一致性。考虑一下在master-master设置中是否有两个节点X和Y。现在,X和Y之间的网络通信中断了,所以它们不能同步更新。此时你可以:
A)允许节点不同步(放弃一致性),或者
B)认为集群“关闭”(放弃可用性)
所有可用的组合是:
CA - data is consistent between all nodes - as long as all nodes are online - and you can read/write from any node and be sure that the data is the same, but if you ever develop a partition between nodes, the data will be out of sync (and won't re-sync once the partition is resolved). CP - data is consistent between all nodes, and maintains partition tolerance (preventing data desync) by becoming unavailable when a node goes down. AP - nodes remain online even if they can't communicate with each other and will resync data once the partition is resolved, but you aren't guaranteed that all nodes will have the same data (either during or after the partition)
您应该注意,CA系统实际上并不存在(即使有些系统声称存在)。