In sharded clusters, you can create zones that represent a group of shards and associate one or more ranges of shard key values to that zone. MongoDB routes reads and writes that fall into a zone range only to those shards inside of the zone.在分片集群中,您可以创建表示一组分片的区域,并将一个或多个分片键值范围与该区域相关联。MongoDB只将属于某个区域范围的读写路由到该区域内的那些分片。
Tip
By defining the zones and the zone ranges before sharding an empty or a non-existing collection, the shard collection operation creates chunks for the defined zone ranges as well as any additional chunks to cover the entire range of the shard key values and performs an initial chunk distribution based on the zone ranges. This initial creation and distribution of chunks allows for faster setup of zoned sharding. After the initial distribution, the balancer manages the chunk distribution going forward.通过在对空的或不存在的集合进行分片之前定义区域和区域范围,分片集合操作为定义的区域范围创建块以及任何其他块,以覆盖分片键值的整个范围,并根据区域范围执行初始块分布。这种块的初始创建和分发允许更快地设置分区分片。在初始分发之后,平衡器管理接下来的块分发。
See Pre-Define Zones and Zone Ranges for an Empty or Non-Existing Collection for an example.有关示例,请参阅空集合或不存在集合的预定义分区和分区范围。
Add Shards to a Zone将分片添加到区域
Associate a Zone with a particular shard using the 当连接到sh.addShardToZone() method when connected to a mongos instance. mongos实例时,使用sh.addShardToZone()方法将Zone与特定分片相关联。A single shard may have multiple zones, and multiple shards may also have the same zone.一个分片可能有多个区域,多个分片也可能有相同的区域。
Example示例
The following example adds the zone 以下示例将NYC to two shards, and the zones SFO and NRT to a third shard:NYC区域添加到两个分片,将SFO和NRT区域添加到第三个分片:
sh.addShardToZone("shard0000", "NYC")
sh.addShardToZone("shard0001", "NYC")
sh.addShardToZone("shard0002", "SFO")
sh.addShardToZone("shard0002", "NRT")You may remove zone from a particular shard using the 当连接到sh.removeShardFromZone() method when connected to a mongos instance, as in the following example, which removes the NRT zone from a shard:mongos实例时,您可以使用sh.removeShardFromZone()方法从特定分片中删除区域,如下例所示,该方法从分片中移除NRT区域:
sh.removeShardFromZone("shard0002", "NRT")Create a Zone Range创建分区范围
To define the zone's range of shard keys, use the 要定义区域的分片键范围,请在连接到sh.updateZoneKeyRange() method when connected to a mongos instance. mongos实例时使用sh.updateZoneKeyRange()方法。Any given shard key range may only have one assigned zone. You cannot overlap defined ranges.任何给定的分片键范围只能有一个分配的区域。您不能重叠已定义的范围。
Example示例
Given a collection named 给定users in the records database, sharded by the zipcode field. The following operations assign:records数据库中名为users的集合,由zipcode(邮政编码)字段分片。分配以下操作:
two ranges of zip codes in Manhattan and Brooklyn the曼哈顿和布鲁克林的两个邮政编码范围NYCzoneone range of zip codes in San Francisco the旧金山的一个邮政编码范围SFOzoneSFO区域
sh.updateZoneKeyRange("records.users", { zipcode: "10001" }, { zipcode: "10281" }, "NYC")
sh.updateZoneKeyRange("records.users", { zipcode: "11201" }, { zipcode: "11240" }, "NYC")
sh.updateZoneKeyRange("records.users", { zipcode: "94102" }, { zipcode: "94135" }, "SFO")Note
Zone ranges are always inclusive of the lower boundary and exclusive of the upper boundary.区域范围始终包括下限,不包括上限。Dropping a collection deletes its associated zone/tag ranges.删除集合会删除其关联的区域/标记范围。
Remove a Zone Range删除区域范围
Use the shell helper method 使用shell辅助方法sh.removeRangeFromZone() to remove a range from a zone.sh.removeRangeFromZone()从区域中删除一个范围。
Example示例
The following example removes the 以下示例删除了曼哈顿内邮政编码范围的NYC zone assignment for the range of zip codes within Manhattan:NYC区域分配:
sh.removeRangeFromZone("records.user", {zipcode: "10001"}, {zipcode: "10281"})Note
Dropping a collection deletes its associated zone/tag ranges.删除集合会删除其关联的区域/标记范围。
View Existing Zones查看现有区域
Use 使用sh.status() to list the zones associated to each shard in the cluster. sh.status()列出与集群中每个分片关联的区域。You can also view a shards zones by querying the 您还可以通过查询shards collection in the config database.config数据库中的shards集合来查看分片区域。
The following example uses the 以下示例使用find() method to return all shards with the NYC zone.find()方法返回所有具有NYC区域的分片。
use config
db.shards.find({ tags: "NYC" })
You can find zone ranges for all namespaces in the 您可以在配置数据库的tags collection of the config database. tags集合中找到所有命名空间的区域范围。The output of sh.status() also displays all zone ranges.sh.status()的输出还显示了所有区域范围。
The following example uses the 以下示例使用find() method to return any range associated to the NYC zone.find()方法返回与NYC区域关联的任何范围。
use config
db.tags.find({ tag: "NYC" })