19

阅读 Nathan Hurst 的NoSQL 系统视觉指南,他包含了CAP三角形:

  • C坚持
  • A可用性
  • P工件公差

在此处输入图像描述

SQL Server 是一个AC系统,MongoDB 是一个CP系统。

这些定义来自加州大学伯克利分校教授 Eric Brewer,以及他在 PODC 2000(分布式计算原理)上的演讲:

可用性

可用性意味着——服务是可用的(完全运行或不如上所述)。当您购买这本书时,您希望得到回应,而不是一些关于网站无法交流的浏览器消息。Gilbert & Lynch 在他们的 CAP 定理证明中提出了一个很好的观点,即可用性通常会在您最需要它时抛弃您——站点往往会在繁忙时期出现故障,这正是因为它们很忙。可用但未被访问的服务对任何人都没有好处。

在 MongoDB 或 BigTable 的上下文中,系统不“可用”是什么意思?

您是否去连接(例如通过 TCP/IP),但服务器没有响应?您是否尝试执行查询,但查询从不返回 - 或返回错误?

不可用是什么意思?

4

2 回答 2

13

在这种情况下,可用性意味着在网络分区的情况下,客户端连接的服务器可能无法保证客户端期望(或系统配置为提供)的一致性级别。

假设您在假设的分布式系统中有 3 个节点 A、B 和 C。A、B 和 C 各自在各自的服务器机架中运行,它们之间有 2 个交换机:

[Node A] <- Switch #1 -> [Node B] <- Switch #2 -> [ Node C ]

现在假设已设置所述系统,以保证任何写入在被认为已提交之前将至少到达 2 个节点。现在,让我们假设交换机#2 被拔掉,并且一些客户端连接到节点 C:

[Node A] <- Switch #1 -> [Node B]                 [ Node C ] <-- Some client

该客户端将无法发出一致性写入,因为分布式系统当前处于分区状态(即节点 C 无法联系足够多的其他节点来保证所需的 2 节点一致性)。

我要补充一点,一些 NoSQL 数据库允许非常动态地选择 CAP 属性。例如,Cassandra 允许客户端指定在每次写入之前写入必须到达的服务器数量。写入单个服务器是“AP”,写入仲裁(或所有)服务器更多是“CA”。

编辑-来自以下评论:

在 MongoDB 中,您只能在副本集中拥有主/从配置。这意味着 AP 与 CP 的选择是由客户端在查询时做出的。客户端可以指定slaveOk,它将从任意选择的slave(可能有陈旧数据)中读取:mongodb.org/display/DOCS/…。如果客户端对陈旧数据不满意,请不要指定 slaveOk,查询将转到主服务器。如果客户端无法访问主服务器,那么您将收到错误消息。我不确定该错误到底是什么。

于 2011-09-07T19:41:16.977 回答
6

CAP 定理适用于分布式计算机系统。MongoDB 支持两种不同形式的分布式计算:用于水平扩展的分片和用于故障转移/高可用性的副本集。两者可以一起使用,也可以单独使用。我认为 CAP 定理对这两种形式的应用略有不同:

分片级别- MongoDB 最多将数据存储在一个权威分片上。

  • 强一致性:一条数据最多存在一个分片上。不存在不正确/陈旧的数据。
  • 强大的分区容错性:即使网络分区,请求也永远不会返回不正确/陈旧的数据。分片继续独立于其他分片工作。

  • 可用性弱:在停机分片上读取/写入数据将失败。

副本集级别- MongoDB 在分片内复制数据,通过单个权威主节点确保一致性。

  • 强一致性:主节点处理的所有读/写。
  • 强分区容错性:如果有足够多的节点无法访问,则会选出一个新的主节点。选举过程确保始终最多有一个主节点。

  • 可用性弱:当不存在主节点时,即使可以通过辅助节点访问数据,读/写也会失败。


slaveOK/ReadPreference.SECONDARY 选项牺牲了一些一致性(可以读取陈旧的数据)以提高性能和可用性。

于 2012-02-02T08:12:02.487 回答