我有一个在亚马逊上运行的 mongo 实例。单个集合中有 5M 文档。并且 20docs/1sec 进入数据。没有索引。而我的服务器只有50G空间,已经用了22G。
现在我需要对这些数据进行一些数据分析,但是因为在索引上,我执行了一个查询,数据库是阻塞的,直到我重新启动服务器才能插入数据。
而且数据不断进来,所以我担心空间不够用。
我要做的是构建另一个服务器,设置一个新的 mongo 实例,然后将数据复制到其中。然后在新索引上添加索引并进行分析。
什么是最好的方法,有什么建议吗?
我有一个在亚马逊上运行的 mongo 实例。单个集合中有 5M 文档。并且 20docs/1sec 进入数据。没有索引。而我的服务器只有50G空间,已经用了22G。
现在我需要对这些数据进行一些数据分析,但是因为在索引上,我执行了一个查询,数据库是阻塞的,直到我重新启动服务器才能插入数据。
而且数据不断进来,所以我担心空间不够用。
我要做的是构建另一个服务器,设置一个新的 mongo 实例,然后将数据复制到其中。然后在新索引上添加索引并进行分析。
什么是最好的方法,有什么建议吗?
可能最好的方法是在后台创建一个索引。这不会阻止任何事情,然后您可以在您的节点上运行索引查询。在后台创建索引需要更长的时间,但它确实可以防止阻塞:
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/