Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
Click here >
Docs 菜单
Docs 主页
/ /

使用数据块进行数据分区

MongoDB 使用与集合关联的分片键数据分区为特定分片所拥有的数据块。一个数据块由一个分片数据范围 成。每个数据块都具有基于分片键的包含下限和排除上限。

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

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

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

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

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

    • 分片操作会为定义的区域范围创建空数据块和任何其他数据块以覆盖分片键的整个范围,并根据区域范围执行初始数据块分布。数据块的初始创建和分布可以更快地设置区域分片。

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

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

    • 对于哈希分片:

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

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

    • 对于范围分片:

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

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

提示

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

  1. 小范围会使数据分布更均匀,但代价是迁移更频繁,这会增加查询路由 (mongos) 层的开销。

  2. 较大的范围会导致迁移较少,从而减少查询路由层的网络和内部开销,但可能会导致数据分布不均。

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

对于大多数部署来说,稍微不均匀的数据分布比频繁迁移要好。

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

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

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

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

负载均衡器是管理数据迁移的背景进程。如果最大分片和最小分片之间的数据不平衡超过迁移阈值,负载均衡器开始在集群中迁移数据。

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

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

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

增长超过 指定的数据块大小但无法分割的数据块称为巨型块。最常见的原因是用数据块表示单个分片键值。巨型块可能会成为性能瓶颈,尤其是当分片键值出现频率较高时

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

refineCollectionShardKey 命令可实现更细粒度的数据分布,并可解析由于分片键关联基数不足而导致的巨型块。

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

有关更多信息,请参阅:

后退

范围分片

获得技能徽章

免费掌握“分片策略”!

了解详情

在此页面上