在分片集群中迁移范围
本页内容
在大多数情况下,你应该让自动平衡器在分片之间迁移 范围。但是,在以下几种情况下,你可能需要手动迁移范围
在预分割空集合时,手动迁移范围以在分片之间均匀分配。在有限情况下使用预分割以支持批量数据导入。
如果活动集群中的平衡器无法在 平衡窗口 内分配范围,那么你将不得不手动迁移范围。
要手动迁移范围,请使用 moveChunk
或 moveRange
命令。
有关自动均衡器如何在分片之间移动范围的更多信息,请参阅 均衡器内部机制 和 范围迁移。
有关调整迁移的更多信息,请参阅 chunkMigrationConcurrency
.
示例
迁移单个范围
以下示例假设字段 username
是 myapp
数据库中名为 users
的集合的 分片键,并且值 smith
存在于要迁移的 范围 内。使用以下命令在mongosh
.
db.adminCommand( { moveChunk : "myapp.users", find : {username : "smith"}, to : "mongodb-shard3.example.net" } )
此命令将包含分片键值 "smith" 的范围移动到名为 mongodb-shard3.example.net
的 分片。命令将在迁移完成之前阻塞。
提示
要返回分片列表,请使用 listShards
命令。
示例
均匀迁移范围
要均匀迁移 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]}) } }
有关预分割的介绍,请参阅 在分片集群中创建范围。
使用带有
_secondaryThrottle
和writeConcern
字段的moveChunk
命令,以确定均衡器何时继续迁移范围中的下一个文档。使用带有
secondaryThrottle
和writeConcern
字段的moveRange
命令,以确定均衡器何时继续迁移范围中的下一个文档。
有关详细信息,请参阅 moveChunk
和 moveRange
。