8

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

例如:

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

4

2 回答 2

6

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

MongoDB 副本集由一个主服务器组成,该主服务器异步复制到同一副本集中的一个或多个辅助服务器。您不能配置具有多个主副本的副本集或复制到不同的副本集。

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

一些一般性警告:

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

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

方法#1:使用mongodumpmongorestore

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

注意事项:

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

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

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

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

鉴于警告,这种方法最简单的用法是进行完全转储和恢复(即使用mongorestore --drop)以确保复制所有更改。

方法 #2:在 MongoDB 中使用可尾游标oplog

如果您需要更多实时或增量复制,一种可能的方法是在 MongoDB 复制上创建可尾游标oplog

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

一个可能感兴趣的相关工具是来自 10gen 实验室的实验性Mongo 连接器。这是一个 Python 模块,它提供了一个跟踪复制的接口oplog

注意事项:

  • 您必须为此实现自己的代码,并学习/理解如何使用oplog文档

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

于 2013-01-03T07:16:44.860 回答
0

您应该知道,只有副本集用于进行复制,副本集总是意味着:一个主,多个辅助。写入总是转到主服务器。显然您想要 MongoDB 不支持的多主复制。所以你想研究一种不同的技术,比如 CouchDB 或 CouchBase。MongoDB在这里是爆桶。

于 2012-12-14T15:46:47.940 回答