【问题标题】:Uniqueness of _id within a shard分片内 _id 的唯一性
【发布时间】: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 字段,因为这确实是我正在使用的密钥,但从数据库中解决问题似乎是一种奇怪的方式建筑的观点。

【问题讨论】:

    标签: mongodb sharding


    【解决方案1】:

    _id 必须是唯一的,无论集合是否分片。分片键不需要是唯一的。它用于将集合拆分为块,这些块可以拆分到组成数据库的分片上。分片键需要提供足够的粒度来将集合中的文档拆分成块。将分片键链接到您查询数据的方式,并使用与您查询的字段相关的分片键显然是一个好主意。这样,您运行的查询将很容易定向到相关分片以满足查询。如果分片键的选择性不够,则查询将需要转到多个分片以找到正确的文档。您可以在 _id + shard-key 上创建复合索引,并根据需要使其唯一。

    我意识到这并不能完全回答这个问题。 tbh 我很难理解你在问什么。如果您可以发布一个您正在存储的文档和您正在运行的查询的示例,也许会有所帮助。

    【讨论】:

    • 显然,_id 在技术上不需要是唯一的,只需要在分片内。 mongodb 似乎处理它的方式是强制 _id 是全局唯一的,否则前面会有麻烦。然而,它并没有强制执行这个唯一性约束,并且一个简单的方法(以及其他数据库所做的)是将密钥定义为 shard-key + id,但似乎 mongodb 没有这样做(这是我的问题,真的是这样吗?他们把它留给应用程序来执行?)。我不是在问索引,如果 _id 必须是全局唯一的,那么 shard-key + _id 上的唯一索引是多余的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-23
    • 2018-07-03
    • 2021-12-05
    相关资源
    最近更新 更多