3

在阅读了谷歌上的几篇文章后,我看到像 Mongo 这样的 NoSql DB 是为 CP 设计的(在 CAP 中),而 cassandra 是为 AP 设计的(在 CAP 中)

这是我的问题:-

Mongo 不能配置为提供 AP 而不是 CP 还是为 CP 严格设计的?卡桑德拉也是如此吗?

4

4 回答 4

2

自 2000 年首次出现以来,我们对 CAP 定理的理解发生了很大变化。关于“三选二”的概念存在很多混淆,但 Eric Brewer 在 2012 年的文章很好地消除了这些混淆(我猜)。

因此,CAP 定理与成为 CA 或 AP 或其他东西无关。很简单:网络分区可能一直在发生。这是不可避免的。当发生网络分区时,分布式数据库的架构应该允许其客户端根据需要调整一致性和可用性

这是什么意思?假设您在集群中的 3 个节点(N1、N2 和 N3 - 所以复制因子 = 3)之间复制一条数据。假设发生了一个将 N3 与 N1 和 N2 分开的网络分区:

将 N3 与 N1 和 N2 分开的网络分区

因此,所有 3 个节点都可以运行,但它们之间的网络现在存在问题。在这种情况下,客户端可能会向 N1、N2 或 N3 发出读取请求或写入请求。基于此客户端的一致性选择,集群的反应可能会有所不同:

  • 如果客户端向 N1 发出读取请求,N1 可以立即用自己的数据回答查询。或者 N1 可以将相同的查询转发给 N2,并将其数据与 N2 的数据进行比较,并返回最新的。在这里,集群的反应取决于客户端的一致性选择。客户根据其选择调整一致性。
  • 客户端也可以做出不同的选择:它可以强制 N1 从所有 3 个节点读取数据(即在 Cassandra 术语中读取 ALL 的一致性)。在这种情况下,集群返回一个错误,我们说集群不可用根据客户的选择。
  • 另一种可能性可能是这样的:客户可能已经向 N3 询问了数据。在这种情况下,N3 只返回其数据(读取一致性 = ONE)或查询失败(读取一致性 > 1)。

我不了解 Mongo,但考虑到 CAP 定理,这就是 Cassandra 的工作方式。

于 2018-01-16T07:50:22.770 回答
1

您可以通过允许裂脑在 MongoDB 中实现“AP”。

您可以通过将读/写设置为“ALL”设置来制作 Cassandra“CP”(存在 QUORUM 不够的极端情况)。

但是,关于为什么调用数据库 AP/CP 是一个错误的术语,有一篇非常好的文章。在 CAP 定理的背景下,关于什么是可用性和一致性有非常强大和可靠的定义,而且大多数时候人们没有深入了解它,而且顺便说一下,大多数数据库都不符合严格的要求CAP 定理既不是 AP 也不是 CP。

链接:https ://martin.kleppmann.com/2015/05/11/please-stop-calling-databases-cp-or-ap.html

于 2018-01-15T07:31:45.470 回答
1

Cassandra 使用可调一致性,您可以在写入和/或读取数据时使用不同的一致性级别对其进行控制。例如,如果您对写入和读取都使用 QUORUM,那么您将获得强一致性,尽管可用性可能会受到影响。

PS虽然我不能说Mongo......

于 2018-01-13T15:09:42.277 回答
0

MongoDB 永远不能成为 AP,因为它是基于领导者的系统。可能有两种情况:

  1. 当领导者与集群断开连接时,需要 10-12 秒来选举一个新的领导者,在此期间 MongoDB 将无法用于写入。
  2. 由于客户端和领导者之间的网络分区,客户端驱动程序与领导者断开连接。除非MongoDB客户端也参与leader选举并保持leader的心跳,否则我不确定mongo是否有这个特性。

就 Cassandra 而言,正如 Alex 所说,我们可以通过牺牲可用性来使 Cassandra 更加一致。

阅读这篇文章,以获得详细的解释。

于 2019-09-28T16:54:05.480 回答