zone区域

管理分片区域

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

 

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

以下示例将区域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() 方法。任何给定的分片键范围只能有一个指定区域。您不能重叠定义的范围。

 

在记录数据库中给定一个名为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()从区域中删除范围。

sh.removeRangeFromZone("records.user", {zipcode: "10001"}, {zipcode: "10281"})

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

使用sh.status()列出与集群中每个碎片关联的区域。您还可以通过查询配置数据库中的碎片集合来查看碎片区域。

以下示例使用该find()方法返回该NYC区域的所有分片。

use config
db.shards.find({ tags: "NYC" })

您可以在配置数据库的标记集合中找到所有命名空间的区域范围。sh.status()的输出还显示所有区域范围。

下面的示例使用该find()方法返回与NYC区域相关的任何范围。

use config
db.tags.find({ tag: "NYC" })

更新现有分片区域

1停止平衡器
sh.stopBalancer()
sh.removeRangeFromZone("records.user", { zipcode: "10001" }, { zipcode: "10281" } )
sh.updateZoneKeyRange("records.users", { zipcode: "11201" }, { zipcode: "11240" }, "NYC" )
sh.startBalancer()

按块划分数据

MongoDB 使用与集合关联的分片键将数据划分为特定分片所拥有的区块。区块由一系列分片数据组成。范围可以是区块的一部分或整个区块。平衡器在分片之间迁移数据。每个区块都有基于分片键的包含下限和排除上限

 

 

posted @ 2024-07-08 11:59  wongchaofan  阅读(2)  评论(0编辑  收藏  举报