Docs 菜单
Docs 主页
/
MongoDB Manual
/ /

管理分片区域

在此页面上

  • 在区域中添加分片
  • 创建区域范围
  • 删除区域范围
  • 查看现有区域

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

提示

通过对空集合或不存在的集合进行分片之前定义区域和区域范围,分片集合操作会为定义的区域范围创建数据块以及任何其他数据块,以覆盖分片键值的整个范围,并执行基于区域范围的初始数据块分配。数据块的初始创建和分布可以更快地设置区域分片。在初始分布之后,负载均衡器将管理未来的数据段分布。

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

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

例子

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

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

后退

区域