Docs 菜单
Docs 主页
/
MongoDB Manual
/ /

在分片集群中创建范围

在此页面上

  • 步骤
  • 结果
  • 后续步骤
  • 了解详情

在大多数情况下, 分分片集群会自动创建、分割和分配范围,无需用户干预。但是,在某些情况下, MongoDB无法创建足够多的范围或以足够快的速度分发数据,从而无法支持所需的吞吐量。

示例,如果您想将大量数据摄取到具有跨分片分布式插入的集群中,则预分片空分分片的集合的范围可以提高吞吐量。

注意

或者,通过在对空集合或不存在的集合进行分片之前定义区域和区域范围,分片集合操作会为已定义的区域范围创建范围以及任何其他范围,以覆盖分片键值的整个范围,并执行基于区域范围的初始范围分配。有关更多信息,请参阅空集合。

警告

仅对空集合的范围进行预分片。手动分割已填充集合的范围可能会导致不可预测的范围和大小,以及低效或无效的平衡行为。

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;
}
2

db.adminCommand( {
shardCollection: 'sample.documents',
key: {
email: 1
}
} );

注意

3

const shards = db.adminCommand({
listShards: 1
}).shards;
let ranges = getRanges(shards);
for (let i = 0; i < ranges.length; ++i) {
db.adminCommand({
moveRange: 'sample.documents',
min: ranges[i].min,
max: ranges[i].max,
toShard: shards[i]._id
});
}

后退

数据分区