在我的版本4.2的切分集群中,在_id上对一个集合进行切分,其中_id只是一个默认的ObjectId。
我看到了多个文件,在不同的碎片的初选中都有相同的_id。
当我在查询过滤器中指定shard键时,我会得到正确的文档,但是没有它,mongos就会对所有的碎片进行查询,因此它会返回一个孤立的文档。
我想知道这是否是一个常见的问题,还是使用_id作为一个碎片密钥有什么问题?
发布于 2021-10-13 06:58:22
这是一些与你的问题有关的信息。
在我的版本4.2的切分集群中,在_id上对一个集合进行切分,其中_id只是一个默认的ObjectId。我看到了多个文件,在不同的碎片的初选中都有相同的_id。
这是可能的,但并不常见。请参阅本文中的以下内容:有可能复制吗?_碎片区的身份证?
如果您的_id值使用的是默认的ObjectID,则冲突的几率应该非常低。_id字段唯一地标识碎片上给定集合中的文档。如果文档在不同的碎片上具有相同的_id值,尝试将这些文档迁移到同一个碎片将导致重复的关键异常。非唯一的_id值也可能导致开发人员或工具的逻辑错误,假设_id是唯一的标识符。
当我在查询过滤器中指定shard键时,我会得到正确的文档,但是没有它,mongos就会对所有的碎片进行查询,因此它会返回一个孤立的文档。
是的,如果没有shard键作为查询筛选器的一部分,查询将导致广播(或分散收集)操作。而且,这种查询效率很低。切分键在数据的切分/分配中起着重要的作用。所选的shard键应该处理应用程序的重要查询。此外,也可能存在无法使用shard键的查询。
我想知道这是否是一个常见的问题,还是使用_id作为一个碎片密钥有什么问题?
通常,_id字段可以有效地用作碎片密钥。默认情况下,_id是MongoDB生成的ObjectId值。注意,_id也可以是应用程序生成的;也可以是任何类型的字段,但数组类型除外。
使用默认的ObjectId作为_id,不被认为是有效的。选择碎片键的主要考虑因素是高基数、频率和更改类型。“更改类型”指的是值的单调变化;这是不建议的。
值上单调增加或减少的切分键更有可能将插入分发到集群中的单个碎片。
单调增长的值类型的示例有日期、时间戳和ObjectId;ObjectId的值中嵌入了时间戳(参见ObjectId描述)。
关于选择碎片键的
有关选择碎片键时需要考虑的三个因素的详细说明可以在:选择一个碎片密钥上阅读。
如果您想使用默认的ObjectId作为切分键,文档中的这个注释是有用的:
如果您的数据模型需要对单调更改的键进行切分,请考虑使用散列切分。
https://dba.stackexchange.com/questions/301041
复制相似问题