Node.js 同步两个MongoDB集合

Node.js 同步两个MongoDB集合,node.js,mongodb,Node.js,Mongodb,我有2个mongodb放在2个不同的服务器上。每个都有一个集合项。第一个集合具有生产数据,并执行大量的插入和更新,第二个集合为空 现在,我的任务是将数据从第一次收集传输到第二次收集,并将它们保持同步数小时 我们已经实施了oplog解决方案。但是,由于我们在第一个mongodb中没有权限收听local集合,我们必须找到另一条出路 我想到的一个方法是创建两个服务: -在第一次调用中,我查询第一次采集的所有数据并将其传输到第二次采集。然后我将数据保存在内存中。 -在第二个调用中,我查询第一个集合中的所

我有2个mongodb放在2个不同的服务器上。每个都有一个集合
。第一个集合具有生产数据,并执行大量的
插入
更新
,第二个集合为空

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

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

我想到的一个方法是创建两个服务: -在第一次调用中,我查询第一次采集的所有数据并将其传输到第二次采集。然后我将数据保存在内存中。 -在第二个调用中,我查询第一个集合中的所有数据,然后使用工具对它们进行区分,然后将区分发送到第二个集合。 -重复此操作,直到2个服务中的一个被取下

最明显的问题是查询和比较数据会造成巨大的资源浪费

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

提前谢谢


HP

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

我想到的一种方法是创建两个服务:-在第一次调用中,我查询第一次收集的所有数据并传输到第二次收集。然后我把数据保存在内存中在第二个调用中,我查询第一个集合中的所有数据,然后使用工具对它们进行区分,然后将区分发送到第二个集合重复此操作,直到2个服务中的一个被取下

。。。这让我觉得这是某种意义上的,或者也许你的目的是为了在第一次失去Mongo商店时提供弹性。如果是这样的话,那么我认为正确的方法是使用Mongo复制集,让Mongo为您提供恢复能力

然而,我可能错过了一些东西。。。也许你的情况有一些细节:(a)我无法从你的问题中推断出来,(b)需要某种手动的、近乎实时的从一个收藏复制到另一个收藏。如果是这样,那么我认为oplog解决方案是这个用例的常见解决方案。也许您应该重新考虑一下,看看是否能够克服这个问题:

我们没有权限在第一个mongodb中收听本地收藏

如果这真的不是一个运行程序,那么如果您可以截获对第一个集合的所有写入(即,如果您的应用程序提供了一个节流点或钩子用于将行为应用于所有写入),那么您可以实现如下功能:

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

  • 接收带有
    数据的插入
    
    • 将此插入应用于第一个集合(通常会这样做)
    • 异步(以免对应用程序吞吐量产生不利影响)将此插入应用于第二个集合
  • 接收实体的删除
    123
    • 从第一个集合中删除实体
      123
    • 从第一个集合异步删除实体
      123
  • 。。。等

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

我想到的一种方法是创建两个服务:-在第一次调用中,我查询第一次收集的所有数据并传输到第二次收集。然后我把数据保存在内存中在第二个调用中,我查询第一个集合中的所有数据,然后使用工具对它们进行区分,然后将区分发送到第二个集合重复此操作,直到2个服务中的一个被取下

。。。这让我觉得这是某种意义上的,或者也许你的目的是为了在第一次失去Mongo商店时提供弹性。如果是这样的话,那么我认为正确的方法是使用Mongo复制集,让Mongo为您提供恢复能力

然而,我可能错过了一些东西。。。也许你的情况有一些细节:(a)我无法从你的问题中推断出来,(b)需要某种手动的、近乎实时的从一个收藏复制到另一个收藏。如果是这样,那么我认为oplog解决方案是这个用例的常见解决方案。也许您应该重新考虑一下,看看是否能够克服这个问题:

我们没有权限在第一个mongodb中收听本地收藏

如果这真的不是一个运行程序,那么如果您可以截获对第一个集合的所有写入(即,如果您的应用程序提供了一个节流点或钩子用于将行为应用于所有写入),那么您可以实现如下功能:

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

  • 接收带有
    数据的插入
    
    • 将此插入应用于第一个集合(通常会这样做)
    • 异步(以免对应用程序吞吐量产生不利影响)将此插入应用于第二个集合
  • 接收实体的删除
    123
    • 从第一个集合中删除实体
      123
    • 从第一个集合异步删除实体
      123
  • 。。。等