同步两个MongoDB集合
我有2个mongodb放置在2个不同的服务器。 每个都有一个收集items
。 第一个集合有生产数据,并执行大量的insert
和update
,第二个是空的。
现在我的任务是将数据从第一个集合传输到第二个集合,并保持同步几个小时。
我们已经实施了oplog
解决scheme。 但是由于我们在第一个蒙元天堂里没有听取local
collections的许可,我们必须find另一个出路。
我想到的一种方法是创build2个服务: – 在第一个调用中,我查询第一个集合中的所有数据并将其传送到第二个集合。 然后我将这些数据保存在内存中。 – 在第二次调用中,我查询第一个集合中的所有数据,然后使用工具对它们进行比较,然后将差异发送到第二个集合。 – 重复,直到2个服务之一被取消。
显而易见的问题是查询和比较数据的资源浪费巨大。
所以我需要你的帮助来find解决这个问题的另一种方法。
提前致谢。
生命值
您在OP中描述的解决scheme:
我想到的一种方法是创build2个服务: – 在第一个调用中,我查询第一个集合中的所有数据并将其传送到第二个集合。 然后我将这些数据保存在内存中。 – 在第二次调用中,我查询第一个集合中的所有数据,然后使用工具对它们进行比较,然后将差异发送到第二个集合。 – 重复,直到2个服务之一被取消。
…让我觉得这是某种蓝/绿的部署模式,或者您的意图是在面对第一次收集时丢失Mongo商店的时候提供弹性。 如果是这样,那么我认为正确的做法是使用Mongo复制数据库,让Mongo为您提供适应能力。
但是,我可能会错过一些东西…或许你的情况有一些细节:(a)我无法从你的问题中推断出来,(b)需要某种手动的,接近实时的,从一个收集到另一个。 如果是这样,那么我认为oplog解决scheme是这个用例的常见解决scheme。 也许你应该重新审视一下,看看你能否克服这个问题:
我们没有权限在第一个mongodb上收听本地collections
如果这真的不是一个跑步者,那么如果你可以截取所有对第一个集合的写入(也就是说,如果你的应用程序提供了一个节制点或钩子来将行为应用到所有的写入),你可以实现这样的事情:
- 在继续写入之前,在某种可执行任务中包装传入命令(即数据和写入types:insert | update | delete)
- 把这个任务放在一个队列中
- 提供一个作用于这些任务的线程池,将每个任务的命令应用到第二个colleciotn。
例如:
- 接收
data
的INSERT- 将此插入应用于第一个集合(正如您通常所做的那样)
- asynchronous(以免对应用程序吞吐量产生不利影响)将此插入应用于第二个集合
- 接收实体
123
的DELETE- 从第一个集合中删除实体
123
- asynchronous删除第一个集合中的实体
123
- 从第一个集合中删除实体
- …等