文档菜单
文档首页
/
MongoDB 手册
/

使用数据块进行数据分区

本页内容

  • 初始数据块
  • 范围大小
  • 范围迁移
  • 不可分割/大块

MongoDB 使用了分片键与集合相关联,用于将数据分割成特定分片拥有的数据块。一个数据块由一系列分片数据组成。范围可以是数据块的一部分或整个数据块。均衡器会在分片之间迁移数据。每个数据块根据分片键具有包含的下限和排除的上限。

Diagram of the shard key value space segmented into smaller ranges or chunks.

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

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

  • 在创建初始数据块之后,当均衡器需要开始平衡数据时,它会将范围从初始数据块中移除。

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

    • 分片操作为定义的分区范围创建空数据块,以及任何额外的数据块以覆盖整个分片键值范围,并根据分区范围执行初始数据块分布。这种初始创建和分布数据块的操作可以加快分区分片的设置。

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

  • 如果您为空集合或不存在集合未定义分区和分区范围

    • 对于哈希分片

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

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

    • 对于范围分片

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

      • 在初始数据块创建后,均衡器根据适当的情况在分片间迁移初始数据块,并管理未来的数据块分布。

提示

另请参阅

MongoDB中默认的 范围 大小为128兆字节。您可以 增加或减少数据块大小。请考虑更改默认数据块大小的影响

  1. 较小的范围会导致数据分布更加均匀,但代价是迁移频率更高。这会在查询路由(mongos 层)中产生额外开销。

  2. 较大的范围导致迁移频率较低。这在网络方面以及查询路由层内部开销方面都更高效。但是,这些效率是以数据分布可能不均匀为代价的。

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

对于许多部署,为了避免频繁且可能是不必要的迁移,牺牲数据集分布的均匀性是合理的。

MongoDB在分片集群中迁移数据范围,以将分片集合的数据均匀分布在各个分片上。迁移可以是

  • 手动。仅在有限情况下使用手动迁移,例如在批量插入期间分配数据。有关更多详细信息,请参阅手动迁移块

  • 自动。当分片集合的数据在各个分片之间的分布不均时,平衡器进程将自动迁移数据。有关更多详细信息,请参阅迁移阈值

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

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

Diagram of a collection distributed across three shards. For this collection, the difference in the number of chunks between the shards reaches the *migration thresholds* (in this case, 2) and triggers migration.

您可以管理均衡器的某些方面。均衡器也尊重在分片集群中配置区域时创建的任何区域

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

在某些情况下,数据块可以超过指定的数据块大小但无法进行分割。最常见的情况是一个数据块代表单个分片键值。由于数据块无法分割,它将继续增长超过数据块大小,成为一个大块。这些大块会随着增长成为性能瓶颈,尤其是如果分片键值出现的频率很高的话。

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

MongoDB提供了refineCollectionShardKey命令。精炼集合的分片键可以更细粒度地分配数据,并解决现有键的基数不足导致大块的情况。

要了解您是否应该重新分片集合或精炼分片键,请参阅更改分片键。

更多信息请参阅

返回

分布集合