MongoDB单向复制

时间:2012-12-14 12:30:05

标签: mongodb

需要一些方法将数据从客户端数据库推送到中央数据库。基本上,有几个MongoDB实例在远程机器[客户端]上运行,并且需要一些方法来定期更新中央mongo数据库,其中包含客户端中新添加和修改的文档.it必须将其记录复制到单个中央服务器

例如:

如果我在3台机器上运行3个mongo实例,每台机器都有10GB的数据,那么在数据迁移之后,第4台机器的mongoDB必须有30GB的数据。并且中央mongoDB机器必须定期更新所有这3台机器的数据。但是这3台机器不仅获得了新文件,而且其中的现有文件可能会得到更新。我希望中央mongoDB机器也能获得这些更新。

2 个答案:

答案 0 :(得分:6)

MongoDB并未正式支持您所需的复制策略。

MongoDB replica set由单个主节点组成,具有到同一副本集中的一个或多个辅助服务器的异步复制。您无法配置具有多个主要副本集或复制到不同副本集的副本集。

但是,根据您希望保持中央服务器最新状态以及需要管理的数据/更新量的积极程度,您的用例有几种可能的方法。

一些一般性的警告:

  • 合并来自多个独立服务器的数据可能会产生意外冲突。例如,唯一索引不了解在其他服务器上创建的文档。

  • 理想情况下,您合并的数据仍将由每个源服务器的唯一数据库名称分隔,因此您不会在恰好具有相同名称空间且_id共享的不同文档之间发生奇怪的串扰不同的原始服务器。

方法#1:使用mongodumpmongorestore

如果您只需要定期将内容同步到中央服务器,一种方法是使用mongodump and mongorestore。您可以从每个独立实例安排定期mongodump,并使用mongorestore将它们导入中央服务器。

注意事项:

  • mongorestore --db parameter允许您从原始名称恢复到不同的数据库(如果需要)

  • mongorestore仅对现有数据库执行插入操作(即执行更新或upserts)。如果目标数据库中已存在具有相同_id的现有数据,则mongorestore不会替换它。

  • 您可以使用mongodumpoplog选项对要导出的数据更具选择性(例如,仅选择最近的数据而不是全部数据)

  • 如果要限制转储的数据量和每次运行时恢复(例如,仅导出“已更改”数据),您将需要了解如何处理中央服务器上的更新和删除。

考虑到这些警告,这种方法最简单的用法就是完全转储&恢复(即使用--query)以确保复制所有更改。

方法#2:使用MongoDB oplog的tailable游标。

如果您需要更多实时或增量复制,MongoDB复制mongorestore --drop的可能方法是creating tailable cursors

这种方法基本上是“滚动你自己的复制”。您必须编写一个应用程序,在每个MongoDB实例上添加oplog,并查找感兴趣的更改以保存到中央服务器。例如,您可能只想复制选择性命名空间(数据库或集合)的更改。

可能感兴趣的相关工具是来自10gen实验室的实验oplog。这是一个Python模块,它提供了一个用于拖尾复制的接口oplog

注意事项:

  • 您必须为此实现自己的代码,并了解/了解如何使用{{1}}文档

  • 可能有一种替代产品可以“开箱即用”更好地支持您想要的复制模型。

答案 1 :(得分:0)

您应该知道,只有复制集用于复制,复制集始终意味着:一个主要,多个辅助。写始终转到主服务器。显然,您需要MongoDB不支持的多主复制。所以你想要研究像CouchDB或CouchBase这样的不同技术。 MongoDB在这里爆发了。