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

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

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


当前回答

一致性:

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


可用性:

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


Partition-tolerance:

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


关于AP,可用性(始终可访问)可以与(Cassendra)或 没有(RDBMS)分区容忍

图片来源

其他回答

理解CAP定理的简单方法:

In case of network partition, one needs to choose between perfect availability and perfect consistency. Picking consistency means not being able to answer a client's query as the system cannot guarantee to return the most recent write. This sacrifices availability. Picking availability means being able to respond to a client's request but the system cannot guarantee consistency, i.e., the most recent value written. Available systems provide the best possible answer under the given circumstance.

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

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

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

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

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

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

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

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

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

A:

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

P:

分区容忍(命名不当)基本上意味着您 通过可能延迟或中断的异步网络进行通信 消息。互联网和我们所有的数据中心都有这个特性,所以 在这件事上你真的没有选择的余地。

来源:Martin kleppmann的作品

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

我将用这里提到的ATM机示例详细解释

CAP定理讨论了一致性和可用性之间的权衡,如果您的分布式系统遭受分区,您必须做出取舍。分布式系统意味着您将数据存储在多个节点中,分区意味着这些节点之间的连接以某种方式断开。

分区是分布式系统中的通信中断 两个节点之间的连接丢失或暂时延迟。分区 容忍度意味着集群必须在任何情况下继续工作 系统节点间通信中断次数。

假设我们有一家小银行,只有两台自动取款机。客户可以存、取、查余额。你必须确保余额不会低于零。这些atm机之间的连接可以通过三种方式断开

1-您要使用的ATM机不能用。你刚刚放了个坏了的牌子

2-你要用的ATM机在工作,但另一台不能工作

3-他们都在工作,但有一个网络问题,他们无法相互沟通。

这个分布式系统正在遭受分区,我们需要在可用性和一致性之间做出选择:

如果银行选择一致的设计,自动柜员机将不会处理您的请求,因为它无法更新另一台自动柜员机中的余额。 如果银行选择了可用性,你的ATM会处理请求,跟踪发生了什么,然后当连接建立时,它只是告诉其他ATM发生了什么,但余额同时会不一致。