2012-02-28 46 views
1

我有一个运行Mongo和Rails应用程序的web服务器(40gig hd,1 gig ram)。用有限的资源来扩展Mongo的最简单方法?

Mongo DB是Twitter推文和用户的文档商店,拥有数百万条记录。我对数据执行map-reduce查询以提取诸如最常见的主题标签,单词,提及等(非常标准的东西)。每条推文的元数据已经存储,因此map-reduce与单个收集一样高效。但是,由于它运行在一个(相当)大的数据集上,因此无法实时完成 - 例如,我有一个报告生成器,可以计算出一大堆这些map-reduce排2万分钟,需要2万分钟的推文。

什么是最快,最便宜的方式来缩放mongo,特别是在地图缩减性能?我可以建立一个额外的服务器并分割负载,但是不知道我应该使用分片,复制还是两者?对于这种情况,分片可能会过度。

会喜欢我的mysql-mongo连接上的一些输入。 mysql包含存储每个配置文件的twitter id的twitter配置文件。每个地图缩短完成时间,它收集所有的ID被供给作为选项加入到MapReduce的,即:在TwitterTweet

@profile_tweet_ids = current_profile_tweet_ids # array of ids 
@daily_trend = TwitterTweet.daily_trend :query => {:twitter_id => {"$in" => @profile_tweet_ids}} 

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 

任何建议表示赞赏!像MongoLab云服务

回答

0

使用一个..取决于你的虽然价格低廉定义..

2

如果你正在做简单的计数,求和,唯一等,您可能能够避免使用完全的map-reduce 。您可以使用$ inc操作符来实时获取所需的大部分内容。 我在我的博客文章real-time analytics with MongoDB中详细解释了这一点。

0

有关使用操作符而不是MapReduce的答案有好处,并且可能会更有利于您获得实时响应的努力。 MongoDB上的Map Reduce不适用于产生实时响应。

此外,您还可以从新的汇总框架(http://www.mongodb.org/display/DOCS/Aggregation+Framework)中受益,一旦在下一版本中可用即可。

要回答关于如何扩展MapReduce的更一般问题,添加新服务器可能没有帮助,如果您只是将其添加为辅助,作为辅助它将无法存储您的M/R会产生一个集合,因此内联是您唯一的选择。如果您不需要将结果存储在集合中,那么这是您最简单的方法。有关更多信息,请参阅此处的深入讨论:http://groups.google.com/group/mongodb-user/browse_thread/thread/bd8f5734dc64117a

分片可以帮助扩展,但请记住,您需要通过mongos进程运行所有内容,配置服务器,并且mongos需要最终确定每个分片返回的结果集,因此,根据您的数据添加新的潜在瓶颈,并且您需要的不仅仅是一台额外的机器,以使其可靠地工作。

2

听起来像你的使用案例更多的是在线流/事件处理。 您可以使用mongo或其他数据库/缓存产品来存储参考数据,以及用于接收和处理事件的事件处理框架。有几个工具可以帮助你 - 在我的脑海里,有一些:Twitter Storm,Apache S4,GigaSpaces XAP(免责声明 - 我为GigaSpaces工作)和GridGain。

0

这是不同的数据项之间的连接是(他们让公众做分类的数据,更有价值的工作),最有价值的给他们,因此也是最危险的,你http://indresult.com

相关问题