4

我们有两个数据中心,并且正在从两个数据中心向 Mongo 写入数据。集合是分片的,我们在数据中心 A 中有一个分片的主分片,而数据中心 B 中的另一个分片的主分片。有时,数据中心之间的连接会失败。

我们希望能够继续在 BOTH DATACENTERS 中写作。我们正在编写的数据不会冲突——它们都只是添加文档,或者更新不会在两个地方更新的文档。

然后,当连接恢复时(有时是几秒钟,甚至几分钟),我们希望数据库能够很好地应对这种情况并自动更新所有数据。

有人可以建议这是否可能吗?当您将副本集划分为两个独立的数据库时,文档中并没有太多说明会发生什么,然后让两者都成为主数据库,直到您重新连接它们。怎么了?我该如何设置?

4

3 回答 3

2

我不明白为什么这不会像您已经设置的方式那样工作,假设您的辅助服务器与您的主服务器位于同一个数据中心。

换句话说,如果分片 A 的主节点和辅助节点位于数据中心 A 中,而分片 B 的主节点和次节点位于数据中心 B 中,那么您已经在两个数据中心中写入。

如果您现在失去两个数据中心之间的连接,那么来自数据中心 A 的客户端将无法读取或写入分片 B,数据中心 B 中的客户端将无法写入分片 A,但两个数据中心客户端将继续写入与它们位于同一数据中心的分片。

所以,这很简单——将大部分副本集保持在同一个数据中心,只要该数据中心启动,您就会继续写入该分片。

我有一种感觉,尽管您希望来自断开连接的数据中心的客户会以某种神奇的方式将他们对另一个数据中心的分片的写入存储在某个地方——这不可能发生——他们看不到另一个数据中心。因此,当连接恢复时,数据库无需处理任何事情(除了在断开连接阶段有一堆写入失败的事实)。

于 2012-05-17T06:26:31.417 回答
0

不可能“划分副本集”以在同一集中拥有两个主节点。

所以你有两个副本集,它们使用 mongos 作为路由器在一个键上分片。一种解决方案是,如果分片键的第一部分设置为以“A”或“B”开头,这意味着如果新记录以 A 开头,它将被路由到第一个集合,如果是 B,它被路由到第二个集合放。这是您可以控制 mongos 尝试将数据放置在何处的唯一方法。

只要您的新条目没有与损坏的副本集匹配的分片键,mongos 和不同副本集之间的连接问题就无关紧要。

例如,您可以让数据中心 A 中写入数据的 mongo 客户端始终使用 A 启动分片键。这意味着如果数据中心 B 关闭,则仅创建带有 A 的记录。

只要两个分片都启动,两个中心上的客户端就可以访问来自两个分片的读取。

Mongos 应该在每个客户端附近运行,因此您将在两个位置都有这些,每个位置都可以访问分片配置

于 2012-05-17T00:46:21.223 回答
0

除非看到至少一半的节点,否则副本集节点不能成为主节点。这意味着如果没有指向主要所在数据中心的链接,则无法写入该分片。

我可以看到如何为此实施本土解决方案。但这需要一些努力。

您可能还想查看 CouchDB。它也是无模式和基于 JSON 的,它可以很好地处理你的情况(它基本上是为这样的情况而构建的)。

于 2012-05-17T06:14:44.357 回答