同步两个MongoDB集合

时间:2017-09-26 08:47:19

标签: node.js mongodb

我有2个mongodb放在2个不同的服务器上。每个都有一个集合items。第一个集合包含生产数据,执行大量insertupdate,第二个集合为空。

现在我的任务是将数据从第一个集合传输到第二个集合,并使它们保持同步几个小时。

我们已经实施 oplog解决方案。但由于我们没有权限在第一个mongodb中收听local集合,我们必须找到另一条出路。

我想到的方法之一是创建2个服务: - 在第一次调用中,我查询第一个集合中的所有数据并转移到第二个集合。然后我将这些数据保存在内存中。 - 在第二次调用中,我查询第一个集合中的所有数据,然后使用工具来区分它们,然后将差异发送到第二个集合。 - 重复操作,直到其中一项服务被删除。

显而易见的问题是查询和比较数据的资源浪费巨大。

所以我需要你的帮助才能找到解决这个问题的另一种方法。

提前致谢。

HP

1 个答案:

答案 0 :(得分:0)

您在OP中描述的解决方案:

  

我想到的方法之一是创建2个服务: - 在第一次调用中,我查询第一个集合中的所有数据并转移到第二个集合。然后我将这些数据保存在内存中。 - 在第二次调用中,我查询第一个集合中的所有数据,然后使用工具来区分它们,然后将差异发送到第二个集合。 - 重复操作,直到其中一项服务被删除。

...让我觉得这是某种blue/green deployment model或者你的意图是在面对第一个系列失去Mongo商店时提供弹性。如果是这样,那么我认为正确的方法是使用Mongo复制集,让Mongo为您提供弹性。

但是,我可能会遗漏一些东西......也许你的情况有一些细节,(a)我无法从你的问题中推断出来;(b)要求某种手动,接近实时,从一个集合复制到另一个集合。如果是这样,那么我认为oplog解决方案这个用例的通用解决方案。也许你应该重新审视一下,看看你是否能克服这个问题:

  

我们缺乏在第一个mongodb中收听本地收藏的权限

如果那真的不是跑步者,那么如果你可以拦截对第一个集合的所有写入(即,如果你的应用程序提供了一个节流点或钩子来对所有写入应用行为),你可以实现这样的事情:

  • 在继续写入包装传入命令(即数据和写入类型:insert | update | delete)之前的某种可执行任务
  • 将该任务放在队列中
  • 提供一个作用于这些任务的线程池,将每个任务的命令应用于第二个colleciotn。

例如:

  • 收到data的INSERT
    • 将此插入内容应用于第一个集合(正如您通常所做的那样)
    • 异步(以免对应用程序吞吐量产生负面影响)将此插入应用于第二个集合
  • 接收实体123的DELETE
    • 从第一个集合中删除实体123
    • 从第一个集合中异步删除实体123
  • ...... etc