【发布时间】:2012-02-28 05:44:33
【问题描述】:
我有一个运行 Mongo 和 Rails 应用程序的 Web 服务器(40gig hd,1 gig ram)。
Mongo DB 是 Twitter 推文和用户的文档存储,拥有数百万条记录。我对数据执行 map-reduce 查询以提取最常见的主题标签、单词、提及等内容(非常标准的内容)。每条推文的元数据都已存储,因此 map-reduce 确实与单个收集一样有效。
但是,由于它是在(相当)大的数据集上运行的,因此无法再实时完成 - 例如,我有一个报告生成器,可以连续计算出一大堆这些 map-reduce 2 万条推文大约需要 2 分钟。
扩展 mongo 的最快、最便宜的方法是什么,尤其是在 map-reduce 性能方面?我可以设置一个额外的服务器并分担负载,但不知道我应该使用分片、复制还是两者兼而有之?在这种情况下,分片可能是矫枉过正。
希望对我的 mysql-mongo 连接进行一些输入。 mysql 包含 twitter 配置文件,这些配置文件存储每个配置文件的 twitter id。每次 map reduce 完成时,它都会收集所有 ID 作为选项馈送到 mapreduce 中,即:
@profile_tweet_ids = current_profile_tweet_ids # array of ids
@daily_trend = TwitterTweet.daily_trend :query => {:twitter_id => {"$in" => @profile_tweet_ids}}
TwitterTweet 中的 mapreduce 函数如下所示:
def daily_trend(options={})
options[:out] = "daily_trend"
map = %Q( function(){
if (this.created_at != null)
{
emit(this.created_at.toDateString(), 1);
}
})
result = collection.map_reduce(map, standard_reduce, options)
normalize_results(result)
end
感谢任何建议!
【问题讨论】:
标签: mongodb scalability