在分片群集中迁移块

在大多数情况下,您应该让自动balancershards之间迁移chunks。但是,在某些情况下,您可能需要手动迁移块:

  • pre-splitting为空集合时,请手动迁移块以将其均匀分布在各个分片上。在有限的情况下使用预分割以支持批量数据提取。

  • 如果活动集群中的平衡器无法在balancing window内分配块,那么您将必须手动迁移块。

要手动迁移块,请使用moveChunk命令。有关自动平衡器如何在分片之间移动块的更多信息,请参见Cluster BalancerChunk Migration

Example

迁移单个块

以下示例假定字段usernamemyapp数据库中名为users的集合的shard key,并且值smith存在于要迁移的chunk中。在mongo shell 中使用以下命令迁移块。

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

此命令将包含分片键值“ smith”的块移动到名为mongodb-shard3.example.netshard。该命令将阻塞,直到迁移完成。

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命令。

Warning

moveChunk命令可能会产生以下错误消息:

The collection's metadata lock is already taken.

当 Client 端有太多打开的cursors访问迁移块时,就会发生这种情况。您可以 await,直到游标完成其操作,或者手动关闭游标。