当我尝试理解CAP中的“可用性”(A)和“分区容限”(P)时,我发现很难理解各种文章中的解释。
我感觉到A和P可以一起走(我知道不是这样,这就是为什么我不明白!)。
用简单的术语解释,A和P是什么以及它们之间的区别?
当我尝试理解CAP中的“可用性”(A)和“分区容限”(P)时,我发现很难理解各种文章中的解释。
我感觉到A和P可以一起走(我知道不是这样,这就是为什么我不明白!)。
用简单的术语解释,A和P是什么以及它们之间的区别?
Answers:
一致性意味着整个集群中的数据都是相同的,因此您可以从任何节点读取数据或向任何节点写入数据,并获取相同的数据。
可用性意味着即使集群中的某个节点出现故障,也可以访问集群。
分区容限意味着即使两个节点之间的“分区”(通信中断)(两个节点都在运行,但无法通信),群集仍可以继续运行。
为了获得可用性和分区容忍度,您必须放弃一致性。考虑在主-主设置中是否有两个节点X和Y。现在,X和Y之间的网络通信中断,因此它们无法同步更新。此时,您可以:
A)允许节点不同步(放弃一致性),或者
B)认为群集处于“关闭”状态(放弃可用性)
所有可用的组合是:
您应该注意,CA系统实际上并不存在(即使某些系统声称存在)。
这就是我讨论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
我觉得分区容忍度在任何答案中都无法很好地解释,因此只是为了更详细地解释CAP定理意味着:
C:(线性化或强一致性)大致表示
如果操作B在操作A成功完成之后开始,则操作B必须使系统处于与操作A完成时相同的状态,或者处于较新的状态(但绝不为旧状态)。
答:
“系统中无故障的[数据库]节点收到的每个请求都必须导致[无错误]响应”。对于某些节点而言,仅能够处理该请求是不够的:任何非故障节点都必须能够处理该请求。许多所谓的“高可用性”(即低停机时间)系统实际上不符合可用性的定义。
P:
分区容限(严重命名错误)基本上意味着您正在通过异步网络进行通信,这可能会延迟或丢弃消息。互联网和我们所有的数据中心都具有此属性,因此您在此问题上别无选择。
资料来源:令人敬畏的马丁·克莱普曼的作品
仅举一个例子:Cassandra最多可以是AP系统。但是,如果将其配置为基于Quorum进行读取或写入,则它不会保持CAP可用(根据CAP定理的定义可用),而仅是P系统。
一致性–当我们发送读取请求时,如果返回结果,则它应返回客户端请求给出的最新写入。可用性–您的读/写请求应始终成功。分区容限–发生网络分区(某些机器相互交谈的问题)时,系统仍应正常工作。
在分布式系统中,可能会发生网络分区,并且我们无法避免CAP的“ P”。因此,我们在“一致性”和“可用性”之间进行选择。
我已经遍历了很多链接,但是除了其中一个,它们都无法给我满意的答案。
因此,我用非常简单的措词来描述CAP。
一致性:必须返回相同的Data,无论它来自哪个节点。
可用性:节点应该响应(必须可用)。
分区容忍性:集群应该响应(必须提供),即使有节点间AA分区(即网络故障)。
(也是造成更多混乱的一个主要原因是它的命名约定不好。如果我没错,我可能会改用DNC定理:数据一致性,节点可用性,集群可用性,其中每个分别对应于一致性,可用性和分区容差)
CP数据库: CP数据库以可用性为代价提供一致性和分区容限。当任意两个节点之间发生分区时,系统必须关闭不一致的节点(即,使其不可用),直到解决该分区为止。
AP数据库: AP数据库以一致性为代价提供可用性和分区容限。发生分区时,所有节点仍然可用,但位于错误端的节点可能会返回比其他节点更旧的数据。(解决分区后,AP数据库通常会重新同步节点以修复系统中的所有不一致情况。)
CA数据库: CA数据库可在所有节点之间提供一致性和可用性。但是,如果系统中任意两个节点之间存在分区,则无法执行此操作,因此无法提供容错功能。在分布式系统中,无法避免分区。因此,尽管我们可以在理论上讨论CA分布式数据库,但出于所有实际目的,CA分布式数据库可以存在但不应该存在。
因此,这并不意味着如果需要,您就无法为分布式应用程序提供CA数据库。许多关系数据库(例如PostgreSQL)可提供一致性和可用性,并可使用复制将其部署到多个节点。