CAP定理-可用性和分区容限


207

当我尝试理解CAP中的“可用性”(A)和“分区容限”(P)时,我发现很难理解各种文章中的解释。

我感觉到A和P可以一起走(我知道不是这样,这就是为什么我不明白!)。

用简单的术语解释,A和P是什么以及它们之间的区别?



2
不要去找现成的答案。分别阅读,可视化和理解C,A,P。设计一个分布式集群体系结构(可能是3 DB),现在应用您的理解。查看分布式(DB)的故障发生时C,A,P会发生什么。一旦理解了,就检查答案并按照自己的逻辑运用。记住-即使您理解,也可能不清楚。因此,请思考并运用您的理解。谢谢
少女

1
上面的ksat.me链接以某种方式转到404网址,因为它以'/'结尾。ksat.me/a-plain-english-introduction-cap-theorem定理这很好用,并且非常详细地解释了“ C”,“ A”,“ P”中的每一个
vivek.m

Answers:


402

一致性意味着整个集群中的数据都是相同的,因此您可以从任何节点读取数据或向任何节点写入数据,并获取相同的数据。

可用性意味着即使集群中的某个节点出现故障,也可以访问集群。

分区容限意味着即使两个节点之间的“分区”(通信中断)(两个节点都在运行,但无法通信),群集仍可以继续运行。

为了获得可用性和分区容忍度,您必须放弃一致性。考虑在主-主设置中是否有两个节点X和Y。现在,X和Y之间的网络通信中断,因此它们无法同步更新。此时,您可以:

A)允许节点不同步(放弃一致性),或者

B)认为群集处于“关闭”状态(放弃可用性)

所有可用的组合是:

  • CA-所有节点之间的数据都是一致的-只要所有节点都处于联机状态-您就可以从任何节点进行读/写操作,并确保数据相同,但是如果您在节点之间开发分区,则数据将是不同步(解决分区后将不会重新同步)。
  • CP-所有节点之间的数据都是一致的,并且当节点发生故障时变得不可用,从而保持分区容限(防止数据失步)。
  • AP-节点即使无法彼此通信也将保持联机状态,并且在解析分区后将重新同步数据,但是不能保证所有节点(在分区期间或分区之后)都具有相同的数据

您应该注意,CA系统实际上并不存在(即使某些系统声称存在)。


1
在AP中,为什么不能保证所有节点都具有相同的数据?好的,因为我们没有“ C”,但是..对我来说这还不清楚...我想知道为什么会这样...
grep 2014年

3
@grep对不起,您的回答很晚。如果您同时具有可用性(群集不会崩溃)和分区容限(数据库可以在无法通信的节点中生存),那么您将无法保证所有节点将始终拥有所有数据(一致性),因为节点启动并接受写操作,但无法将这些写操作相互传达。
克里斯·希尔德

4
晚会晚了,但是值得在每个类别中展示一些示例,例如。blog.nahurst.com/visual-guide-to-nosql-systems
bitinn

包含一个有关此处表示的节点群集的简单说明/示例确实有帮助。是跨不同系统或其他系统的系统还是数据表/集合?
shrotavre 18/09/14

实用上,节点通常是通过某种联网机制连接的单个系统(或在这些系统上运行的软件)。
克里斯·希尔德

43

将P与C和A等同地考虑是一个错误,而C,A,P中的“三分之二”概念是令人误解的。我要简单地解释CAP定理的方式是:“在分布式数据存储中,在进行网络分区时,您必须选择“一致性”或“可用性”,而不能同时选择两者。较新的NoSQL系统试图将重点放在可用性上,而传统的ACID数据库则将重点放在一致性上。

您真的不能选择CA,网络分区不是任何人都想要的,这只是分布式系统的不受欢迎的现实,网络可能会失败。问题是,当发生这种情况时,您会为应用程序选择什么权衡。最初提出该术语的人的这篇文章似乎很清楚地解释了这一点。


18

这就是我讨论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


CA系统确实令人困惑,我对您的整体数据库CA示例有疑问。如果仅是一台服务器,“ A”来自哪里,因为在我看来,所述服务器的故障将导致没有可用的服务?
chaooder

1
好问题。如果服务器设计用于高可用性,则它们可能会出现磁盘故障,甚至DIMM故障,或者电源故障。甚至可以想象在多个电网上。您将获得越来越高的可用性,但是内部永远不会有一个“网络”能够对不同的组件进行分区和运行。尽管存在着越来越深奥的硬件(查找SQL NON-STOP),但是如今,带有故障和恢复组件的RAID阵列示例仍然很常见,并且在单个服务器中提供了很高的可用性。
Brian Bulkowski

