在分片集群中创建范围
在大多数情况下,分分片集群会自动创建、分割和分发范围,无需用户干预。但是,在某些情况下, MongoDB无法创建足够多的范围或以足够快的速度分发数据,从而无法支持所需的吞吐量。
示例,如果您想将大量数据摄取到具有跨分片分布式插入的集群中,则预分片空分分片的集合的范围可以提高吞吐量。
注意
从MongoDB 6.0 开始,负载负载均衡器器不再分配空范围。要预分割集合,请使用moveRange
在集群中的分片之间分配空范围。moveRange
会自动分割要移动的范围,这意味着 moveRange
会同时执行分割和移动操作。您无需使用split
手动分割范围。
或者,通过在对空集合或不存在的集合进行分片之前定义区域和区域范围,分片集合操作会为已定义的区域范围创建范围以及任何其他范围,以覆盖分片键值的整个范围,并执行基于区域范围的初始范围分配。有关更多信息,请参阅空集合。
警告
仅对空集合的范围进行预分片。手动分割已填充集合的范围可能会导致不可预测的范围和大小,以及低效或无效的平衡行为。
步骤
以下示例展示了如何手动生成和分配范围。 该示例使用 sample.documents
命名空间中的一个集合,并在 email
字段上对该集合进行分片。
1
定义分片键范围
创建一个函数来定义分片键范围。 此示例根据可能的电子邮件地址创建范围,因为 email
将用作分片键。
// Generate two character prefix email ranges. function getRanges(shards) { let ranges = []; // The total number of prefix possibilities is 26 * 26 (aa to zz). // We calculate the number of combinations to add in a range. const totalCombinationsPerShard = 26 * 26 / shards.length; let minKey = { email: MinKey }; let maxKey = { email: MinKey }; for(let i = 1; i <= shards.length; ++i) { // 97 is lower case 'a' in ASCII. let prefix = 97 + ((totalCombinationsPerShard*i)/26); let suffix = 97 + ((totalCombinationsPerShard*i)%26); let initialChars = String.fromCharCode(prefix) + String.fromCharCode(suffix); minKey = maxKey; maxKey = { email: i !== shards.length ? initialChars : MaxKey }; ranges.push({ min: minKey, max: maxKey }); } return ranges; }
2
结果
moveRange
命令将空范围分布到集群中的分片。 集群现已针对批量插入进行了优化。
后续步骤
要进一步提高性能,请创建其他索引来支持应用程序的常见查询。
了解详情
通过分片命令创建和分配的初始范围,请参阅空集合。
手动迁移范围,请参阅在分片集群中迁移范围。