【问题标题】:Easiest way to scale Mongo with limited resources?在资源有限的情况下扩展 Mongo 的最简单方法是什么?
【发布时间】: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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        使用像 MongoLab 这样的云服务之一.. 取决于您对廉价的定义..

        【讨论】:

          【解决方案4】:

          关于使用运算符而不是 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 需要最终确定从每个分片返回的结果集,因此您添加一个新的潜在的瓶颈取决于您的数据,并且您需要的不仅仅是一台额外的机器才能使其以可靠的方式工作。

          【讨论】:

            【解决方案5】:

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

            【讨论】:

              猜你喜欢
              • 2013-12-22
              • 2010-10-27
              • 1970-01-01
              • 2018-03-13
              • 1970-01-01
              • 1970-01-01
              • 2016-12-28
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多