翻译或纠错本页面

在集群中创建数据块

在一个空的分片集合上预分配数据块可以使得客户端将数据写入到已经分好区的集合中.在大多数情况下 sharded cluster 可以自动创建并均衡数据块,但在部分情况下,MongoDB不能足够快地进行数据快的分裂和数据均衡,比如:

  • 如果你想对一个分片上已经存储有数据的集合进行分区.

  • 如果要将大量数据插入到尚未就均衡的集群中,或者插入的数据会导致数据不均衡,比如使用单调递增或递减的数据会使得新数据写入到一个分片中.

因为一些原因,这些操作需要消耗很多资源.

  • Chunk migration requires copying all the data in the chunk from one shard to another.

  • No shard can participate in more than one migration at any given time. To migrate multiple chunks from a shard, the balancer migrates the chunks one at a time.

    在 3.4 版更改: Observing the restriction that a shard can participate in at most one migration at a time, for a sharded cluster with n shards, MongoDB can perform at most n/2 (rounded down) simultaneous chunk migrations.

  • MongoDB只有在插入时才会进行数据块分裂.

警告

只对空集合进行预分配.如果集合中已经有数据,在对集合开启分片后,MongoDB会自动进行数据块分裂.在存在数据时手动干预数据块分裂与数据块迁移会导致不可预知的数据块大小和效率低下的数据均衡.

使用以下过程手动创建数据块:

  1. 在集合中手动使用 split 创建数据块.

    示例

    mongo 中使用以下指令为 myapp.users 创建数据块,使用的片键为 email .

    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.runCommand( { split : "myapp.users" , middle : { email : prefix } } );
      }
    }
    

    这假设集合中有1亿条数据.

    For information on the balancer and automatic distribution of chunks across shards, see Cluster Balancer and Chunk Migration. For information on manually migrating chunks, see 在集群中迁移数据块.