用有限的资源扩展Mongo的最简单方法?

时间:2012-02-28 05:44:34

标签: mongodb scalability

我有一个运行Mongo和Rails应用程序的Web服务器(40gig hd,1 gig ram)。

Mongo DB是Twitter推文和用户的文档存储,拥有数百万条记录。我对数据执行map-reduce查询,以提取最常见的主题标签,单词,提及等内容(非常标准的东西)。每条推文的元数据已经存储,因此map-reduce与单个收集一样高效。

然而,由于它是在一个(相当)大的数据集上运行的,所以它不能再实时完成 - 例如我有一个报告生成器可以计算出一大堆这些映射 - 连续减少2万条推文大约需要2分钟。

缩放mongo的最快捷,最便宜的方法是什么,特别是在地图缩减性能方面?我可以设置一个额外的服务器并拆分负载,但想知道我是否应该使用分片,复制或两者兼而有之?对于这种情况,分片可能有点过分。

会喜欢我的mysql-mongo连接上的一些输入。 mysql包含为每个配置文件存储twitter ID的twitter配置文件。每次完成地图缩小时,它会将所有要作为选项输入的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

感谢任何建议!

5 个答案:

答案 0 :(得分:2)

如果您正在进行简单的计数,求和,独特等,您可以完全避免使用map-reduce。您可以使用$ inc运算符来实时获取所需的大部分内容。 我在real-time analytics with MongoDB的博文中详细解释了这一点。

答案 1 :(得分:2)

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

答案 2 :(得分:0)

使用像MongoLab这样的云服务之一..取决于您对便宜的定义,但是..

答案 3 :(得分:0)

关于使用运算符而不是MapReduce的答案具有优点,并且可能对您获得实时响应的努力更有益。在mongodb上映射Reduce不适合产生实时响应。

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

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

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

答案 4 :(得分:0)

不同数据项之间的联系对他们来说最有价值(他们让公众进行数据分类以使其有价值),因此对您来说也是最危险的http://indresult.com