翻译或纠错本页面
在集群中迁移数据块¶
在绝大多数情况下,应该使用自动的 balancer 在 shards 之间迁移 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.net 的 shard 上.直到迁移完成命令才会返回.
小技巧
使用 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 .