虽然我试图理解 CAP 中的“可用性”(A)和“分区容忍度”(P),但我发现很难理解各种文章的解释。
我觉得 A 和 P 可以一起去(我知道情况并非如此,这就是为什么我不明白!)。
用简单的术语解释,什么是 A 和 P 以及它们之间的区别?
一致性意味着集群中的数据是相同的,因此您可以从 / 向任何节点读取或写入数据并获取相同的数据。
可用性意味着即使集群中的某个节点发生故障,也能够访问集群。
分区容忍度意味着即使两个节点之间存在“分区”(通信中断)(两个节点都已启动,但无法通信),集群仍将继续运行。
为了获得可用性和分区容忍度,您必须放弃一致性。考虑在 master-master 设置中是否有两个节点 X 和 Y。现在,X 和 Y 之间的网络通信中断,因此它们无法同步更新。此时,您可以:
A)允许节点不同步(放弃一致性),或者
B) 考虑集群“关闭”(放弃可用性)
所有可用的组合是:
CA-所有节点之间的数据是一致的-只要所有节点都在线-您可以从任何节点读取 / 写入并确保数据相同,但是如果您在节点之间开发分区,数据将不同步(并且一旦分区被解析就不会重新同步)。
CP-数据在所有节点之间保持一致,并通过在节点停机时变得不可用而保持分区容忍度(防止数据不同步)。
AP-节点保持在线,即使它们不能相互通信,并且一旦分区被解析,将重新同步数据,但你不能保证所有节点将具有相同的数据(在分区期间或之后)
您应该注意CA systems don't practically exist(即使某些系统声称如此)。
将 P 与 C 和 A 等同考虑是一个错误,而 C,A,P 中的“2 of 3”概念是误导性的。我要解释 CAP 定理的简洁方法是:“在分布式数据存储中,在网络分区时,您必须选择一致性或可用性,并且不能同时获得两者。”较新的 NoSQL 系统试图将重点放在可用性上,而传统的 ACID 数据库则更加关注一致性。
你真的不能选择 CA,网络分区不是任何人都想拥有的,它只是分布式系统的一个不受欢迎的现实,网络可能会失败。问题是当这种情况发生时,你会为你的应用程序选择什么权衡。最初提出这个术语的人的article似乎非常清楚地解释了这一点。
这是我如何讨论 CAP,特别是关于 P。
CA 是唯一可能的,如果你是一个单一的,单一的服务器数据库(也许与复制,但在一个“故障块”的所有数据-服务器不被认为是部分失败)。
如果您的问题需要横向扩展、分布式和多服务器---网络分区可能会发生。您已经需要 P。我所解决的问题很少适合单服务器始终范式 (或者,正如 Stonebraker 所说,“分布式是表的赌注”)。如果您可以找到一个 CA 问题,那么像传统的非横向扩展 RDBMS 这样的解决方案会提供很多好处。
对我来说,罕见:所以我们继续讨论 AP 与 CP。
只有在有分区的情况下,您才能在 AP 和 CP 操作之间进行选择。如果网络 & amp;硬件正常运行,那么您也可以吃蛋糕。
让我们讨论一下 AP / CP 的区别。
AP-当有网络分区时,让独立的部分自由运行。
CP-当存在网络分区时,关闭节点或不允许读取和写入,因此存在确定性故障。
我喜欢可以做到这两者的架构,因为有些问题是 AP,有些是 CP-有些数据库可以做到这两者。
例如,在 AP 数据集中,您可能会出现不一致的读取和生成写入冲突-这是两种不同的 AP 模式。您的系统是否可以配置为具有高读取可用性的 AP,但不允许写入冲突?或者您的 AP 系统是否可以通过强大而灵活的解决系统接受写入冲突?您最终需要两者,还是可以选择一个只执行一个操作的系统?
在 CP 系统中,如果有的话,小分区(单个服务器)会导致多少不可用性?更大的复制会增加 CP 系统中的不可用性,系统如何处理这些权衡?
这些都是 CP vs AP 要问的问题。
布鲁尔的“12 年后”帖子是目前这方面的一个很好的读物。我相信这将清晰地推进 CAP 辩论,并高度推荐它。
http://www.infoq.com/articles/cap-twelve-years-later-how-the-rules-have-changed一致性:
确保读取返回给定客户端的最新写入(如 ACID)。如果在这段时间内收到任何请求,则必须等待,直到跨节点 / 在节点中完成数据同步。
可用性:
每个节点(如果没有失败)总是执行查询,并且应该总是响应请求。它是否返回最新的副本并不重要。
分区公差:
当网络分区发生时,系统将继续运行。
关于AP,可用性(始终可访问)可以存在(Cassendra)或不存在(RDBMS)分区容差
pic source本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处
评论列表(68条)