13

CAP定理

一致性:

保证读取会返回给定客户端的最新写入(如ACID)。如果在此期间有任何请求,则必须等到节点之间/节点之间的数据同步完成


可用性:

每个节点(如果没有失败)总是执行查询,并且应该始终响应请求。是否返回最新副本都无关紧要。


分区容限:

发生网络分区时,系统将继续运行。


关于AP,可用性(始终可访问)可以存在(Cassendra)或没有(RDBMS)分区容限

图片来源


2

我觉得分区容忍度在任何答案中都无法很好地解释,因此只是为了更详细地解释CAP定理意味着:

C:(线性化或强一致性)大致表示

如果操作B在操作A成功完成之后开始,则操作B必须使系统处于与操作A完成时相同的状态,或者处于较新的状态(但绝不为旧状态)。

“系统中无故障的[数据库]节点收到的每个请求都必须导致[无错误]响应”。对于某些节点而言,仅能够处理该请求是不够的:任何非故障节点都必须能够处理该请求。许多所谓的“高可用性”(即低停机时间)系统实际上不符合可用性的定义。

P

分区容限(严重命名错误)基本上意味着您正在通过异步网络进行通信,这可能会延迟或丢弃消息。互联网和我们所有的数据中心都具有此属性,因此您在此问题上别无选择。

资料来源:令人敬畏的马丁·克莱普曼的作品

仅举一个例子:Cassandra最多可以是AP系统。但是,如果将其配置为基于Quorum进行读取或写入,则它不会保持CAP可用(根据CAP定理的定义可用),而仅是P系统。


1

简单地说,CAP定理指出,分布式系统不可能同时提供所有三个保证:

在此处输入图片说明

一致性

每个节点同时包含相同的数据

可用性

每次至少必须有一个节点可用于提供数据

分区容限

系统故障非常罕见

通常,每个系统只能保证CA,AP或CP至少具有两个功能。


0

一致性–当我们发送读取请求时,如果返回结果,则它应返回客户端请求给出的最新写入。可用性–您的读/写请求应始终成功。分区容限–发生网络分区(某些机器相互交谈的问题)时,系统仍应正常工作。

在分布式系统中,可能会发生网络分区,并且我们无法避免CAP的“ P”。因此,我们在“一致性”和“可用性”之间进行选择。

http://bigdatadose.com/understanding-cap-theorem/


0

了解CAP定理的简单方法:

如果是网络分区,则需要在完美可用性和完美一致性之间进行选择。

选择一致性意味着无法回答客户的查询,因为系统不能保证返回最近的写入。这牺牲了可用性。

选择可用性意味着能够响应客户的请求,但是系统不能保证一致性,即写入的最新值。在给定的情况下,可用的系统会提供最佳的答案。

这个解释来自这篇优秀的文章。希望会有所帮助。


0

我已经遍历了很多链接,但是除了其中一个,它们都无法给我满意的答案。

因此,我用非常简单的措词来描述CAP。

  • 一致性:必须返回相同的Data,无论它来自哪个节点。

  • 可用性节点应该响应(必须可用)。

  • 分区容忍性集群应该响应(必须提供),即使有节点间AA分区(即网络故障)。

(也是造成更多混乱的一个主要原因是它的命名约定不好。如果我没错,我可能会改用DNC定理:数据一致性节点可用性集群可用性,其中每个分别对应于一致性可用性分区容差

CP数据库: CP数据库以可用性为代价提供一致性和分区容限。当任意两个节点之间发生分区时,系统必须关闭不一致的节点(即,使其不可用),直到解决该分区为止。

AP数据库: AP数据库以一致性为代价提供可用性和分区容限。发生分区时,所有节点仍然可用,但位于错误端的节点可能会返回比其他节点更旧的数据。(解决分区后,AP数据库通常会重新同步节点以修复系统中的所有不一致情况。)

CA数据库: CA数据库可在所有节点之间提供一致性和可用性。但是,如果系统中任意两个节点之间存在分区,则无法执行此操作,因此无法提供容错功能。在分布式系统中,无法避免分区。因此,尽管我们可以在理论上讨论CA分布式数据库,但出于所有实际目的,CA分布式数据库可以存在但不应该存在。

因此,这并不意味着如果需要,您就无法为分布式应用程序提供CA数据库。许多关系数据库(例如PostgreSQL)可提供一致性和可用性,并可使用复制将其部署到多个节点。

资料来源:https : //www.ibm.com/cloud/learn/cap-theorem

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.