271

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

我感觉A和P可以一起走(我知道不是这样,这就是我无法理解的原因!)。

简单来说,A和P是什么以及它们之间的区别?

4

10 回答 10

539

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

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

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

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

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

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

所有可用的组合是:

  • CA - 所有节点之间的数据是一致的 - 只要所有节点都在线 - 您可以从任何节点读取/写入并确保数据相同,但是如果您在节点之间开发了分区,则数据将是不同步(一旦分区被解决就不会重新同步)。
  • CP - 数据在所有节点之间保持一致,并通过在节点关闭时变得不可用来保持分区容差(防止数据不同步)。
  • AP - 节点保持在线,即使它们无法相互通信,并且会在分区解决后重新同步数据,但您不能保证所有节点都将拥有相同的数据(在分区期间或之后)

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

于 2012-09-10T08:14:45.933 回答
70

将 P 与 C 和 A 等同考虑有点错误,而 C、A、P 中的“三分之二”的概念具有误导性。我解释 CAP 定理的简洁方式是,“在分布式数据存储中,在网络分区时,您必须选择一致性或可用性,并且不能同时获得两者”。较新的 NoSQL 系统试图关注可用性,而传统的 ACID 数据库更关注一致性。

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

于 2014-01-23T17:10:41.983 回答
20

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

于 2014-07-09T17:31:47.547 回答
18

CAP定理

一致性:

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


可用性:

每个节点(如果没有失败)总是执行查询并且应该总是响应请求。它是否返回最新的副本并不重要。


分区容错:

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


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

图片来源

于 2017-04-18T09:19:45.867 回答
6

我浏览了很多链接,但没有一个能给我满意的答案,除了一个。

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

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

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

  • Partition Tolerance集群应该响应(必须可用),即使节点之间存在分区(即网络故障)。

(同样令人困惑的一个主要原因是它的命名约定不好。如果我是对的,我可能会给出DNC定理:数据一致性节点可用性集群可用性,其中每个分别对应于一致性可用性分区容差)

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

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

CA 数据库: CA 数据库提供跨所有节点的一致性和可用性。但是,如果系统中的任何两个节点之间存在分区,它就无法做到这一点,因此无法提供容错能力。在分布式系统中,分区是不可避免的。因此,虽然我们可以在理论上讨论 CA 分布式数据库,但出于所有实际目的,CA 分布式数据库可以存在但不应该存在。

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

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

于 2020-06-29T19:26:36.330 回答
3

我觉得在任何答案中都没有很好地解释分区容差,所以只是为了更详细地解释 CAP 定理意味着:

C:(线性化或强一致性)大致意思是

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

“系统中非失败 [数据库] 节点收到的每个请求都必须产生 [非错误] 响应”。某些节点能够处理请求是不够的:任何非失败节点都需要能够处理它。许多所谓的“高可用性”(即低停机时间)系统实际上并不符合这个可用性定义。

: _

Partition Tolerance(名字严重错误)基本上意味着您正在通过可能延迟或丢弃消息的异步网络进行通信。互联网和我们所有的数据中心都有这个属性,所以你在这件事上没有任何选择。

资料来源:Awesome Martin kleppmann 的作品

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

于 2019-06-23T21:08:53.343 回答
2

理解 CAP 定理的简单方法:

在网络分区的情况下,需要在完美可用性和完美一致性之间做出选择。

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

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

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

于 2019-10-15T09:02:24.187 回答
1

在简单的 CAP 定理中,分布式系统不可能同时提供所有三个保证:

在此处输入图像描述

一致性

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

可用性

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

分区容错

系统故障非常罕见

大多数情况下,每个系统只能保证CA、AP 或 CP至少两个功能。

于 2018-05-17T07:45:39.747 回答
1

Brewer 的主题演讲、Gilbert 论文和许多其他处理方法将 C、A 和 P 置于同等地位,作为实现的理想属性,并有效地说“选择两个!”。但是,这通常被认为是一种误导性的演示,因为您无法构建或选择!- “分区容错”:您的系统可能会遇到分区,也可能不会。

CAP 更好地理解为描述您在构建可能遭受分区的系统时必须做出的权衡。实际上,这是每个分布式系统:没有 100% 可靠的网络。所以(至少在分布式环境中)没有现实的 CA 系统。您可能会遭受分区,因此您必须在某些时候妥协 C 或 A。

https://github.com/henryr/cap-faq#10-why-do-some-people-get-annoyed-when-i-characterise-my-system-as-ca

于 2021-05-07T04:04:26.363 回答
0

一致性——当我们发送读取请求时,如果它正在返回结果,它应该返回客户端请求给出的最新写入。可用性——你的读/写请求应该总是成功的。分区容错 – 当出现网络分区(某些机器无法相互通信)时,系统应该仍然可以工作。

在分布式中,有可能发生网络分区,我们无法避免 CAP 的“P”。所以我们在“一致性”和“可用性”之间进行选择。

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

于 2015-03-05T08:46:06.323 回答