2

我有一个要分片的 mongodb 集合。此集合包含来自用户的消息,并且该集合中的文档具有以下属性

{
     _id : ObjectId,
     conversationId: ObjectId,
     created: DateTime         
}

所有查询都将通过created使用convertId属性和sorter 完成。

  • _id分片显然不起作用,因为我需要通过conversationId查询(加上_id是ObjectId类型,它不能很好地扩展到许多插入)

  • 就查询隔离而言,通过conversationId 进行分片将是一个合乎逻辑的选择,但我担心它不会很好地扩展许多插入(即使我在 conversationId 上使用散列分片键,或者如果我从ObjectId更改属性的类型到其他一些不是增量的类型(如 GUID),因为某些对话可能比其他对话更活跃(即:添加了更多消息)

根据我在 mongo 文档中看到的内容,分片键是索引字段或索引复合字段,存在于集合中的每个文档中

这是否意味着我可以在复合索引上创建分片键?

底线是:

  • 从_id属性创建散列分片键将提供良好的数据分布

  • 在conversationId上创建一个分片键将提供良好的查询隔离

因此,如果可以做到的话,将这两件事结合起来会很棒。

有任何想法吗?

谢谢

4

1 回答 1

4

对于您的情况,这两个字段都不是分片的好选择。例如,如果您对conversationId 进行分片,它将导致热点,即您的大部分插入将发生在最后一个分片上,因为conversationId 会随着时间的推移单调增加。其他两个领域也有同样的问题。

此外,conversationId 不会提供高度隔离,因为随着时间的推移,conversionId 会单调增加。(因为较旧的对话会比旧对话更频繁地更新)

在您的情况下,conversationId 上的“散列分片键”(2.4 版以上)将是明智的选择,因为人们会想象可能有大量的对话并行进行。

有关创建散列分片键的详细信息,请参阅以下链接:[ http://docs.mongodb.org/manual/tutorial/shard-collection-with-a-hashed-shard-key/ ]

于 2013-09-05T13:43:25.917 回答