OPTIONS
翻译或纠错本页面

在集群中迁移数据块

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

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

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

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

示例

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

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

2.2 新版功能: 命令 moveChunk 有参数 _secondaryThrottle,如果设置为 true,在数据块进行迁移时,对分片的修改都要同步到 从节点,参见 改变数据块迁移时的复制集行为(Secondary Throttle) 获得更多信息.

在 2.4 版更改: 在2.4版本中, _secondaryThrottle 默认为 true .

警告

moveChunk 可能会返回以下错误:

The collection's metadata lock is already taken.

如果要迁移的数据块上有太多打开的 游标 ,会产生错误.你可以等待这些游标完成或者手动关闭他们.