在分片群集中迁移块
在大多数情况下,您应该让自动balancer在shards之间迁移chunks。但是,在某些情况下,您可能需要手动迁移块:
-
当pre-splitting为空集合时,请手动迁移块以将其均匀分布在各个分片上。在有限的情况下使用预分割以支持批量数据提取。
-
如果活动集群中的平衡器无法在balancing window内分配块,那么您将必须手动迁移块。
要手动迁移块,请使用moveChunk命令。有关自动平衡器如何在分片之间移动块的更多信息,请参见Cluster Balancer和Chunk Migration。
Example
迁移单个块
以下示例假定字段username
是myapp
数据库中名为users
的集合的shard key,并且值smith
存在于要迁移的chunk中。在mongo shell 中使用以下命令迁移块。
db.adminCommand( { moveChunk : "myapp.users",
find : {username : "smith"},
to : "mongodb-shard3.example.net" } )
此命令将包含分片键值“ smith”的块移动到名为mongodb-shard3.example.net
的shard。该命令将阻塞,直到迁移完成。
Tip
要返回分片列表,请使用listShards命令。
Example
均匀迁移块
要均匀地迁移myapp.users
集合的块,请将每个前缀块彼此放在下一个分片上,然后在 mongo shell 中运行以下命令:
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
参数和writeConcern
参数,该参数确定平衡器何时 continue 进行迁移块中的下一个文档。有关详细信息,请参见moveChunk命令。