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

当我试图理解CAP中的“Availability”(A)和“Partition tolerance”(P)时,我发现很难理解各种文章的解释。

我有一种感觉,a和P可以同时出现(我知道事实并非如此,这就是我不能理解的原因!)

简单地解释一下,什么是A和P以及它们之间的区别?

89324 次浏览

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

可用性意味着即使集群中的某个节点宕机,也能够访问集群。

分区容忍意味着即使两个节点之间存在“分区”(通信中断)(两个节点都在工作,但不能通信),集群也能继续工作。

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

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

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

所有可用的组合是:

  • CA -所有节点之间的数据是一致的-只要所有节点都在线-你可以从任何节点读/写,并确保数据是相同的,但如果你在节点之间开发了一个分区,数据将不同步(一旦分区被解析,数据就不会重新同步)。
  • CP -数据在所有节点之间保持一致,并在节点宕机时不可用,从而保持分区容忍(防止数据不同步)。
  • 美联社 -即使节点之间不能相互通信,它们也会保持在线,并且在分区解决后会重新同步数据,但不能保证所有节点都有相同的数据(无论是在分区期间还是在分区之后)。

你应该注意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和AP要问的问题。

现在在这个领域有一个很好的阅读是Brewer的“12年后”的帖子。我相信这将清晰地推进CAP辩论,并强烈推荐它。

http://www.infoq.com/articles/cap-twelve-years-later-how-the-rules-have-changed < a href = " http://www.infoq.com/articles/cap-twelve-years-later-how-the-rules-have-changed " > < / >

一致性-当我们发送读请求时,如果它正在返回结果,它应该返回客户端请求给出的最近的写。 可用性—您的读/写请求应该总是成功的。 分区容忍-当网络分区(一些机器相互通信的问题)发生时,系统仍然可以工作

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

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

CAP定理

一致性:

对于给定的客户端,读取操作保证为返回最近的写入(如ACID)。如果在此期间,任何请求都必须等待数据同步完成跨/在节点中。


可用性:

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


Partition-tolerance:

当发生网络分区时,系统将继续工作。


对于美联社,可用性(始终可访问)可以与(Cassendra)或 without(RDBMS)分区公差

pic source

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

enter image description here

一致性

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

可用性

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

分区容忍

系统的故障是非常罕见的

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

我觉得任何答案都没有很好地解释分区容忍,所以只是更详细地解释一下CAP定理的意思是:

C:(线性性或强一致性)大致是指

如果A操作成功完成后B操作开始,则 操作B必须看到系统处于与打开时相同的状态

.结束操作A,或更新状态(但绝不是旧状态)

一个:

"系统中非故障[数据库]节点接收的每个请求 必须导致[非错误]响应”。这对某些人来说是不够的 节点能够处理请求:任何未失败的节点都需要这样做 能够处理它。许多所谓的“高可用性”(即低可用性) 停机时间)系统实际上不符合这个定义 可用性。< / p >

P:

分区容忍(严重的错误命名)基本上意味着您是 通过可能延迟或中断的异步网络进行通信 消息。互联网和我们所有的数据中心都有这个特性,所以

.在这件事上你实际上没有任何选择

来源:Awesome Martin kleppmann的工作

举个例子: 卡桑德拉最多只能是AP系统。但是如果您将其配置为基于Quorum进行读写,那么它就不会保持CAP可用性(根据CAP定理的定义可用),而只是P system.

理解CAP定理的简单方法:

在网络分区的情况下,需要在完美之间进行选择

选择的一致性表示不能回答客户端的查询 系统不能保证返回最近的写操作。这 牺牲可用性。< / p >

选择可用性表示能够响应客户端的请求 但该系统不能保证一致性,即最近的一致性 价值写的。可用的系统提供了最好的可能答案

.在给定情况下

这个解释来自这篇精彩的文章。希望能有所帮助。

我找了很多环节,但是没有一个环节能给我满意的答案,只有一个环节。

因此,我用非常简单的语言描述CAP。

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

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

  • 分区容忍: 集群应该响应(必须可用),即使节点之间存在分区(即网络故障)。 enter image description here (另一个主要原因是它的命名习惯不好。如果我是对的,我可能会给出民主党全国委员会定理:数据一致性节点的可用性集群可用性,其中每个分别对应一致性可用性分区容忍)

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

美联社数据库: AP数据库以一致性为代价提供可用性和分区容差。当分区发生时,所有节点仍然可用,但那些在分区错误一端的节点可能返回比其他节点更旧的数据版本。(当分区被解析时,AP数据库通常会重新同步节点,以修复系统中的所有不一致。)

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

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

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

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

enter image description here

根据上图C是断开的,但A,B, D可以继续工作。现在我们可以调用system is 部分工作(Partition Tolerance)。

假设一个特定的事务需要只有 a,B和d,系统可以执行它而不产生任何不一致。

但是当C必须参与一个特定的事务时,系统可以以两种方式执行。

1.由于C不可用,A可以拒绝用户请求。

So the system has Partition-Tolerance and consistency (P,C).
But no availability, because of the rejection.

2.A可以将C接收到的消息保存在A的本地内存中,并在C连接回来时传输。

So the system has Partition-Tolerance and availability (P,A).
But no consistency.because C has not updated.