On this page
updateZoneKeyRange
在本页面
Definition
updateZoneKeyRange
- 3.4 版的新功能。
updateZoneKeyRangeManagement 命令可以创建或删除一系列分片键值和zone之间的关联。
要运行updateZoneKeyRange
,请使用db.runCommand( { <command> })方法。
您必须在 Management 数据库上运行addShardToZone。
updateZoneKeyRange命令具有以下语法:
{
updateZoneKeyRange: <string>,
min: <document>,
max: <document>
zone: <string> | <null>
}
该命令包含以下字段:
Parameter | Type | Description |
---|---|---|
updateZoneKeyRange |
string | 与范围关联的集合的名称空间。 |
必须将收集分片,命令才能成功执行。
| min
| document | shard key值范围的下限。
以<fieldname> : <value>
的形式指定分片键的每个字段。该值必须与分片键具有相同的 BSON 类型。
| max
| document | shard key个值的范围的上限。
以<fieldname> : <value>
的形式指定分片键的每个字段。该值必须与分片键具有相同的 BSON 类型。
| zone
| string |与由min
和max
界定的范围相关联的区域的名称。
如果该值与现有区域不匹配,则命令失败。
指定null
以删除下限为min
且上限为max
的范围与updateZoneKeyRange
集合之间的关联。 min
和max
的值必须与目标范围完全匹配。
如果没有区域范围与传递给updateZoneKeyRange的最小和最大范围匹配,则不会删除任何内容。
连接到mongos实例时仅发出updateZoneKeyRange。
mongo shell 提供了两种帮助程序方法:
sh.updateZoneKeyRange()用于将一定范围的分片键值添加到区域。
sh.removeRangeFromZone()用于从区域中删除一系列分片键值。
Behavior
您无法创建范围上限和下限与分片集合的现有范围重叠的分片键值范围。例如,给定现有范围1
到10
,则不能创建5
到20
的新范围,因为新范围将与现有范围重叠。
一个区域可以具有与其关联的多个数据范围,但是一个范围最多可以与一个区域关联。
删除范围和区域之间的关联时,updateZoneKeyRange不会删除该区域。使用removeShardFromZone命令删除区域和碎片之间的关联。
有关分片群集中区域的更多信息,请参见zone手册页。
Balancer
成功运行updateZoneKeyRange后,下一轮平衡器可能会迁移块。
将范围添加到区域后,必须先运行balancer,才能将区域覆盖的范围内的任何块迁移到该区域内的碎片。在平衡完成之前,给定分片群集的已配置区域,某些块可能驻留在错误的分片上。
删除范围和区域之间的关联会删除约束,使该区域内的碎片上的范围保持的块数保持不变。在下一轮平衡器中,平衡器可以迁移该区域先前覆盖的块。
有关迁移如何在分片群集中工作的更多信息,请参见分片集群平衡器的文档。
Bounds
区域范围始终包括下边界,不包括上边界。
Dropped Collections
如果您使用updateZoneKeyRange添加与分片集合关联的区域范围,然后在以后删除该集合或其数据库,则 MongoDB 不会删除该范围关联。如果以后创建具有相同名称的新集合,则旧范围关联将应用于新集合。
Security
对于以authentication运行的分片群集,您必须通过以下任一方式进行身份验证:
or, alternatively,
- 特权包括cluster资源上的enableSharding的用户(从版本 3.6.16 开始可用)。
内置clusterAdmin或clusterManager角色具有发布updateZoneKeyRange的适当权限。有关更多信息,请参见基于角色的访问控制的文档页面。
Example
给定一个具有{ 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
}
)
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不会删除任何内容。
复合分片键
给定分片集合exampledb.collection
和分片密钥{ a : 1, b : 1 }
,以下操作将创建一个范围,该范围覆盖{ 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"
}
)