翻译或纠错本页面

在集群中迁移数据块

在绝大多数情况下,应该使用自动的 balancershards 之间迁移 chunks ,不过,有时候也需要手动迁移.

  • 使用 pre-splitting 分裂空的集合并手工迁移到每个分片上.在准备批量写入数据时可以这样使用.

  • 如果集群数据非常活跃,自动均衡不能在 均衡时间窗口 内迁移数据,这时需要手工迁移.

使用 moveChunk 手动迁移数据块.参见 Cluster BalancerChunk Migration 获得自动均衡如何在分片间迁移数据块的信息.

示例

Migrate a single chunk

以下的例子假设存在数据库 myapp,``users`` 是其中一个集合,片键为 username,要迁移的数据块中有一个片键值 smith.可以在 mongo 终端中使用以下命令进行数据块的迁移:

db.adminCommand( { moveChunk : "myapp.users",
                   find : {username : "smith"},
                   to : "mongodb-shard3.example.net" } )

这个命令将会把含有”smith”的数据块迁移到名字为 mongodb-shard3.example.netshard 上.直到迁移完成命令才会返回.

小技巧

使用 listShards 返回分片列表.

示例

Evenly migrate chunks

为了均衡地迁移 myapp.users 集合中的数据块,可以把数据块在各个分片之间逐个迁移,并运行以下命令:

var shServer = [ "sh0.example.net", "sh1.example.net", "sh2.example.net", "sh3.example.net", "sh4.example.net" ];
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({moveChunk : "myapp.users", find : {email : prefix}, to : shServer[(y-97)/6]})
  }
}

参见 在集群中创建数据块 获得预分配的介绍.

命令 moveChunk 有参数 _secondaryThrottle,如果设置为 true,在数据块进行迁移时,对分片的修改都要同步到 从节点,参见 Change Replication Behavior for Chunk Migration 获得更多信息.

警告

The moveChunk command may produce the following error message:

The collection's metadata lock is already taken.

This occurs when clients have too many open cursors that access the migrating chunk. You may either wait until the cursors complete their operations or close the cursors manually.