【发布时间】:2016-08-22 08:02:14
【问题描述】:
我正在研究使用 mongodb 进行分片,而且大多数情况下都是直截了当的。我有一些在其他数据库中进行分片的经验,所以我不是在问这个概念本身。我对一件事感到困惑,并且文档中似乎没有任何关于此的内容,所以就这样吧。
_id 在分片中是否必须是唯一的,无论分片键如何?
小规模(单个分片)测试似乎证实了这种情况。然而,这似乎是一种不太出色的分片方法,这让我感到困惑。对我来说,要求 shard-key + _id 是唯一的(即使用复合键)会更有意义,否则根据您的分片键最终被路由到的位置,您将出现不一致的行为。我的数据模型使用确定性键,而分片键是其中固有的一部分。所以我想归结为,我在小规模测试中做错了什么吗?我是否需要存储分片键两次,一次作为分片键字段,一次作为_id 的一部分?还是有一些特殊情况,我可以使用shard-key 和_id 以某种方式声明复合键?
更新
为了完整起见,这是我正在测试的简单案例,插入以下两个文档:
{"_id": 1, "shardkey": 1}
{"_id": 1, "shardkey": 2}
第一个显然通过,第二个失败。如果我有两个分片,并且分片键会被路由到不同的分片,我认为两者都会成功。
显然,我可以将 shard-key 和 id 组合起来为 mongodb 创建 _id 字段,因为这确实是我正在使用的密钥,但从数据库中解决问题似乎是一种奇怪的方式建筑的观点。
【问题讨论】: