在本页面
在分片群集中,您可以基于shard key创建分片数据区域。您可以将每个区域与集群中的一个或多个分片关联。分片可以与任意数量的区域关联。在平衡的集群中,MongoDB 仅将区域覆盖的块迁移到与该区域关联的碎片。
可以应用区域的一些常见部署模式如下:
下图显示了具有三个碎片和两个区域的碎片集群。该A
区域代表一个范围,其下边界为1
,上限为10
。该B
区域表示一个范围的下边界为10
,上边界为20
。碎片Alpha
并Beta
具有A
区域。碎片区Beta
也有B
。分片Charlie
没有与之关联的区域。群集处于稳定状态,没有任何块违反任何区域。
每个区域涵盖一个集合的一个或多个分片键值范围。区域覆盖的每个范围始终包括其下边界和上边界。
区域不能共享范围,也不能具有重叠范围。
为了定义范围,MongoDB提供了updateZoneKeyRange
命令以及相关的辅助方法
sh.updateZoneKeyRange()
和sh.addShardTag()
。
在MongoDB中4.0.2开始,您可以运行
updateZoneKeyRange
数据库命令及其助手
sh.updateZoneKeyRange()
和sh.addTagRange()
上unsharded集合或不存在的集合。
从MongoDB 4.0.2开始,删除集合将删除其关联的区域/标签范围。
在版本4.0.3中更改。
通过在分片空的或不存在的集合之前定义区域和区域范围,分片收集操作将为已定义的区域范围以及任何其他分片创建分片,以覆盖分片键值的整个范围并执行初始操作基于区域范围的块分布。块的这种初始创建和分配允许更快地设置分区分片。在初始分配之后,平衡器将管理后续的块分配。
有关示例,请参见为空集合或不存在的集合预定义区域和区域范围。
该平衡器尝试均匀集群中的所有碎片散布分片集合的块。
对于标记为迁移的每个块,平衡器会检查任何已配置区域的每个可能的目标分片。如果块范围落入某个区域,则平衡器将块迁移到该区域内的分片中。未落入区域的块可以存在于集群中的任何分片上,并且可以正常迁移。
在平衡回合期间,如果平衡器检测到任何块违反给定分片的已配置区域,则平衡器会将这些块迁移到不存在冲突的分片。
在将区域与一个或多个分片相关联并为该分片集合配置一个具有分片密钥范围的区域后,群集可能需要一些时间才能迁移该分片集合的受影响数据。这取决于块的划分和集群中数据的当前分布。平衡完成后,给定区域中文档的读写仅路由到该区域内的一个或多个分片。
配置完成后,平衡器会在以后的平衡回合中遵守区域 。
在定义要覆盖的区域的新范围时,必须使用分片键中包含的字段。如果使用复合分片键,则范围必须包含分片键的前缀。
例如,给定一个分片键,创建或更新区域以覆盖require值(包括作为前缀)。创建或更新区域以覆盖require值(包括和作为前缀)。{ a : 1, b : 2, c : 3 }
b
a
c
a
b
您无法使用分片键中未包含的字段来创建区域。例如,如果您要使用区域根据地理位置对数据进行分区,则分片键将至少需要一个包含地理数据的字段。
为集合选择分片键时,请考虑可能要用于配置区域的字段。分片后,您将无法更改分片密钥。有关选择分片键的注意事项,请参阅选择分片键。