在分片群集中创建块

在一个空的分片集合中预分割块范围,使 Client 端可以将数据插入已经分区的集合中。在大多数情况下,sharded cluster会自动创建和分发块,而无需用户干预。但是,在少数情况下,MongoDB 无法创建足够大的块或足够快地分发数据以支持所需的吞吐量。例如:

  • 如果要对驻留在单个分片上的现有数据集合进行分区。

  • 如果要将大量数据摄取到不平衡的群集中,或者要将数据摄取到那里将导致数据不平衡。例如,单调增加或减少分片键会将所有数据插入单个块中。

这些操作会占用大量资源,原因有以下几个:

  • 块迁移需要将块中的所有数据从一个分片复制到另一个。

  • 分片在任何给定时间都不能参与多个迁移。要从一个分片迁移多个块,平衡器一次迁移一个块。

在版本 3.4 中进行了更改:遵守分片每次最多只能参与一次迁移的限制,对于具有* n 个分片的分片集群,MongoDB 最多可以执行 n/2 *个(向下取整)同时进行的块迁移。

  • MongoDB 仅在插入操作之后创建拆分。

Warning

仅预分割一个空集合。如果某个集合已经有数据,则在为该集合启用分片时,MongoDB 会自动拆分该集合的数据。手动创建拆分的后续尝试可能导致不可预测的组块范围和大小以及无效或无效的平衡行为。

要手动创建块,请使用以下过程:

  • 通过手动对块执行split命令来拆分集合中的空块。

Example

要使用email字段作为shard keymyapp.users集合中的文档创建块,请在mongo shell 中使用以下操作:

Note

for ( var x=97; x<97+26; x++ ){
for( var y=97; y<97+26; y+=6 ) {
var prefix = String.fromCharCode(x) + String.fromCharCode(y);
db.adminCommand( { split : "myapp.users" , middle : { email : prefix } } );
}
}

假设收集规模为 1 亿个文档。

有关平衡器和跨碎片自动分配块的信息,请参阅Cluster BalancerChunk Migration。有关手动迁移块的信息,请参见在分片群集中迁移块