OPTIONS
翻译或纠错本页面

在集群中创建数据块

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

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

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

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

  • 数据块迁移需要将分片中一个数据块的数据全部迁移到另一个分片中.

  • MongoDB同时只能迁移一个数据块.

  • 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亿条数据.

    参见 集群均衡器 and 数据块迁移 获得均衡器和自动数据均衡的信息.参见 在集群中迁移数据块 获得手动迁移数据块的信息.