使用数据块进行数据分区
MongoDB 使用与集合关联的分片键数据分区为特定分片所拥有的数据块。一个数据块由一个分片数据范围 成。范围可以是数据块的一部分,也可以是整个数据块。负载均衡器在分片之间迁移数据。每个数据块都具有基于分片键的包含下限和排除上限。
数据段可以表示的最小数据单位是单个唯一的分片键值。
初始数据段
已填充集合
分片操作会创建一个较大的初始数据段来覆盖所有分片键值。
创建初始数据段后,负载均衡器会在需要开始平衡数据时移动初始数据段的范围。
空集合
如果为空集合或不存在的集合定义了区域和区域范围。
分片操作为定义的区域范围创建空数据段以及任何附加数据段以覆盖分片键值的整个范围,并根据区域范围执行初始数据段分发。数据段的初始创建和分发可以更快地设置区域分片。
在初始分布之后,负载均衡器将管理未来的数据段分布。
如果您没有为空集合或不存在的集合定义的区域和区域范围:
对于哈希分片:
分片操作创建空数据段以覆盖分片键值的整个范围,并执行初始数据段分配。默认情况下,该操作为每个分片创建 2 个数据段,并在集群中迁移。可以使用
numInitialChunks
选项指定不同数量的初始数据段。数据段的这种初始创建和分配可以加快设置分片的速度。在初始分布之后,负载均衡器将管理未来的数据段分布。
对于范围分片:
分片操作创建一个空数据段来覆盖分片键值的整个范围。
创建初始数据段后,负载均衡器会根据需要在分片之间迁移初始数据段,并管理未来的数据段分配。
范围大小
MongoDB 中的默认范围大小为 128 MB。可以增大或缩小数据段大小。考虑更改默认数据段大小的影响:
范围较小会使数据分布更均匀,但代价是迁移频率更高。这会在查询路由 (
mongos
) 层产生成本。范围越大,迁移越少。从网络角度和查询路由层的内部开销来看,这都更加有效率。但是,效率的代价是数据分布可能不均匀。
范围大小会影响要迁移的每个范围的最大文档数。
对许多部署而言,为避免出现频繁和潜在的虚假迁移,可允许数据集的分布稍不均匀。
范围迁移
MongoDB 迁移分片集群中的数据范围,以便在分片之间均匀地分配分片集合的数据。 迁移可能是:
手动。仅在有限的情况下使用手动迁移,例如批量插入时分配数据。请参阅手动迁移数据段,了解详情。
有关分片集群负载均衡器的更多信息,请参阅分片集群负载均衡器。
均衡
负载均衡器是一个后台进程,负责管理数据迁移。如果最大分片和最小分片之间的数据量差异超过迁移阈值,负载均衡器将开始在集群中迁移数据,确保数据分布均匀。
不可再分割/巨型数据段
在某些情况下,数据块的增长可能会超过指定的数据块大小 ,但不能进行分割。最常见的情况是用数据块表示单个分片键值。由于数据块无法分割,因此,它会继续增长,超出数据块大小而成为巨型数据块。随着这些巨型数据块的不断增长,它们可能会成为性能瓶颈,尤其是分片键值的出现达到很高频率时。
从 MongoDB 5.0 开始,您可以通过更改文档的分片键对集合重新分片。
MongoDB 提供了 refineCollectionShardKey
命令。细化集合的分片键可以实现更细粒度的数据分布,并且可以解决现有键关联基数不足导致巨型数据块的情况。
要了解应该对集合进行重新分片还是优化分片键,请参阅更改分片键。
有关更多信息,请参阅:
moveChunk
目录
默认情况下, sharding.archiveMovedChunks
处于禁用状态。