区域
在此页面上
在分片的集群中,您可以根据分 分片键 创建分分片的数据的 区域 。您可以将每个区域与集群中的一个或多个分片相关联。 一个分分片可以与任意数量的区域关联。 在均衡集群中, MongoDB仅将区域覆盖的数据段迁移到与该区域关联的分片。
一些可以应用区域的常见部署模式如下:
在一组特定的分片上隔离特定的数据子集。
请确保最相关的数据驻留在地理位置最接近应用程序服务器的分片上。
根据分片硬件的硬件/性能将数据路由到分片。
下图显示一个包含三个分片和两个区域的分片集群。A
区域表示下边界为 1
且上边界为 10
的范围。B
区域表示下边界为 10
且上边界为 20
的范围。分片 Alpha
和 Beta
具有 A
区域。分片 Beta
也具有 B
区域。分片 Charlie
没有关联的区域。集群处于稳定状态,没有任何数据段违反任何区域限制。
行为和操作
范围
每个区域覆盖集合分片键值的一个或多个范围。某一区域所覆盖的每个范围始终包括其下边界,而不包括其上边界。不同区域的范围不可共享,也不可重叠。
例如,考虑 {"x": 1}
上的分片键。该集群具有以下区域范围:
{ "x" : 5 } --> { "x" : 10 } // Zone A { "x" : 10} --> { "x" : 20 } // Zone B
分片键值为
7
的文档将路由到区域 A。分片键值为
10
的文档被路由到 B 区域。
经过哈希处理的分片键和区域范围
对于分片键包括哈希字段的集合,该字段上的分区范围和数据分布基于哈希值。该分区包含哈希分片键值在定义范围内的文档。哈希字段上的分区范围与非哈希字段上的分区范围没有相同的可预测文档路由行为。
例如,考虑 {"x" : "hashed"}
上的分块键。以下范围表示 5
和 10
之间的哈希范围:
{ "x": NumberLong("4470791281878691347") } --> { "x": NumberLong("7766103514953448109") } // Zone A
分片键值为
1
的文档会路由到区域 A,因为1
的哈希值在定义的范围内。分片键值为
15
的文档会路由到区域 A,因为15
的哈希值在定义的范围内。分片键值为
8
的文档不会路由到区域 A,因为8
的哈希值不在定义的范围内。
mongosh
提供 convertShardKeyToHashed()
用于计算指定参数的经过哈希运算后的值。
哈希字段上区域范围的有效用途之一,是将集合的数据限制为单个区域中的一个或多个分片。使用 MinKey
作为下边界、MaxKey
作为上边界,创建一个区域范围,覆盖所有可能的哈希分片键值。
为了定义范围,MongoDB 提供了updateZoneKeyRange
命令以及相关的辅助方法sh.updateZoneKeyRange()
和sh.addShardTag()
。
您可以在未分片的集合或不存在的集合上运行 updateZoneKeyRange
数据库命令及其助手 sh.updateZoneKeyRange()
和 sh.addTagRange()
。
删除集合将删除其关联的区域/标记范围。
初始数据段分布
通过对空集合或不存在的集合进行分片之前定义区域和区域范围,分片集合操作会为定义的区域范围创建数据块以及任何其他数据块,以覆盖分片键值的整个范围,并执行基于区域范围的初始数据块分配。数据块的初始创建和分布可以更快地设置区域分片。在初始分布之后,负载均衡器将管理未来的数据段分布。
MongoDB 支持使用组合哈希索引对集合进行分片。在使用组合哈希分片键对空集合或不存在的集合进行分片时,需要满足额外的要求,MongoDB 才能执行初始数据块创建和分配。
有关示例,请参阅为空集合或不存在的集合预定义区域和区域范围。
平衡器
均衡器尝试将分片集合的数据段平均分布到集群的所有分片。
对于标记为迁移的每个数据段,均衡器检查每个可能的目标分片是否有任何已配置的分区。如果数据段范围属于某个分区,均衡器就会将数据段迁移到该分区内的分片。不属于分区的数据段可存在于集群中的任何分片,并可正常迁移。
在均衡回合期间,如果均衡器检测到任何数据段违反为给定分片配置的区域限制,则均衡器将这些数据段迁移到不存在冲突的分片。
在将一个区域与一个或多个分片关联并为该区域配置分片集合的分片键范围后,集群可能需要一些时间以迁移分片集合的受影响数据。这取决于数据段的划分以及集群中的当前数据分配情况。在均衡完成后,给定区域中的文档读取和写入仅路由到该区域中的一个或多个分片。
配置完成后,负载均衡器会在未来的均衡轮询中遵守区域。
片键
为要覆盖的区域定义范围时,必须使用分片键中包含的字段。如果使用的是复合分片键,此范围则须包含分片键的前缀。
例如,给定分片键 { a : 1, b : 1, c : 1 }
,在创建或更新范围以涵盖 b
值时,需要包含 a
以作为前缀。在创建或更新范围以涵盖 c
值时,需要包含 a
和 b
以作为前缀。
您无法使用未包含在分片键中的字段创建范围。例如,如果您想使用区域根据地理位置对数据进行分区,则分片键需要第一个字段包含地理数据。
在为集合选择分片键时,请考虑您可能希望使用哪些字段来配置分区。有关选择分片键的注意事项,请参阅选择分片键。
分片区域边界
区域范围始终包括下边界,但不包括上边界。