1

我有一个在亚马逊上运行的 mongo 实例。单个集合中有 5M 文档。并且 20docs/1sec 进入数据。没有索引。而我的服务器只有50G空间,已经用了22G。

现在我需要对这些数据进行一些数据分析,但是因为在索引上,我执行了一个查询,数据库是阻塞的,直到我重新启动服务器才能插入数据。

而且数据不断进来,所以我担心空间不够用。

我要做的是构建另一个服务器,设置一个新的 mongo 实例,然后将数据复制到其中。然后在新索引上添加索引并进行分析。

什么是最好的方法,有什么建议吗?

4

2 回答 2

2

可能最好的方法是在后台创建一个索引。这不会阻止任何事情,然后您可以在您的节点上运行索引查询。在后台创建索引需要更长的时间,但它确实可以防止阻塞:

db.collection.ensureIndex( { col: 1 }, { background: true } );

另见:http ://docs.mongodb.org/manual/reference/method/db.collection.ensureIndex/

如果你真的想要一个辅助来做分析,那么你可以从你现有的成员创建一个副本集。但为此,您必须关闭 MongoDB - 并使用replSet参数重新启动它。使用该参数启动它后,您现在可以添加一个新的副本集成员来同步数据。这种同步也会影响性能,因为必须复制大量数据。oplog由于MongoDB 需要与辅助节点同步,主节点现在也需要更多磁盘空间。

mongodump并且mongorestore也可以是一个选项,但是两个节点之间的数据将不会保持同步。每次要对新数据运行分析时,都必须运行转储+恢复。在这种情况下,副本集可能会更好。

但是,副本集确实需要 3 个成员,以防止在节点出现故障时出现裂脑。这可以是另一个数据节点,但在您的情况下,您可能想要设置一个仲裁器。如果您想要自动故障转移(我认为在这种情况下您不需要它,因为您只是在进行分析),然后设置您的副本集两个节点,但隐藏第二个(新)节点:http ://docs.mongodb.org/manual/tutorial/configure-a-hidden-replica-set-member/

于 2013-08-06T14:03:34.137 回答
0
  1. 从这个现有成员设置副本集,然后在辅助节点上添加索引并进行分析。
  2. 获取一个 mongodump 并恢复到新服务器并进行分析
于 2013-08-06T04:58:41.533 回答