我有一个mongodb集合,我想要分片。此集合保存来自用户的消息,集合中的文档具有以下属性
{
_id : ObjectId,
conversationId: ObjectId,
created: DateTime
}
所有查询都将使用 converstionId 属性和创建的分拣机完成。
_id 分片显然不起作用,因为我需要通过 conversationId 进行查询(加上 _id 的类型为ObjectId,不会很好地扩展到许多插入物)
conversationId 的分片在查询隔离方面是一个合理的选择,但我担心它不会很好地扩展很多插入(甚至如果我在conversationId上使用散列分片键,或者我将属性类型从 ObjectId 更改为其他类型的非增量(如GUID),因为某些会话可能会比其他人更活跃(即:添加更多消息)
从我在mongo文档中看到的分片键是索引字段或集合中每个文档中存在的索引复合字段。
这是否意味着我可以在复合索引上创建分片键?
底线是:
从 _id 属性创建散列分片键可以提供良好的数据分发
在 conversationId 上创建分片键会提供良好的查询隔离
如果可以的话,这两件事的组合会很棒。
有什么想法吗?
由于
答案 0 :(得分:3)
对于您的情况,这两个字段都不适合分片。例如,如果你在conversationId上进行分片,它将导致热点,即大多数插入都会发生在最后一个分片中,因为conversationId会随着时间的推移单调增加。其他两个领域也存在同样的问题。
此外,conversationId不会提供高度隔离,因为conversationId会随着时间的推移单调增加。 (因为较新的对话会比非旧对话更频繁地更新)
在你的情况下,对话sessionId的“哈希碎片密钥”(版本2.4以上)将是明智的选择,因为可以想象可以并行进行大量的对话。
有关创建散列分片键的详细信息,请参阅以下链接:[http://docs.mongodb.org/manual/tutorial/shard-collection-with-a-hashed-shard-key/]