文档菜单
文档首页
/
MongoDB 手册
/ / /

更新区域键范围

在本页

  • 定义
  • 兼容性
  • 语法
  • 命令字段
  • 行为
  • 安全
  • 示例
updateZoneKeyRange

updateZoneKeyRange 管理命令可以创建或删除一系列分片键值与区域之间的关联.

您可以在非分片集合或不存在的集合上运行 updateZoneKeyRange 数据库命令及其辅助函数 sh.updateZoneKeyRange()sh.addTagRange()

提示

mongosh 中,此命令还可以通过 sh.updateZoneKeyRange() 辅助方法运行。.

辅助方法对 mongosh 用户来说很方便,但它们可能不会返回与数据库命令相同级别的信息。在不需要便利性或需要额外的返回字段的情况下,请使用数据库命令。

要运行 updateZoneKeyRange,请使用 db.runCommand( { <command> } ) 方法。

必须在管理员数据库上运行 addShardToZone

此命令在以下环境中部署的部署中可用

  • MongoDB Atlas:MongoDB在云中的托管服务的完全管理服务

重要

此命令不支持在无服务器实例上。有关更多信息,请参阅不受支持的命令。

该命令的语法如下:

db.adminCommand(
{
updateZoneKeyRange: <string>,
min: <document>,
max: <document>,
zone: <string> | <null>
}
)

命令包含以下字段:

参数
类型
描述
更新区域键范围
string

与范围关联的集合的命名空间。

该集合必须分片,以便命令成功。

min
document

shard key 值范围的包含下限。

<fieldname> : <value> 的形式指定 shard key 的每个字段。值必须是与 shard key 相同的 BSON 类型或类型。

要使用哈希分片,min 的字段值必须为 NumberLong 类型。

max
document

shard key 值范围的排他上限。

<fieldname> : <value> 的形式指定 shard key 的每个字段。值必须是与 shard key 相同的 BSON 类型或类型。

要使用哈希分片,max 的字段值必须为 NumberLong 类型。

区域之间的关联
string

minmax 界定的范围关联的区域名称。

如果值不匹配现有区域,则命令失败。

指定 null 以删除 min 的下限和 max 的上限与 updateZoneKeyRange 集合之间的关联。 minmax 的值必须与目标范围完全匹配。

如果没有区域范围与 updateZoneKeyRange 传入的最小和最大边界匹配,则不会删除任何内容。

只有在连接到 mongos 实例时才发布 updateZoneKeyRange

mongosh 提供了两个辅助方法

您不能创建与分片集合现有范围的上下边界重叠的分片键值范围。例如,给定一个现有的范围从 110,您不能创建一个新的范围从 520,因为新的范围将与现有范围重叠。

一个区域可以与多个数据范围相关联,但一个范围最多只能与一个区域相关联。

当删除范围与区域的关联时,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集合上执行findupdateremove

    或者,也可以是

  • 具有在集群资源上执行enableSharding权限的用户。

内置的clusterAdminclusterManager角色具有发布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
}
)

minmax必须与目标范围的确切边界匹配。以下操作尝试删除先前创建的范围,但指定{ 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"
}
)

返回

取消分片集合