CAP定理背后的推理是什么?

Laz*_*zer 21 database-design distributed-databases database-theory

http://en.wikipedia.org/wiki/CAP_theorem

http://www.cs.berkeley.edu/~brewer/cs262b-2004/PODC-keynote.pdf

我想是不是非常简单,为什么只有两个

  1. 一致性
  2. 可用性
  3. 分区容差

可以适用于任何给定的分布式数据库系统。这个猜想被证实,但有没有看出为什么一个简单的方法可能是,这可能持有?

我不是在寻找证明,只是一种理解为什么这个定理可能有意义的好方法。理由是什么?

Ric*_*ard 25

好的,让我们假设您有一个分布式数据库。假设您在俄勒冈州有一个节点,在加利福尼亚州有一个节点。CAP 理论说在设置这种类型的数据库时会遇到问题。

例如,如果您从一个数据库中查询数据,它需要与另一个数据库中的数据相同。这确保您在一个数据库中拥有的任何值都保证在另一个数据库中(CAP 理论的一致性)。这样做允许您更新一个数据库中的数据并从另一个数据库查询它,获得相同的结果。

俄勒冈州的计算机更新数据,将数据传输到加利福尼亚

当我们在 Oregon 节点更新数据时,将数据发送到 California 节点,以便数据库保持一致。为了真正保持一致性,我们必须确保两个数据库都得到更新,然后才能真正保存数据(使用分布式事务的两阶段提交)。换句话说,如果加利福尼亚数据库由于某种原因(例如硬盘驱动器故障)无法保存数据,那么俄勒冈州的数据库将不会保存数据并且事务将失败。

当我们想要高可用性时,就会出现上述分布式事务的问题。在上面的这种情况下,尝试使两个数据库同步的过程是一个非常非常缓慢的过程。(想象一下,我们必须将数据从俄勒冈州发送到加利福尼亚州,确保它到达那里,确保两个数据库都锁定了数据,等等。)当我们想要一个快速响应的系统时,即使在高需求时期。(这是CAP 定理的可用性。)

通常,我们为确保高可用性所做的是使用复制而不是分布式事务。因此,我们不保证加利福尼亚州可以接受数据,而是继续将其存储在俄勒冈州节点中,然后在我们处理它时将数据发送到加利福尼亚州。这保证了我们始终可以存储数据,无论加利福尼亚是否准备好存储数据。

Oregon 节点更新数据,而 California 读取数据。 后来,数据被转移到加利福尼亚

这提高了可用性,但以牺牲一致性为代价。看,如果有人更新俄勒冈州的数据,然后有人(同时)读取加利福尼亚州的数据,他们就得不到新数据——数据库不再一致。事实上,直到俄勒冈州将数据发送到加利福尼亚州,它们才会保持一致!

所以,这就是可用性与一致性之间的权衡。

Partition Tolerance是 CAP 理论的第三个方面。在这种情况下,分区是指数据库(或其他分布式系统)可以分解成单独的部分并仍然正常运行。

问题变成了,当两个数据库都正常运行,但从俄勒冈州到加利福尼亚州的链接被切断时会发生什么?

正在读取加利福尼亚节点的同时更新俄勒冈州。 节点之间的网络被切断。

如果我们更新俄勒冈州的数据库,我们需要以一种或另一种方式(分布式事务或复制)将数据送到加利福尼亚州。但是,如果两者之间的链接被切断,则系统已分区并且数据库不再链接在一起。

发生这种情况时,您的选择是以可用性为代价停止允许更新(以维护一致性)或以一致性为代价允许更新(以维护可用性)。

如您所见,分区容错性在一致性和可用性之间产生了直接的权衡。


显然还有更多的东西,但这些是关于分布式系统的这三个主要方面如何相互配合和相互对抗的几个例子。 Julian Browne对 CAP 理论解释是了解更多信息的绝佳场所。