范围分片
基于范围的分片涉及将数据划分为由分片键值确定的连续范围。
在此模型中,具有“close”分片键值的文档可能位于相同的块或分片中。
这允许有效查询,其中读取连续范围内的目标文档。
但是,读取和写入性能可能会随着分片密钥选择不当而降低。
请参阅碎片键选择。
如果没有配置其他选项(如散列分片或区域所需的选项),则基于范围的分片是默认的分片方法。
分片键选择
当分片键显示以下特征时,远程分片最有效:
大碎片关键基数
低分片键频率
非单调变化的分片键
下图说明了使用字段X作为分片键的分片群集。
如果X的值具有较大的范围,较低的频率,并且以非单调的速率变化,则插入的分布可能类似于以下内容:
对集合分片
使用 sh.shardCollection() 方法,指定集合的完整命名空间以及要用作分片键的目标索引或复合索引。
sh.shardCollection( "database.collection", { <shard key> } )
Shard a Populated Collection
如果您对填充的集合进行分片:
分片操作创建初始块以覆盖整个分片键值范围。
创建的块数取决于配置的块大小。
在初始块创建之后,平衡器会根据需要在分片中迁移这些初始块,并管理未来的块分布。
空集合分片
如果您对一个空集合进行分片:
没有为空集合或不存在集合指定区域和区域范围:
分片操作会创建一个空的块,以覆盖整个分片键值范围。
在初始块创建之后,平衡器在适当的情况下跨分片迁移初始块,以及管理未来的块分布。
为空或非现有集合指定区域和区域范围(从MongoDB 4.0.3开始可用),分片操作为定义的区域范围以及任何其他块创建空块,以覆盖整个分片键值范围,并根据区域范围执行初始块分布。
这种块的初始创建和分发允许更快地设置分区分片。
在初始分发之后,平衡器管理未来的块分布。
参考资料
https://docs.mongodb.com/manual/core/ranged-sharding/