Zones

在本页面

在分片群集中,您可以基于shard key创建zones的分片数据。您可以将每个区域与集群中的一个或多个分片关联。分片可以与任意数量的区域关联。在平衡群集中,MongoDB 仅将区域覆盖的chunks迁移到与该区域关联的分片。

可以应用区域的一些常见部署模式如下:

  • 在一组特定的分片上隔离特定的数据子集。

  • 确保最相关的数据驻留在地理上最靠近应用程序服务器的分片上。

  • 根据分片硬件的硬件/性能将数据路由到分片。

下图说明了具有三个碎片和两个区域的碎片集群。 A区域代表下边界为1且上限为10的范围。 B区域表示下边界为10且上边界为20的范围。碎片AlphaBeta具有A区域。碎片Beta也具有B区域。分片Charlie没有与之关联的区域。群集处于稳定状态,没有任何块违反任何区域。

分片群集中基于区域的数据分布图

行为与操作

Ranges

每个区域覆盖一个或多个shard key值范围。区域覆盖的每个范围始终包括其下边界和上边界。

区域不能共享范围,也不能有重叠范围。

Balancer

balancer尝试在整个群集中的所有分片上平均分配分片集合的块。

对于标记为迁移的每个chunk,平衡器将检查任何已配置区域的每个可能的目标分片。如果组块范围属于某个区域,则平衡器会将组块迁移到该区域内的分片中。未落入区域的块可以存在于集群中的* any *分片上,并且可以正常迁移。

在平衡回合期间,如果平衡器检测到任何块违反给定分片的已配置区域,则平衡器会将那些块迁移到不存在冲突的分片。

在使用分片密钥范围配置区域并将其与一个或多个分片关联之后,群集可能需要一些时间来迁移受影响的数据。这取决于块的划分以及集群中数据的当前分布。平衡完成后,给定区域中文档的读写操作仅路由到该区域内的一个或多个分片。

配置完成后,平衡器会在将来的balancing rounds内遵守区域。

Shard Key

在定义要覆盖的区域的新范围时,必须使用shard key中包含的字段。如果使用compound分片键,则范围必须包含分片键的前缀。

例如,给定一个分片键{ a : 1, b : 2, c : 3 },创建或更新一个区域以覆盖b的值要求将a作为前缀。创建或更新区域以覆盖c的值要求包含ab作为前缀。

您不能使用分片键中未包含的字段来创建区域。例如,如果您想使用区域根据地理位置对数据进行分区,则分片键将至少需要一个包含地理数据的字段。

为集合选择分片键时,请考虑您可能要用于配置区域的字段。分片后,您将无法更改分片密钥。有关选择分片键的注意事项,请参见选择分片键

哈希分片键和区域

在散列的分片键上使用区域时,每个区域都覆盖散列的分片键值。给定一个分片键{ a : 1 }和一个区域alpha的下限为1,上限为5,这些界限表示a哈希值,而不是实际值。因此,无法保证 MongoDB 将a的值从15的文档路由到区域alpha。 MongoDB 将哈希*分片键值在15范围内的任何文档路由到区域alpha内的分片。

通常,覆盖哈希分片键值的连续范围的区域可能会表现出意外的行为。

可以使用minkeymaxkey创建一个覆盖整个分片键值范围的区域,以确保 MongoDB 将特定集合的所有数据限制为该区域中的一个或多个分片。

碎片区域边界

区域范围始终包括下边界,不包括上边界。