基于范围的分片涉及将数据划分为由分片键值确定的连续范围。在此模型中,具有“接近”分片键值的文档可能位于相同的块或分片中。这允许在连续范围内读取目标文档的高效查询。但是,由于分片密钥选择不佳,读取和写入性能均可能降低。请参阅分片键选择。
基于范围的分片是默认的拆分方法,如果没有其他的选项,如那些需要散列分片或
区配置。
分片键选择
当分片键显示以下特征时,远程分片最有效:
下图说明了使用该字段X
作为分片键的分片群集。如果的值X
具有较大的范围,较低的频率并且以非单调的速率变化,则插入的分布可能类似于以下内容:
分片集合
使用该sh.shardCollection()
方法,指定集合的完整名称空间以及
用作分片键的目标索引或复合索引。
重要
分片集合后,分片键的选择是不变的。即,您不能为该集合选择其他分片键。
从MongoDB 4.2开始,除非分片键字段是不可变_id
字段,否则您可以更新文档的分片键值。有关更新分片键的详细信息,请参阅“ 更改文档的分片键值”。
在MongoDB 4.2之前,文档的分片键字段值是不可变的。
分割一个已填充的集合
如果您将已填充的集合分片:
- 分片操作将创建初始块,以覆盖分片键值的整个范围。创建的块数取决于配置的块大小。
- 在初始块创建之后,平衡器会在分片上适当地迁移这些初始块,并管理后续的块分配。
分割一个空集合
如果将空集合分片:
- 没有为空集合或不存在的集合指定区域和区域范围:
- 分片操作将创建一个空块,以覆盖分片键值的整个范围。
- 在创建初始块之后,平衡器将在块之间适当地迁移初始块,并管理后续的块分配。
- 通过为空集合或不存在的集合指定区域和区域范围(从MongoDB 4.0.3开始可用),
- 分片操作将为定义的区域范围以及所有其他分片创建空块,以覆盖分片键值的整个范围,并根据区域范围执行初始块分配。块的这种初始创建和分配允许更快地设置分区分片。
- 在初始分配之后,平衡器将管理后续的块分配。
也可以看看
要了解如何部署分片群集和实现远程分片,请参阅部署分片群集。