文档菜单
文档首页
/
MongoDB 手册
/ /

在分片集群中迁移范围

本页内容

  • 更改流和孤儿文档

在大多数情况下,你应该让自动平衡器在分片之间迁移 范围。但是,在以下几种情况下,你可能需要手动迁移范围

  • 在预分割空集合时,手动迁移范围以在分片之间均匀分配。在有限情况下使用预分割以支持批量数据导入。

  • 如果活动集群中的平衡器无法在 平衡窗口 内分配范围,那么你将不得不手动迁移范围。

要手动迁移范围,请使用 moveChunkmoveRange 命令。

有关自动均衡器如何在分片之间移动范围的更多信息,请参阅 均衡器内部机制范围迁移。

有关调整迁移的更多信息,请参阅 chunkMigrationConcurrency.

示例

迁移单个范围

以下示例假设字段 usernamemyapp 数据库中名为 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]})
}
}

有关预分割的介绍,请参阅 在分片集群中创建范围

  • 使用带有 _secondaryThrottlewriteConcern 字段的 moveChunk 命令,以确定均衡器何时继续迁移范围中的下一个文档。

  • 使用带有 secondaryThrottlewriteConcern 字段的 moveRange 命令,以确定均衡器何时继续迁移范围中的下一个文档。

有关详细信息,请参阅 moveChunkmoveRange

从 MongoDB 5.3 开始,在范围迁移过程中,不会为更改流事件生成对孤立文档的更新。

返回

管理