使用数据块进行数据分区
MongoDB使用与集合关联的分分片键将数据分区为数据段。 数据数据块由分分片的数据的子集组成。 每个数据数据块都有一个基于分分片键的包含下限和不包含上限的范围。
当数据段的大小超过配置的数据块时, MongoDB会对其进行拆分。 插入和更新都可以trigger数据数据块分割。
数据段可以表示的最小范围是单个唯一的分片键值。 无法分割仅包含具有单个分片键值的文档的数据段。
初始数据段
已填充集合
分片操作会创建初始数据段以覆盖分片键值的整个范围。 创建的数据段数量取决于配置的数据段大小。
在创建初始数据块后,负载均衡器会根据需要在分片之间迁移这些初始数据块,并托管未来的数据块分布。
空集合
如果为空集合或不存在的集合定义了区域和区域范围。
分片操作为定义的区域范围创建空数据段以及任何附加数据段以覆盖分片键值的整个范围,并根据区域范围执行初始数据段分发。数据段的初始创建和分发可以更快地设置区域分片。
在初始分布之后,负载均衡器将管理未来的数据段分布。
如果没有为空集合或不存在的集合定义区域和区域范围:
对于哈希分片:
分片操作创建空数据段以覆盖分片键值的整个范围,并执行初始数据段分配。默认情况下,该操作为每个分片创建 2 个数据段,并在集群中迁移。可以使用
numInitialChunks
选项指定不同数量的初始数据段。数据段的这种初始创建和分配可以加快设置分片的速度。在初始分布之后,负载均衡器将管理未来的数据段分布。
对于范围分片:
分片操作创建一个空数据段来覆盖分片键值的整个范围。
创建初始数据段后,负载均衡器会根据需要在分片之间迁移初始数据段,并管理未来的数据段分配。
数据段大小
MongoDB中的默认数据段大小为 64 MB。 您可以增加或减少数据块大小。考虑更改默认数据段大小的影响:
小数据段可以使数据分布更均匀,但代价是迁移更频繁。 这会在查询路由 (
mongos
) 层产生费用。大数据段会导致迁移次数减少。 从网络角度和查询路由层的内部开销来看,这都更加高效。 但是,这种效率的代价是数据分布可能不均匀。
数据块大小会影响要迁移的每个数据块的最大文档数。
对collection进行分片时,数据块大小会影响最大collection大小。分片后,数据段大小不会限制集合大小。
对许多部署而言,为避免出现频繁和潜在的虚假迁移,可允许数据集的分布稍不均匀。
限制
更改数据段大小会影响数据段分割时间,但其效果有一些限制。
自动分割仅在插入或更新期间发生。如果减小数据块大小,则所有数据块可能需要一些时间才能分割到新大小。
分割无法“撤消”。 如果增加数据段大小,则现有数据段必须通过插入或更新来增长,直到达到新大小。
数据块分割
分割是一个防止数据段变得太大的进程。 当数据数据块的增长超过指定的数据数据块大小时,或者数据段中的文档数据块超过要迁移的每个数据段的最大文档数时, MongoDB会根据该数据数据块表示的分片分片键数据块该数据段。 数据块时,可以将数据段分割为多个数据段。 插入和更新可能会trigger分割。 分割是一种有效的元数据更改。 在创建分片时, MongoDB不会迁移任何数据或影响分片。
分割可能会导致集合的数据段在分片上分布不均。 在这种情况下,负载均衡器会跨分片重新分配数据段。 有关跨分片均衡数据段的更多详细信息,请参阅集群负载均衡器。
数据块迁移
MongoDB 迁移分片集群中的数据段,以在分片之间均匀分布分片集合的数据段。 迁移可以是:
手动。仅在有限的情况下使用手动迁移,例如批量插入时分配数据。请参阅手动迁移数据段,了解详情。
有关分片集群负载均衡器的更多信息,请参阅分片集群负载均衡器。
均衡
负载均衡器是托管数据块迁移的背景进程。如果最大分片和最小分片之间的数据块数量差异超过迁移阈值,则负载均衡器开始在集群中迁移数据块,以确保数据均匀分布。
不可再分割/巨型数据段
在某些情况下,数据段的增长可以超过指定的数据段大小,但不能进行分割。 最常见的情况是用数据段表示单个分片键值。 由于数据段无法分割,因此它会继续增长并超过数据段大小,从而成为巨型数据段。 随着这些巨型数据段的不断增长,它们可能会成为性能瓶颈,尤其是当分片键值出现频率很高时。
从 MongoDB 5.0 开始,您可以通过更改文档的分片键对集合重新分片。
MongoDB 提供了 refineCollectionShardKey
命令。细化集合的分片键可以实现更细粒度的数据分布,并且可以解决现有键关联基数不足导致巨型数据块的情况。
要了解应该对集合进行重新分片还是优化分片键,请参阅更改分片键。
有关更多信息,请参阅:
moveChunk
目录
在 MongoDB 2.6 和 MongoDB 3.0 中, sharding.archiveMovedChunks
默认处于启用状态。 所有其他 MongoDB 版本默认禁用此功能。 启用sharding.archiveMovedChunks
后,源分片会将已迁移数据块中的文档存档在 storage.dbPath
中moveChunk
目录下的以collection命名空间命名的目录中
如果迁移过程中出现错误,这些文件可能有助于恢复迁移过程中受影响的文档。
迁移成功完成后,无需从这些文件中恢复文档,就可以安全地删除这些文件。 或者,如果您有可用于恢复的数据库现有备份,也可以在迁移后删除这些文件。
要确定是否所有迁移都已完成,请在连接到 实例时运行sh.isBalancerRunning()
mongos
。