文档菜单
文档首页
/
MongoDB 手册
/ /

管理分片区域

本页

  • 将分片添加到区域
  • 创建区域范围
  • 移除区域范围
  • 查看现有区域

在分片集群中,您可以创建表示一组分片的区域,并将一个或多个分片键值范围关联到该区域。MongoDB 仅将落在区域范围内的读取和写入路由到区域内的分片。

提示

在分片一个空集合或不存在集合之前定义区域和区域范围,分片集合操作将创建定义的区域范围的块以及覆盖整个分片键值范围的任何附加块,并根据区域范围执行初始块分布。这种初始创建和分布块允许更快地设置区域分片。初始分布后,均衡器管理后续的块分布。

请参阅为空集合或不存在集合预定义区域和区域范围的示例。

使用 sh.addShardToZone() 方法将区域与特定的分片关联,当连接到 mongos 实例时。单个分片可以有多个区域,多个分片也可以有相同的区域。

示例

以下示例将区域 NYC 添加到两个分片,并将区域 SFONRT 添加到第三个分片。

sh.addShardToZone("shard0000", "NYC")
sh.addShardToZone("shard0001", "NYC")
sh.addShardToZone("shard0002", "SFO")
sh.addShardToZone("shard0002", "NRT")

您可以通过使用 sh.removeShardFromZone() 方法从特定的分片中删除区域,前提是与 mongos 实例连接,如下例所示,该示例从分片中删除了 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")

注意

  • 区域范围始终包含下边界,但不包含上边界。

  • 删除集合会删除其相关的区域/标签范围。

使用 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" })

返回

区域