当我试图理解CAP中的“Availability”(A)和“Partition tolerance”(P)时,我发现很难理解各种文章的解释。
我有一种感觉,a和P可以同时出现(我知道事实并非如此,这就是我不能理解的原因!)
简单地解释一下,什么是A和P以及它们之间的区别?
当我试图理解CAP中的“Availability”(A)和“Partition tolerance”(P)时,我发现很难理解各种文章的解释。
我有一种感觉,a和P可以同时出现(我知道事实并非如此,这就是我不能理解的原因!)
简单地解释一下,什么是A和P以及它们之间的区别?
当前回答
根据上图C是断开的,但A,B, D可以继续工作。现在我们可以调用系统部分工作(分区容忍)。
假设一个特定的事务只需要a、B和d,系统可以执行它而不会产生任何不一致。
但是当C必须参与一个特定的事务时,系统可以以两种方式执行。
1.由于C不可用,A可以拒绝用户请求。
So the system has Partition-Tolerance and consistency (P,C).
But no availability, because of the rejection.
2.A可以将C接收到的消息保存在A的本地内存中,并在C连接回来时传输。
So the system has Partition-Tolerance and availability (P,A).
But no consistency.because C has not updated.
其他回答
以下是我讨论CAP的方式,特别是关于P。
CA只有在单机数据库(可能有复制,但所有数据都在一个“故障块”上-服务器不被认为是部分故障)的情况下才可能使用。
如果您的问题需要向外扩展、分布式和多服务器,则可能发生网络分区。您已经需要p了,我所处理的问题中很少有适用于总是单服务器的范例(或者,如Stonebraker所说,“分布式是桌面赌注”)。如果您能找到CA问题,那么像传统的非向外扩展RDBMS这样的解决方案将提供很多好处。
对我来说,罕见:所以我们继续讨论AP和CP。
当您有分区时,只能在AP操作和CP操作之间进行选择。如果网络和硬件运行正常,你就能得到你的蛋糕并吃掉它。
让我们讨论AP / CP的区别。
AP -当有网络分区时,让独立的部分自由运行。
CP——当存在网络分区时,关闭节点或禁止读写,这样就会出现确定性故障。
我喜欢能两者兼顾的架构,因为有些问题是AP问题,有些是CP问题,而有些数据库可以两者兼顾。在CP和AP解决方案中,也有一些微妙之处。
例如,在AP数据集中,您可能同时存在不一致的读取和生成写入冲突-这是两种不同的AP模式。您的系统是否可以配置为具有高读可用性但不允许写冲突的AP ?或者您的AP系统可以接受写入冲突,具有强大而灵活的解决系统?你最终需要两者吗,或者你可以选择一个只做其中一个的系统?
在CP系统中,小分区(单个服务器)的不可用性有多少?更大的复制会增加CP系统中的不可用性,系统如何处理这些权衡?
这些都是CP和AP要问的问题。
现在在这个领域有一个很好的阅读是Brewer的“12年后”的帖子。我相信这将清晰地推进CAP辩论,并强烈推荐它。
http://www.infoq.com/articles/cap-twelve-years-later-how-the-rules-have-changed
我将用这里提到的ATM机示例详细解释
CAP定理讨论了一致性和可用性之间的权衡,如果您的分布式系统遭受分区,您必须做出取舍。分布式系统意味着您将数据存储在多个节点中,分区意味着这些节点之间的连接以某种方式断开。
分区是分布式系统中的通信中断 两个节点之间的连接丢失或暂时延迟。分区 容忍度意味着集群必须在任何情况下继续工作 系统节点间通信中断次数。
假设我们有一家小银行,只有两台自动取款机。客户可以存、取、查余额。你必须确保余额不会低于零。这些atm机之间的连接可以通过三种方式断开
1-您要使用的ATM机不能用。你刚刚放了个坏了的牌子
2-你要用的ATM机在工作,但另一台不能工作
3-他们都在工作,但有一个网络问题,他们无法相互沟通。
这个分布式系统正在遭受分区,我们需要在可用性和一致性之间做出选择:
如果银行选择一致的设计,自动柜员机将不会处理您的请求,因为它无法更新另一台自动柜员机中的余额。 如果银行选择了可用性,你的ATM会处理请求,跟踪发生了什么,然后当连接建立时,它只是告诉其他ATM发生了什么,但余额同时会不一致。
将P与C和A等同看待是一个错误,而C、A、P之间的“三选二”概念是具有误导性的。我解释CAP定理的简洁方式是,“在分布式数据存储中,在网络分区时,你必须在一致性或可用性中选择一个,并且不能两者兼得”。新的NoSQL系统正试图关注可用性,而传统的ACID数据库则更关注一致性。
你真的不能选择CA,网络分区不是任何人都想要的,它只是分布式系统的一个不受欢迎的现实,网络可能会失败。问题是,当这种情况发生时,你如何权衡你的应用程序。第一个提出这个术语的人的这篇文章似乎很清楚地解释了这一点。
一致性:
对于给定的客户端,读操作保证返回最近的写操作(如ACID)。如果在此期间有任何请求,则必须等待节点之间/节点内的数据同步完成。
可用性:
每个节点(如果没有失败)总是执行查询,并且应该总是响应请求。它是否返回最新的副本并不重要。
Partition-tolerance:
当发生网络分区时,系统将继续工作。
关于AP,可用性(始终可访问)可以与(Cassendra)或 没有(RDBMS)分区容忍
图片来源
我找了很多环节,但是没有一个环节能给我满意的答案,只有一个环节。
因此,我用非常简单的语言描述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