On this page
sh.updateZoneKeyRange()
在本页面
Definition
sh.
updateZoneKeyRange
(* namespace , minimum , maximum , zone *)- 3.4 版的新功能。
将一系列分片键值与zone关联。 sh.updateZoneKeyRange()接受以下参数:
Parameter | Type | Description |
---|---|---|
namespace |
string | 分片集合的namespace与zone 关联。 |
必须将收集分片以使操作成功。
| minimum
| document | shard key值范围的下限。
以<fieldname> : <value>
的形式指定分片键的每个字段。该值必须与分片键具有相同的 BSON 类型。
| maximum
| document | shard key个值的范围的上限。
以<fieldname> : <value>
的形式指定分片键的每个字段。该值必须与分片键具有相同的 BSON 类型。
| zone
| string |与以minimum
和maximum
界定的分片键值范围相关联的区域的名称。
连接到mongos实例时仅发出sh.updateZoneKeyRange()。
Behavior
您无法创建范围上限和下限与分片集合的现有范围重叠的分片键值范围。例如,给定现有范围1
到10
,则不能创建5
到20
的新范围,因为新范围将与现有范围重叠。
一个区域可以具有与其关联的多个数据范围,但是一个范围最多可以与一个区域关联。
有关分片群集中区域的更多信息,请参见zone手册页。
Balancer
将范围与区域关联后,必须先运行balancer,才能将区域覆盖的范围内的任何块迁移到该区域内的碎片。在平衡完成之前,给定分片群集的已配置区域,某些块可能驻留在错误的分片上。有关更多信息,请参见Balancer。
有关迁移如何在分片群集中工作的更多信息,请参见分片集群平衡器手册页。
Bounds
区域范围始终包括下边界,不包括上边界。
Dropped Collections
如果您使用sh.updateZoneKeyRange()将区域范围添加到集合中,然后再删除该集合或其数据库,则 MongoDB 不会删除区域关联。如果以后创建具有相同名称的新集合,则旧区域关联将应用于新集合。
Security
对于以authentication运行的分片群集,您必须通过以下任一方式进行身份验证:
or, alternatively,
- 特权包括cluster资源上的enableSharding的用户(从版本 3.6.16 开始可用)。
内置clusterAdmin或clusterManager角色具有发布sh.updateZoneKeyRange()的适当权限。有关更多信息,请参见基于角色的访问控制的文档页面。
Example
给定一个具有{ a : 1 }
的分片键的分片集合exampledb.collection
,以下操作将在alpha
区域上创建范围为1
下限和10
上限的范围:
sh.updateZoneKeyRange(
"exampledb.collection",
{ a : 1 },
{ a : 10 },
"alpha"
)
以下操作通过将null
传递到zone
字段来删除先前创建的范围。
sh.updateZoneKeyRange(
"exampledb.collection",
{ a : 1 },
{ a : 10 },
null
)
min
和max
必须与目标范围的边界完全匹配。以下操作尝试删除以前创建的范围,但将{ a : 0 }
指定为min
绑定:
sh.updateZoneKeyRange(
"exampledb.collection",
{ a : 0 },
{ a : 10 },
null
)
尽管{ a : 0 }
和{ a : 10 }
的范围涵盖了现有范围,但它并不完全匹配,因此updateZoneKeyRange不会删除任何内容。
复合分片键
给定分片集合exampledb.collection
和分片密钥{ a : 1, b : 1 }
,以下操作将创建一个范围,该范围覆盖{ a: 1, b : 1 }
的下限和{ a : 10, b : 10}
的上限,并将其与alpha
区域相关联:
sh.updateZoneKeyRange(
"exampledb.collection",
{ a : 1, b : 1 },
{ a : 10, b : 10 },
"alpha"
)
如果只想根据b
的值创建范围,则在创建范围时必须指定a
的整个范围。例如,以下操作在b
上创建两个范围,并将它们与beta
区域关联。
Note
先前定义的范围与本示例中定义的范围冲突。发出sh.removeRangeFromZone()操作以删除现有的冲突范围。
sh.updateZoneKeyRange(
"exampledb.collection",
{ a : MinKey, b : 1 },
{ a : MaxKey, b: 10 },
"alpha"
);
sh.updateZoneKeyRange(
"exampledb.collection",
{ a : MinKey, b : 10 },
{ a : MaxKey, b: 20 },
"beta"
);
MinKey
总是比其他所有可能的值都低,而MaxKey
总是比其他所有可能的值都低。将这些特殊值用于范围的上下限将捕获a
的整个可能值空间。
See also