【问题标题】:Mongodb scalable colllectionMongodb 可伸缩集合
【发布时间】:2012-10-11 17:48:50
【问题描述】:

创建可扩展且具有最佳读取性能的 MongDB 集合的最佳方法是什么?以下是假设

  • 一个用户每天有 100 个条目。条目对用户是私有的。
  • 我们可能有 200,000 个用户。因此,每天几乎有 200 * 200,000 = 2000 万个条目。
  • 用户喜欢在插入条目后立即查看条目。
  • 用户喜欢搜索自己的条目,即使数据是 3 个月大。 3个月内,20M* 90 = 1.8 亿个条目。
  • 没有更新。仅插入和删除。

我们心中的选择。

  • 基于用户名的分片。 A .. D 在一个分片中等。但仍然很难扩展。
  • 为每个用户创建一个集合。我们知道这是一种激进的方法,但为什么不呢。我们不会对用户数据进行聚合。 MongoDB 中的集合数量有任何限制

任何建议将不胜感激。 谢谢。

【问题讨论】:

    标签: mongodb collections scalability


    【解决方案1】:

    不幸的是,由于limits 可以拥有的命名空间数量(24,000),每个用户一个集合将无法工作。

    我认为有几个不错的方向。您肯定会想要使用均匀分布的分片键 - 用户名会很好。您对其可扩展性有何担忧?

    您可能需要查看 TTL(生存时间)集合以及 Read preference 以让您的应用程序从辅助节点中读取。这可以通过分配工作负载来加快查询时间。

    【讨论】:

      【解决方案2】:

      在 MongoDB 世界中,没有一种最好的模式设计。在 MongoDB 中,模式设计取决于应用程序将如何访问数据。

      为了设计一个好的 MongoDB 架构,您需要回答以下关键问题:

      • 您有多少数据?
      • 您最常见的操作是什么?您主要是插入新数据、更新现有数据还是进行查询?
      • 您最常见的查询是什么?
      • 您最常见的更新是什么?
      • 您预计每秒有多少 I/O 操作?

      在 MongoDB 中,您有多种选择:可以嵌入数据,可以创建链接关系,可以复制和非规范化数据,或者可以使用混合方法。

      @Shelman 已经提到“阅读偏好”,就利用辅助节点而言,这是值得研究的。

      就横向扩展而言,分片似乎更适合您。关于分片的MongoDB Manual 相当广泛,涵盖了架构、基础知识、部署、管理和内部(如果你特别热衷的话)。我强烈推荐阅读它。但是,正如@Shelman 所说,您需要明智地选择分片键。 StackOverflow 和 MongoDB Google User Group 上广泛讨论了这个主题。

      避免使用顺序分片键的原因之一是它会在插入时创建热点:在任何给定时间,单个分片将承担所有插入负载。您可能想要选择复合分片键。 Google Group 上有一些很好的讨论:

      如果您选择类似 { username : 1 , timestamp : 1 } 的内容,那么如果需要,用户的数据将被分成许多块并分布在服务器上。

      这是关于选择分片键的文档的exact link。

      ==============================

      这里有一些关于 MongoDB 模式设计的一般参考资料。

      MongoDB 演示文稿:

      这是一本关于 MongoDB 模式设计的书,我认为您会发现它很有用:

      以下是一些示例架构设计:

      ==============================

      以下是在 MongoDB 架构设计中使用“分桶”方法的一些示例:

      ==============================

      最后是 MongoNYC 最近的一些分片演示:

      【讨论】:

      • 感谢您的详细回复。我将通过attcahed链接。再次感谢。
      猜你喜欢
      • 2020-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-22
      相关资源
      最近更新 更多