Docs 菜单
Docs 主页
/
MongoDB Manual
/ /

在分片集群中创建范围

在此页面上

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

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

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

注意

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

警告

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

以下示例展示了如何手动生成和分配范围。 该示例使用 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

要对 sample.documents集合分片,运行以下命令:

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

注意

由于集合为空,shardCollection 命令会自动在 email字段上创建索引以支持分片键。

3

要将分片分配到步骤 1 中定义的范围,运行以下命令:

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

moveRange 命令将空范围分布到集群中的分片。 集群现已针对批量插入进行了优化。

要进一步提高性能,请创建其他索引来支持应用程序的常见查询。

后退

数据分区