我有一个存储在Mongo中的100m推文的数据集,未经优化,未加索引。
我需要将上个月的所有推文复制到另一台服务器上,那么执行此操作的最佳方法是什么?
我的想法是使用Ruby脚本来提取相关推文并将其复制到服务器上的新数据库,然后运行mongo copyDatabase命令将其复制。 它采取可怕的很长,其他方式做呢?
require 'mongo_mapper' MongoMapper.database = 'twitter' require './models' tweets = TwitterTweet.where(:created_at => {"$gt" => 1.month.ago}).all; # about 15 million MongoMapper.database = 'monthly' # copy the tweets over to the new db tweets.each do |tweet| tweet.save! end;
首先,你提到它是未索引/未优化 – 是否至less有一个索引created_at
? 如果没有,那么你正在做一个大量低效的查询(表扫描),这不会非常快。
一般来说,最简单的做法可能是让现有的服务器成为主服务器,然后创build一个辅助服务器(请参阅副本服务器基本概念 )。 在副本集中,添加新的辅助节点时,它将与主节点同步,克隆所有现有数据,然后通过oplog应用任何后续更改。 一旦你满意地获得了所有你需要的数据(并且假设你不想保留副本集),只需重新启动mongod
而不用--replSet
参数(并且在不同的端口上通常是个好主意)你将在新的主机上有一个完整的副本。
更为人工的方法是closures当前的mongod
(或fsyncLock()
以保证不做任何更改),然后将数据库文件手动复制到新的主机 – 它们将位于dbpath
,如下所示:
<databasename>.ns <databasename>.0 <databasename>.1 <databasename>.2 etc.
它们包含了另一个mongod
需要的所有信息,所以一旦你将它们复制到新的主机上,并且你已经启动了MongoDB实例,你应该可以简单地use <databasename>
并且很好。
在每种情况下,对于任何未使用/不需要的部分,只要在新主机上启动并运行后再放下它们,然后在要回收磁盘空间的情况下运行修复 。
最后,如果你真的只想logging一部分logging,那么你可以使用查询filter来删除相关的集合,然后使用mongorestore导入到新的主机中。 我不认为这会比上面提出的ruby更快,特别是如果你缺lesscreated_at
索引。