Docs 菜单

Docs 主页开发应用程序MongoDB Manual

使用数据块进行数据分区

在此页面上

  • 初始数据段
  • 范围大小
  • 范围迁移
  • 不可再分割/巨型数据段

MongoDB 使用与集合关联的分片键,将数据分区为特定分片拥有的数据段。一个数据段由一个分片数据范围组成。范围可以是数据段的一部分,也可以是整个数据段。负载均衡器在分片之间迁移数据。每个数据段都具有基于分片键的包含下限和排除上限。

分片键值空间被分割为较小范围或数据块的示意图。

数据段可以表示的最小数据单位是单个唯一的分片键值。

  • 分片操作会创建一个较大的初始数据段来覆盖所有分片键值。

  • 创建初始数据段后,负载均衡器会在需要开始平衡数据时移动初始数据段的范围。

  • 如果为空集合或不存在的集合定义了区域和区域范围

    • 分片操作为定义的区域范围创建空数据段以及任何附加数据段以覆盖分片键值的整个范围,并根据区域范围执行初始数据段分发。数据段的初始创建和分发可以更快地设置区域分片。

    • 在初始分布之后,负载均衡器将管理未来的数据段分布。

  • 如果您没有为空集合或不存在的集合定义的区域和区域范围:

    • 对于哈希分片:

      • 分片操作创建空数据段以覆盖分片键值的整个范围,并执行初始数据段分配。默认情况下,该操作为每个分片创建 2 个数据段,并在集群中迁移。可以使用 numInitialChunks 选项指定不同数量的初始数据段。数据段的这种初始创建和分配可以加快设置分片的速度。

      • 在初始分布之后,负载均衡器将管理未来的数据段分布。

    • 对于范围分片:

      • 分片操作创建一个空数据段来覆盖分片键值的整个范围。

      • 创建初始数据段后,负载均衡器会根据需要在分片之间迁移初始数据段,并管理未来的数据段分配。

提示

另请参阅:

MongoDB 中的默认范围大小为 128 MB。可以增大或缩小数据段大小。考虑更改默认数据段大小的影响:

  1. 范围较小会使数据分布更均匀,但代价是迁移频率更高。这会在查询路由 (mongos) 层产生成本。

  2. 范围越大,迁移越少。从网络角度查询路由层的内部开销来看,这都更加有效率。但是,效率的代价是数据分布可能不均匀。

  3. 范围大小会影响要迁移的每个范围的最大文档数

对许多部署而言,为避免出现频繁和潜在的虚假迁移,可允许数据集的分布稍不均匀。

MongoDB 迁移分片集群中的数据范围,以便在分片之间均匀地分配分片集合的数据。 迁移可能是:

  • 手动。仅在有限的情况下使用手动迁移,例如批量插入时分配数据。请参阅手动迁移数据段,了解详情。

  • 自动化。当分片集合的数据在各分片间分布不均时,负载均衡器进程会自动迁移数据。有关详细信息,请参阅 迁移阈值

有关分片集群负载均衡器的更多信息,请参阅分片集群负载均衡器

负载均衡器是一个后台进程,负责管理数据迁移。如果最大分片和最小分片之间的数据量差异超过迁移阈值,负载均衡器将开始在集群中迁移数据,确保数据分布均匀。

分布在三个分片上的集合示意图。对于此集合,分片之间的数据段数量差异达到*迁移阈值*(在本例中为 2)并触发迁移。

可以对负载均衡器的某些方面进行管理。负载均衡器还会考虑在分片集群中配置区域时创建的任何区域

请参阅分片集群负载均衡器,详细了解负载均衡器

在某些情况下,数据段的增长可能会超过指定的数据段大小,但不能进行分割。最常见的情况是用数据段表示单个分片键值。由于数据段无法分割,因此它会继续增长并超过数据段大小,从而成为巨型数据段。随着这些巨型数据段的不断增长,它们可能会成为性能瓶颈,尤其是当分片键值出现频率很高时。

从 MongoDB 5.0 开始,您可以通过更改文档的分片键对集合重新分片

MongoDB 提供了refineCollectionShardKey命令。细化collection的分片键可以实现更细粒度的数据分布,并且可以解决现有键关联基数不足导致巨型块的情况。

要了解应该对集合进行重新分片还是优化分片键,请参阅更改分片键。

有关更多信息,请参阅:

← 使用区域分发集合