管理分片区域
在分分片的集群中,您可以创建表示一群组片的区域,并将一个或多个分片分片键范围与该区域相关联。 MongoDB仅将属于某个区域范围的读取和写入路由到区域域内的那些分片。
提示
通过对空集合或不存在的集合进行分片之前定义区域和区域范围,分片集合操作会为定义的区域范围创建数据块以及任何其他数据块,以覆盖分片键值的整个范围,并执行基于区域范围的初始数据块分配。数据块的初始创建和分布可以更快地设置区域分片。在初始分布之后,负载均衡器将管理未来的数据段分布。
有关示例,请参阅为空集合或不存在的集合预先定义区域和区域范围。
在区域中添加分片
当连接到 mongos
实例时,使用 sh.addShardToZone()
方法将区域与特定分区关联。单个分片可以有多个区域,多个分片也可以有相同的区域。
例子
以下示例将 NYC
区域添加到两个分片中,并将 SFO
和 NRT
区域添加到第三个分片中:
sh.addShardToZone("shard0000", "NYC") sh.addShardToZone("shard0001", "NYC") sh.addShardToZone("shard0002", "SFO") sh.addShardToZone("shard0002", "NRT")
连接到 mongos
实例时,您可以使用 sh.removeShardFromZone()
方法从特定分片中移除区域,如以下示例所示,该示例从分片中移除NRT
区域:
sh.removeShardFromZone("shard0002", "NRT")
创建区域范围
要定义区域的分片键范围,请在连接到 mongos
实例时使用 sh.updateZoneKeyRange()
方法。任何给定的分片键范围只能有一个分配的区域。您不能重叠定义的范围。
例子
给定records
数据库中名为users
的集合,由zipcode
字段进行分片。 以下操作分配:
将曼哈顿和布鲁克林的两个邮政编码范围分配给
NYC
区域将旧金山的一个邮政编码范围分配给
SFO
区域
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")
注意
区域范围始终包括下边界,但不包括上边界。
删除集合将删除其关联的区域/标记范围。
删除区域范围
版本 3.4 中的新增功能:使用 Shell 助手方法sh.removeRangeFromZone()
从区域中删除范围。
例子
以下示例删除曼哈顿内邮政编码范围的NYC
区域分配:
sh.removeRangeFromZone("records.user", {zipcode: "10001"}, {zipcode: "10281"})
注意
删除集合将删除其关联的区域/标记范围。
查看现有区域
使用sh.status()
列出与集群中每个分区相关联的分区。 您还可以通过查询 config
数据库中的 shards
集合来查看分片区域。
以下示例使用 find()
方法返回所有具有 NYC
区域的分片。
use config db.shards.find({ tags: "NYC" })
您可以在 config
数据库的 tags
集合中找到所有命名空间的区域范围。sh.status()
的输出也会显示所有区域范围。
以下示例使用 find()
方法返回任何与 NYC
区域相关的分片。
use config db.tags.find({ tag: "NYC" })