在分片群集中,您可以创建代表一组分片的区域,并将一个或多个范围的分片键值与此区域相关联。MongoDB将仅属于区域内那些分片的读和写路由进入区域范围。
小费
在版本4.0.3中更改:通过在分片一个空的或不存在的集合之前定义区域和区域范围,分片收集操作将为定义的区域范围以及所有其他覆盖整个区域范围的块创建块。分片键值,并根据区域范围执行初始块分配。块的这种初始创建和分配允许更快地设置分区分片。在初始分配之后,平衡器将管理后续的块分配。
有关示例,请参见为空集合或不存在的集合预定义区域和区域范围。
sh.addShardToZone()
连接到mongos
实例时,使用方法将区域与特定分片相关
联。单个碎片可以具有多个区域,并且多个碎片也可以具有相同的区域。
例
以下示例将区域NYC
两个碎片,和区段
SFO
和NRT
第三碎片:
sh.removeShardFromZone()
当连接到mongos
实例时,可以使用方法
从特定分片中删除区域
,如以下示例所示,该方法NRT
将从分片中删除区域:
要定义分区的区域范围,请sh.updateZoneKeyRange()
在连接到mongos
实例时使用该方法。任何给定的分片键范围只能有一个分配的区域。您不能重叠定义的范围。
例
给定一个users
在records
数据库中命名的集合,由zipcode
字段分片。分配以下操作:
NYC
区的两个邮政编码区域SFO
区域中的一组邮政编码注意
3.4版中的新增功能:使用外壳帮助程序方法sh.removeRangeFromZone()
从区域中删除范围。
例
下面的示例删除NYC
曼哈顿内邮政编码范围的区域分配:
注意
从MongoDB 4.0.2开始,删除集合将删除其关联的区域/标签范围。
使用sh.status()
列出关联到集群中的每个碎片的区域。您也可以通过查询数据库中的shards
集合来查看碎片区域
config
。
下面的示例使用该find()
方法返回具有该NYC
区域的所有分片。
你可以找到所有区域范围的命名空间中
tags
的收集config
数据库。的输出sh.status()
还显示所有区域范围。
以下示例使用该find()
方法返回与该NYC
区域关联的任何范围。