参考 > 参考 > mongo Shell方法 > 分片方法 > sh.updateZoneKeyRange()
sh.updateZoneKeyRange(名称空间,最小,最大,区域)¶3.4版的新功能。
将一系列分片键值与zone关联。
在MongoDB中4.0.2开始,您可以运行
updateZoneKeyRange数据库命令及其助手
sh.updateZoneKeyRange()和sh.addTagRange()上unsharded集合或不存在的集合。
sh.updateZoneKeyRange() 接受以下参数:
| 参数 | 类型 | 描述 |
|---|---|---|
namespace |
串 | 分片集合的名称空间与关联 必须将收集分片,操作才能成功。 |
minimum |
文献 | 分片键值范围的下限值。 以形式指定分片键的每个字段。该值必须与分片键具有相同的BSON类型。 |
maximum |
文献 | 分片键值范围的排他上限。 以形式指定分片键的每个字段。该值必须与分片键具有相同的BSON类型。 |
zone |
串 | 与以minimum和界定的分片键值范围相关联的区域名称maximum。 |
仅sh.updateZoneKeyRange()在连接到mongos实例时
发出。
您无法创建范围上限和下限与分片集合的现有范围重叠的分片键值范围。例如,给定现有的1to 范围10,您不能创建5
to 20的新范围,因为新范围将与现有范围重叠。
一个区域可以具有与其关联的多个数据范围,但是一个范围最多可以与一个区域关联。
有关分片群集中区域的更多信息,请参见区域手册页。
在MongoDB中4.0.2开始,您可以运行
updateZoneKeyRange数据库命令及其助手
sh.updateZoneKeyRange()和sh.addTagRange()上unsharded集合或不存在的集合。
小费
在版本4.0.3中更改:通过在分片一个空的或不存在的集合之前定义区域和区域范围,分片收集操作将为定义的区域范围以及所有其他覆盖整个区域范围的块创建块。分片键值,并根据区域范围执行初始块分配。块的这种初始创建和分配允许更快地设置分区分片。在初始分配之后,平衡器将管理后续的块分配。
有关示例,请参见为空集合或不存在的集合预定义区域和区域范围。
将范围与区域关联之后,平衡器必须首先运行,以将区域覆盖的范围内的任何块迁移到该区域内部的碎片。给定分片集群的已配置区域,在平衡完成之前,某些块可能驻留在错误的分片上。有关 更多信息,请参见Balancer。
有关迁移如何在分片群集中工作的更多信息,请参见分片群集平衡器手册页。
区域范围始终包括下边界,不包括上边界。
从MongoDB 4.0.2开始,删除集合将删除其关联的区域/标签范围。
在早期版本中,MongoDB不会删除已删除集合的标签关联,并且如果您以后创建具有相同名称的新集合,则旧标签关联将应用于新集合。
对于以身份验证运行的分片群集,您必须以以下任一身份进行身份验证:
具有特权的用户包括对config数据库中各种集合的指定操作的用户:
或者,
特权包含enableSharding在群集资源上的
用户(从版本4.2.2、4.0.14、3.6.16开始可用)。
在clusterAdmin或clusterManager内置角色有发放相应的权限sh.updateZoneKeyRange()。有关
更多信息,请参见基于角色的访问控制的文档页面。
给定一个分片exampledb.collection键为的分片集合,以下操作
将在区域上创建一个范围为下限和上限为的范围:{ a
: 1 }110alpha
以下操作通过传递null到该zone字段来删除先前创建的范围
。
在min和max必须在目标范围内的完全范围一致。以下操作尝试删除先前创建的范围,但将其指定为界限:{ a : 0 }min
虽然的范围为,但包含现有范围,但这不是完全匹配,因此
不会删除任何内容。{ a : 0 }{ a : 10 }updateZoneKeyRange
给定一个分片exampledb.collection键为的分片集合,以下操作将创建一个范围,该范围覆盖of的下限和上限,并将其与区域关联:{ a
: 1, b : 1 }{ a: 1, b : 1 }{ a : 10, b : 10}alpha
如果只想创建一个值b范围,则a在创建范围时必须指定整个范围。例如,以下操作在上创建两个范围b并将它们关联到
beta区域。
注意
先前定义的范围与本示例中定义的范围冲突。发出sh.removeRangeFromZone()删除现有冲突范围的操作。
MinKey总是比所有其他可能的值都低,而MaxKey总是比其他所有可能的值都高。将这些特殊值用于范围的上下限将捕获的整个可能值空间a。
在MongoDB中4.0.2开始,您可以运行
updateZoneKeyRange数据库命令及其助手
sh.updateZoneKeyRange()和sh.addTagRange()上unsharded集合或不存在的集合。
通过在分片空的或不存在的集合之前定义区域和区域范围,分片收集操作将为已定义的区域范围以及任何其他分片创建分片,以覆盖分片键值的整个范围并执行初始操作基于区域范围的块分布。块的这种初始创建和分配允许更快地设置分区分片。在初始分配之后,平衡器将管理后续的块分配。
首先,使用sh.addShardToZone()创建区域:
然后,使用sh.updateZoneKeyRange()创建范围:
如果尚未为启用分片exampledb,请使用
sh.enableSharding()来为数据库启用分片:
最后,使用sh.shardCollection()分片集合contacts:
注意
如果该集合不存在,则分片操作将创建该集合。
要查看创建的块和分布,请运行以下
sh.status()操作:
该方法返回:
对于该集合,分片操作在shardA和shardB中创建了5个块(两个块对应于区域范围,另外三个块覆盖所有其他值)。