Zones
在本页面
在分片群集中,您可以基于shard key创建zones的分片数据。您可以将每个区域与集群中的一个或多个分片关联。分片可以与任意数量的区域关联。在平衡群集中,MongoDB 仅将区域覆盖的chunks迁移到与该区域关联的分片。
可以应用区域的一些常见部署模式如下:
-
在一组特定的分片上隔离特定的数据子集。
-
确保最相关的数据驻留在地理上最靠近应用程序服务器的分片上。
-
根据分片硬件的硬件/性能将数据路由到分片。
下图说明了具有三个碎片和两个区域的碎片集群。 A
区域代表下边界为1
且上限为10
的范围。 B
区域表示下边界为10
且上边界为20
的范围。碎片Alpha
和Beta
具有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
的值要求包含a
和b
作为前缀。
您不能使用分片键中未包含的字段来创建区域。例如,如果您想使用区域根据地理位置对数据进行分区,则分片键将至少需要一个包含地理数据的字段。
哈希分片键和区域
在散列的分片键上使用区域时,每个区域都覆盖散列的分片键值。给定一个分片键{ a : 1 }
和一个区域alpha
的下限为1
,上限为5
,这些界限表示a
的哈希值,而不是实际值。因此,无法保证 MongoDB 将a
的值从1
到5
的文档路由到区域alpha
。 MongoDB 将哈希*分片键值在1
或5
范围内的任何文档路由到区域alpha
内的分片。
通常,覆盖哈希分片键值的连续范围的区域可能会表现出意外的行为。
可以使用minkey
和maxkey
创建一个覆盖整个分片键值范围的区域,以确保 MongoDB 将特定集合的所有数据限制为该区域中的一个或多个分片。
碎片区域边界
区域范围始终包括下边界,不包括上边界。
See also