更新区域键范围
定义
updateZoneKeyRange
这
updateZoneKeyRange
管理命令可以创建或删除一系列分片键值与区域之间的关联.您可以在非分片集合或不存在的集合上运行
updateZoneKeyRange
数据库命令及其辅助函数sh.updateZoneKeyRange()
和sh.addTagRange()
。提示
在
mongosh
中,此命令还可以通过sh.updateZoneKeyRange()
辅助方法运行。.辅助方法对
mongosh
用户来说很方便,但它们可能不会返回与数据库命令相同级别的信息。在不需要便利性或需要额外的返回字段的情况下,请使用数据库命令。要运行
updateZoneKeyRange
,请使用db.runCommand( { <command> } )
方法。必须在管理员数据库上运行
addShardToZone
。
兼容性
此命令在以下环境中部署的部署中可用
MongoDB Atlas:MongoDB在云中的托管服务的完全管理服务
重要
此命令不支持在无服务器实例上。有关更多信息,请参阅不受支持的命令。
MongoDB Enterprise:基于订阅的自托管MongoDB版本
MongoDB Community:MongoDB的开源版本,免费使用,自托管
语法
该命令的语法如下:
db.adminCommand( { updateZoneKeyRange: <string>, min: <document>, max: <document>, zone: <string> | <null> } )
命令字段
命令包含以下字段:
参数 | 类型 | 描述 |
---|---|---|
更新区域键范围 | string | 与范围关联的集合的命名空间。 该集合必须分片,以便命令成功。 |
min | document | shard key 值范围的包含下限。 以 要使用哈希分片, |
max | document | shard key 值范围的排他上限。 以 要使用哈希分片, |
区域之间的关联 | string | 与 如果值不匹配现有区域,则命令失败。 指定 |
行为
如果没有区域范围与 updateZoneKeyRange
传入的最小和最大边界匹配,则不会删除任何内容。
只有在连接到 mongos
实例时才发布 updateZoneKeyRange
。
mongosh
提供了两个辅助方法
sh.updateZoneKeyRange()
用于向区域添加一系列分片键值的范围。sh.removeRangeFromZone()
用于从区域中删除一系列分片键值的范围。
您不能创建与分片集合现有范围的上下边界重叠的分片键值范围。例如,给定一个现有的范围从 1
到 10
,您不能创建一个新的范围从 5
到 20
,因为新的范围将与现有范围重叠。
一个区域可以与多个数据范围相关联,但一个范围最多只能与一个区域相关联。
当删除范围与区域的关联时,updateZoneKeyRange
不会删除区域。请使用 removeShardFromZone
命令来删除区域与分片之间的关联。
有关分片集群中区域的信息,请参阅 区域 手册页。
空或不存在集合的初始数据块分配
如果您正在考虑对一个空或不存在的集合执行 区域分片,请使用 updateZoneKeyRange
在分片集合之前创建区域和区域范围(自 4.0.2 版本起)。从 4.0.3 版本开始,在空或不存在的集合上创建区域和区域范围允许 MongoDB 优化分片集合时的初始数据块创建和分配过程。此优化过程支持使用比分片后创建区域更少的均衡器开销来快速设置区域分片。均衡器在优化初始数据块创建和分配之后执行所有数据块管理。
有关定义初始数据块分配区域和区域范围的示例,请参阅 为空或不存在的集合预先定义区域和区域范围。
复合哈希分片键的初始分片分配
MongoDB支持在复合哈希索引上分片集合。当MongoDB在复合哈希分片键上对空集合或不存在集合进行分片时,可以执行优化的初始分片创建和分配。
如果哈希字段是分片键的前缀(即分片键的第一个字段),则MongoDB要执行初始分片创建和分配,以下所有条件都必须为真
该集合有一个单区域范围,所有下界字段都使用
MinKey
,所有上界字段都使用MaxKey
。sh.shardCollection()
指定了presplitHashedZones: true
选项。
如果哈希字段不是分片键的前缀(即分片键有一个或多个非哈希的前导字段),则MongoDB要执行初始分片创建和分配,以下所有条件都必须为真
该集合对于每个不同的前缀字段值组合有一个区域范围(即哈希字段之前的所有字段)。
对于每个区域范围的下界,指定哈希字段和所有后续字段的
MinKey
。对于每个区域范围,至少有一个上界前缀字段必须与其下界对应字段不同。
sh.shardCollection()
指定了presplitHashedZones: true
选项。
有关在复合哈希分片键上定义区域和区域范围以进行初始分片分配的更完整示例,请参阅为空或不存在集合预先定义区域和区域范围。
平衡器
在成功运行updateZoneKeyRange
后,在下一个平衡器轮次中可能会有分片迁移。
在将范围添加到区域后,必须首先运行均衡器,以便将任何其范围被区域覆盖的数据块迁移到该区域内的分片。在均衡完成之前,一些数据块可能会根据配置的分区集群分区位于错误的分片上。
移除范围和区域之间的关联将移除保持被范围覆盖的数据块位于该区域内部分片上的约束。在下一次均衡轮次中,均衡器可能会迁移之前被区域覆盖的数据块。
有关分片集群中迁移工作方式的更多信息,请参阅分片集群均衡器的文档。
边界
区域范围始终包含下边界,但不包含上边界。
已删除的集合
删除集合将删除其关联的区域/标签范围。
在早期版本中,MongoDB不会删除已删除集合的标签关联,如果您稍后创建具有相同名称的新集合,则旧标签关联将应用于新集合。
安全
对于运行着身份验证的分片集群,您必须以以下任一用户身份进行身份验证:
具有在
config
数据库中指定操作权限的用户在
config.shards
集合上执行find
在
config.tags
集合上执行find
、update
和remove
或者,也可以是
具有在集群资源上执行
enableSharding
权限的用户。
内置的clusterAdmin
或clusterManager
角色具有发布updateZoneKeyRange
命令的适当权限。有关更多信息,请参阅基于角色的访问控制文档页面。
示例
假设有一个分片集合exampledb.collection
,其分片键为{ a : 1 }
,以下操作在alpha
区域创建了一个下限为1
,上限为10
的范围。
admin = db.getSiblingDB("admin") admin.runCommand( { updateZoneKeyRange : "exampledb.collection", min : { a : 1 }, max : { a : 10 }, zone : "alpha" } )
以下操作通过将null
传递给zone
字段来删除先前创建的范围。
admin = db.getSiblingDB("admin") admin.runCommand( { updateZoneKeyRange : "exampledb.collection", min : { a : 1 }, max : { a : 10 }, zone : null } )
min
和max
必须与目标范围的确切边界匹配。以下操作尝试删除先前创建的范围,但指定{ a : 0 }
作为min
边界。
admin = db.getSiblingDB("admin") admin.runCommand( { updateZoneKeyRange : "exampledb.collection", min : { a : 0 }, max : { a : 10 }, zone : null } )
虽然 { a : 0 }
和 { a : 10 }
的范围涵盖了现有范围,但它们并不完全匹配,因此 updateZoneKeyRange
并没有删除任何内容。
复合分片键
给定一个具有分片键 { a : 1, b : 1 }
的分片集合 exampledb.collection
,以下操作创建了一个覆盖 { a: 1, b : 1 }
的下界和 { a : 10, b : 10}
的上界的范围,并将其与 alpha
区域相关联
admin = db.getSiblingDB("admin") admin.runCommand( { updateZoneKeyRange : "exampledb.collection", min : { a : 1, b : 1 }, max : { a : 10, b : 10 }, zone : "alpha" } )