在分片集群中创建范围
在大多数情况下, 分分片集群会自动创建、分割和分配范围,无需用户干预。但是,在某些情况下, MongoDB无法创建足够多的范围或以足够快的速度分发数据,从而无法支持所需的吞吐量。
示例,如果您想将大量数据摄取到具有跨分片分布式插入的集群中,则预分片空分分片的集合的范围可以提高吞吐量。
注意
从MongoDB 6.0 开始,负载负载均衡器器不再分配空范围。要预分割集合,请使用moveRange
在集群中的分片之间分配空范围。moveRange
会自动分割要移动的范围,这意味着 moveRange
会同时执行分割和移动操作。您无需使用split
手动分割范围。
或者,通过在对空集合或不存在的集合进行分片之前定义区域和区域范围,分片集合操作会为已定义的区域范围创建范围以及任何其他范围,以覆盖分片键值的整个范围,并执行基于区域范围的初始范围分配。有关更多信息,请参阅空集合。
警告
仅对空集合的范围进行预分片。手动分割已填充集合的范围可能会导致不可预测的范围和大小,以及低效或无效的平衡行为。
步骤
1
// 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; }
结果
后续步骤
了解详情
通过分片命令创建和分配的初始范围,请参阅空集合。
手动迁移范围,请参阅在分片集群中迁移范围。