Docs 菜单
Docs 主页
/
MongoDB Manual
/ / /

updateZoneKeyRange

在此页面上

  • 定义
  • 兼容性
  • 语法
  • 命令字段
  • 行为
  • 安全性
  • 例子
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>
}
)

该命令接受以下字段:

Parameter
类型
说明
updateZoneKeyRange
字符串

与范围关联的collection的命名空间。

必须对collection进行分片才能使命令成功。

min
文档

片键值范围的下限(含)。

<fieldname> : <value>的形式指定分片键的每个字段。 该值必须与分片键具有相同的 BSON 类型。

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

max
文档

片键值范围的独占上限。

<fieldname> : <value>的形式指定分片键的每个字段。 该值必须与分片键具有相同的 BSON 类型。

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

zone
字符串

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

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

null指定 可删除下限为min 且上限为max updateZoneKeyRange的范围与collection之间的关联。minmax的值必须与目标范围完全匹配。

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

仅在连接到 实例时发出updateZoneKeyRange mongos

mongosh 提供了两种辅助方法:

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

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

删除范围与区域之间的关联时, updateZoneKeyRange不会删除区域。 使用removeShardFromZone命令删除区域和分片之间的关联。

有关分片集群中区域的更多信息,请参阅区域手册页面。

如果您考虑对空集合或不存在的集合执行 区域分片 ,请在对集合分片 之前updateZoneKeyRange 使用 创建区域和区域范围( 自 起4.0.2 )。从版本4开始。 0 。 3 、 在空集合或不存在的集合上创建区域和区域范围允许 MongoDB 在对集合进行分片时优化初始数据段创建和分配过程。 与在分片后创建区域相比,这种优化的流程支持更快地设置分区分片,并且负载均衡器开销更少。 负载均衡器在优化初始数据段创建和分配后执行所有数据段管理。

有关为初始数据块分布定义区域和区域范围的示例,请参阅为空的collection或非现有的collection预定义区域和区域范围。

MongoDB 支持对复合哈希索引上的集合进行分片。 在复合哈希分片键上对空集合或不存在的集合进行分片时,MongoDB 可以执行优化的初始数据段创建和分配。

如果哈希字段是分片键的前缀(即分片键中的第一个字段),则必须满足以下所有条件,MongoDB 才能执行初始数据段创建和分发:

如果哈希字段不是分片分片键的前缀(即分片分片键具有一个或多个非哈希前导字段),则必须满足以下所有条件, MongoDB才能执行初始数据块创建和分配:

  • 该集合为不同前缀字段值的每个组合(即 哈希字段之前的所有字段)。

  • 对于每个区域范围的下限,请为哈希字段和所有后续字段指定MinKey

  • 对于每个区域范围,至少有一个上限前缀字段必须与其对应的下限前缀字段不同。

  • sh.shardCollection()指定presplitHashedZones: true选项。

有关在复合哈希分片键上为初始数据块分布定义区域和区域范围的更完整示例,请参阅为空或不存在的collection预定义区域和区域范围。

成功运行updateZoneKeyRange后,在下一个负载均衡器回合期间可能会发生数据段迁移。

将范围添加到区域后,负载均衡器必须首先运行,以便将范围被区域覆盖的任何数据段迁移到该区域内的分片。 在均衡完成之前,考虑到为分片集群配置的区域,某些数据块可能驻留在错误的分片上。

删除范围和区域之间的关联会删除在该区域内的分片上保持范围所覆盖的数据段的约束。 在负载均衡器的下一个回合中,负载均衡器可能会迁移该区域之前覆盖的数据块。

有关迁移如何在分片集群中工作的更多信息,请参阅分片集群负载均衡器的文档。

区域范围始终包括下边界,但不包括上边界。

删除集合将删除其关联的区域/标记范围。

在早期版本中,MongoDB 不会删除已删除集合的标签关联,如果您稍后创建同名的新集合,则旧标签关联将应用于新集合。

对于使用身份验证运行的分片集群,您必须通过以下任一项身份验证:

  • 其权限包括对config数据库中的各种集合执行指定操作的用户:

    或者,

  • 权限包括对enableSharding 集群 资源的 的用户。

clusterAdminclusterManager内置角色具有发出updateZoneKeyRange的适当权限。 有关更多信息,请参阅基于角色的访问控制的文档页面。

给定分片键为{ a : 1 }的分片集合exampledb.collection ,以下操作在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"
}
)

后退

unshardCollection