2

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

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

我们心中的选择。

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

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

4

2 回答 2

3

不幸的是,由于您可以拥有的命名空间数量(24,000) 的限制,每个用户只能收集一个集合。

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

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

于 2012-10-11T18:23:52.623 回答
1

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

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

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

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

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

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

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

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

这是关于选择分片键的文档的确切链接。

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

以下是有关 MongoDB 模式设计的一些很好的通用参考资料。

MongoDB 演示文稿:

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

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

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

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

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

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

于 2012-10-17T21:14:59.980 回答