我们有两个数据中心,并且正从两个数据中心向Mongo写入数据。该集合是分片的,我们在数据中心A中具有一个分片的主分支,在数据中心B中具有另一个分片的主分支。有时,数据中心之间的连接失败。
我们希望能够继续写两个DATACENTERS 。我们写的数据不会发生冲突 - 它们只是添加文档,或者更新不会在两个地方更新的文档。
然后,当连接返回时(有时在几秒钟甚至几分钟内),我们希望数据库很好地处理这种情况并自动更新所有数据。
有人可以告诉我这是否可行?在文档中没有说明当你将副本集分成两个独立的数据库时会发生什么,然后在重新连接它们之前让两者成为主数据库。怎么了?我该如何设置?
答案 0 :(得分:2)
我不明白为什么这不会像你已经设置的那样工作,假设你的辅助设备与你的辅助设备在同一个数据中心。
换句话说,如果分片A的主要和辅助副本位于数据中心A,而分片B的主要和辅助副本位于数据中心B,那么您已经在两个数据中心写入。
如果您现在失去两个数据中心之间的连接,那么来自数据中心A的客户端将无法读取或写入分片B,并且数据中心B中的客户端将无法写入分片A,但两者都是数据中心客户端将继续写入与它们位于同一数据中心的分片。
因此,这很简单 - 将大部分副本集保留在同一个数据中心,只要该数据中心启动,您就会继续写入该分片。
我有一种感觉,虽然你希望不知何故神奇地从一个断开连接的数据中心的客户端将他们的写入存储在其他数据中心的分片 - 这是不可能发生的 - 他们无法看到其他数据中心。因此,当连接返回时,DB无需处理(除了在断开连接阶段有一堆写入失败的事实)。
答案 1 :(得分:0)
不可能“分割副本集”在同一组中有两个原色。
所以你有两个副本集,使用mongos作为路由器在一个密钥上进行分片。 一种解决方案是,如果将分片键的第一部分设置为以“A”或“B”开头,这意味着如果新记录以A开头,则将其路由到第一组,如果是B,则将其路由到第2组。组。 这是你可以控制mongos尝试放置数据的唯一方法。
mongos和不同的replicasets之间的连接问题无关紧要,只要你的新条目没有与破坏的replicaset匹配的分片密钥。
例如,您可以让数据中心A中的mongo客户端写入数据,始终使用A启动分片键。这意味着如果数据中心B关闭,则只创建带有A的记录。
两个中心的客户都可以访问两个分片的读取,只要它们已经启动。
Mongos应该靠近每个客户端运行,因此您将在两个位置都拥有这些位置,每个位置都可以访问分片配置
答案 2 :(得分:0)
副本集节点无法成为主节点,除非它至少看到一半节点。这意味着如果没有指向primary所在的数据中心的链接,则无法写入该分片。
我可以看到如何为此实现本土解决方案。但这需要一些努力。
您可能还想查看CouchDB。它也是无模式和基于JSON的,它可以很好地处理你的情况(它基本上是为这种情况而构建的)。