使用数据块进行数据分区
MongoDB 使用了分片键与集合相关联,用于将数据分割成特定分片拥有的数据块。一个数据块由一系列分片数据组成。范围可以是数据块的一部分或整个数据块。均衡器会在分片之间迁移数据。每个数据块根据分片键具有包含的下限和排除的上限。
数据块可以表示的最小数据单位是一个唯一的分片键值。
初始数据块
已填充集合
分片操作创建一个大的初始数据块来覆盖所有分片键值。
在创建初始数据块之后,当均衡器需要开始平衡数据时,它会将范围从初始数据块中移除。
空集合
如果你为空或不存在的集合定义了区域和区域范围。
分片操作为定义的分区范围创建空数据块,以及任何额外的数据块以覆盖整个分片键值范围,并根据分区范围执行初始数据块分布。这种初始创建和分布数据块的操作可以加快分区分片的设置。
在初始分布之后,均衡器将管理未来的数据块分布。
如果您为空集合或不存在集合未定义分区和分区范围
对于哈希分片
分片操作创建覆盖整个分片键值范围的数据块,并执行初始数据块分布。默认情况下,操作为每个分片创建2个数据块并在集群中迁移。您可以使用
numInitialChunks
选项指定不同的初始数据块数量。这种初始创建和分布数据块的操作可以加快分片的设置。在初始分布之后,均衡器将管理未来的数据块分布。
对于范围分片
分片操作创建一个覆盖整个分片键值范围的单个空数据块。
在初始数据块创建后,均衡器根据适当的情况在分片间迁移初始数据块,并管理未来的数据块分布。
范围大小
MongoDB中默认的 范围 大小为128兆字节。您可以 增加或减少数据块大小。请考虑更改默认数据块大小的影响
较小的范围会导致数据分布更加均匀,但代价是迁移频率更高。这会在查询路由(
mongos
层)中产生额外开销。较大的范围导致迁移频率较低。这在网络方面以及查询路由层内部开销方面都更高效。但是,这些效率是以数据分布可能不均匀为代价的。
范围大小影响 每个范围迁移的最大文档数。
对于许多部署,为了避免频繁且可能是不必要的迁移,牺牲数据集分布的均匀性是合理的。
范围迁移
MongoDB在分片集群中迁移数据范围,以将分片集合的数据均匀分布在各个分片上。迁移可以是
手动。仅在有限情况下使用手动迁移,例如在批量插入期间分配数据。有关更多详细信息,请参阅手动迁移块。
平衡
平衡器是一个后台进程,用于管理数据迁移。如果最大和最小分片之间的数据量差异超过迁移阈值,平衡器将开始在集群中迁移数据以确保均匀分布。
您可以管理均衡器的某些方面。均衡器也尊重在分片集群中配置区域时创建的任何区域。
有关均衡器的更多信息,请参阅分片集群均衡器。
不可分割/大块
在某些情况下,数据块可以超过指定的数据块大小但无法进行分割。最常见的情况是一个数据块代表单个分片键值。由于数据块无法分割,它将继续增长超过数据块大小,成为一个大块。这些大块会随着增长成为性能瓶颈,尤其是如果分片键值出现的频率很高的话。
从MongoDB 5.0开始,您可以通过更改文档的分片键重新分片集合。
MongoDB提供了refineCollectionShardKey
命令。精炼集合的分片键可以更细粒度地分配数据,并解决现有键的基数不足导致大块的情况。
要了解您是否应该重新分片集合或精炼分片键,请参阅更改分片键。
更多信息请参阅