虽然我试图理解 CAP 中的“可用性”(A)和“分区容限”(P),但我发现很难理解各种文章的解释。
我感觉A和P可以一起走(我知道不是这样,这就是我无法理解的原因!)。
简单来说,A和P是什么以及它们之间的区别?
虽然我试图理解 CAP 中的“可用性”(A)和“分区容限”(P),但我发现很难理解各种文章的解释。
我感觉A和P可以一起走(我知道不是这样,这就是我无法理解的原因!)。
简单来说,A和P是什么以及它们之间的区别?
一致性意味着整个集群中的数据是相同的,因此您可以从/向任何节点读取或写入并获取相同的数据。
可用性意味着即使集群中的某个节点出现故障,也能够访问集群。
分区容错意味着即使两个节点之间存在“分区”(通信中断)(两个节点都已启动,但无法通信),集群仍继续运行。
为了同时获得可用性和分区容错性,您必须放弃一致性。考虑在主-主设置中是否有两个节点 X 和 Y。现在,X 和 Y 之间的网络通信中断,因此它们无法同步更新。此时,您可以:
A) 允许节点不同步(放弃一致性),或
B)认为集群“关闭”(放弃可用性)
所有可用的组合是:
您应该注意CA 系统实际上并不存在(即使某些系统声称存在)。
将 P 与 C 和 A 等同考虑有点错误,而 C、A、P 中的“三分之二”的概念具有误导性。我解释 CAP 定理的简洁方式是,“在分布式数据存储中,在网络分区时,您必须选择一致性或可用性,并且不能同时获得两者”。较新的 NoSQL 系统试图关注可用性,而传统的 ACID 数据库更关注一致性。
你真的不能选择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 vs AP要问的问题。
Brewer 的“12 年后”帖子是目前该领域的一个很好的读物。我相信这会清晰地推动 CAP 辩论,并强烈推荐它。
http://www.infoq.com/articles/cap-twelve-years-later-how-the-rules-have-changed
读取保证返回给定客户端的最新写入(如 ACID)。如果在此期间有任何请求,它必须等到节点之间/节点中的数据同步完成。
每个节点(如果没有失败)总是执行查询并且应该总是响应请求。它是否返回最新的副本并不重要。
发生网络分区时,系统将继续运行。
关于AP,可用性(始终可访问)可以存在(Cassendra)或不存在(RDBMS)分区容差
我浏览了很多链接,但没有一个能给我满意的答案,除了一个。
因此,我用非常简单的措辞来描述 CAP。
一致性:必须返回相同的数据,无论它来自哪个节点。
可用性:节点应该响应(必须可用)。
Partition Tolerance:集群应该响应(必须可用),即使节点之间存在分区(即网络故障)。
(同样令人困惑的一个主要原因是它的命名约定不好。如果我是对的,我可能会给出DNC定理:数据一致性、节点可用性、集群可用性,其中每个分别对应于一致性、可用性和分区容差)
CP 数据库: CP 数据库以牺牲可用性为代价提供一致性和分区容错性。当任何两个节点之间发生分区时,系统必须关闭不一致的节点(即使其不可用),直到分区解决。
AP 数据库: AP 数据库以牺牲一致性为代价提供可用性和分区容错性。发生分区时,所有节点都保持可用,但分区错误端的节点可能会返回比其他节点更旧的数据版本。(分区解决后,AP 数据库通常会重新同步节点以修复系统中的所有不一致。)
CA 数据库: CA 数据库提供跨所有节点的一致性和可用性。但是,如果系统中的任何两个节点之间存在分区,它就无法做到这一点,因此无法提供容错能力。在分布式系统中,分区是不可避免的。因此,虽然我们可以在理论上讨论 CA 分布式数据库,但出于所有实际目的,CA 分布式数据库可以存在但不应该存在。
因此,这并不意味着如果您需要,您就不能为您的分布式应用程序拥有一个 CA 数据库。许多关系数据库(例如 PostgreSQL)提供一致性和可用性,并且可以使用复制部署到多个节点。
我觉得在任何答案中都没有很好地解释分区容差,所以只是为了更详细地解释 CAP 定理意味着:
C:(线性化或强一致性)大致意思是
如果操作 B 在操作 A 成功完成后开始,则操作 B 必须看到系统处于与操作 A 完成时相同的状态,或者更新的状态(但绝不是旧状态)。
答:
“系统中非失败 [数据库] 节点收到的每个请求都必须产生 [非错误] 响应”。某些节点能够处理请求是不够的:任何非失败节点都需要能够处理它。许多所谓的“高可用性”(即低停机时间)系统实际上并不符合这个可用性定义。
: _
Partition Tolerance(名字严重错误)基本上意味着您正在通过可能延迟或丢弃消息的异步网络进行通信。互联网和我们所有的数据中心都有这个属性,所以你在这件事上没有任何选择。
资料来源:Awesome Martin kleppmann 的作品
举个例子:Cassandra 最多可以是 AP 系统。但是,如果您将其配置为基于 Quorum 读取或写入,则它不会保持 CAP 可用(根据 CAP 定理的定义可用)并且只是 P 系统。
理解 CAP 定理的简单方法:
在网络分区的情况下,需要在完美可用性和完美一致性之间做出选择。
选择一致性意味着无法回答客户的查询,因为系统不能保证返回最近的写入。这牺牲了可用性。
选择可用性意味着能够响应客户的请求,但系统不能保证一致性,即最新写入的值。可用系统在给定情况下提供最佳答案。
这个解释来自这篇优秀的文章。希望它会有所帮助。
Brewer 的主题演讲、Gilbert 论文和许多其他处理方法将 C、A 和 P 置于同等地位,作为实现的理想属性,并有效地说“选择两个!”。但是,这通常被认为是一种误导性的演示,因为您无法构建或选择!- “分区容错”:您的系统可能会遇到分区,也可能不会。
CAP 更好地理解为描述您在构建可能遭受分区的系统时必须做出的权衡。实际上,这是每个分布式系统:没有 100% 可靠的网络。所以(至少在分布式环境中)没有现实的 CA 系统。您可能会遭受分区,因此您必须在某些时候妥协 C 或 A。
一致性——当我们发送读取请求时,如果它正在返回结果,它应该返回客户端请求给出的最新写入。可用性——你的读/写请求应该总是成功的。分区容错 – 当出现网络分区(某些机器无法相互通信)时,系统应该仍然可以工作。
在分布式中,有可能发生网络分区,我们无法避免 CAP 的“P”。所以我们在“一致性”和“可用性”之间进行选择。