シャーディングされたクラスターで範囲を移行
ほとんどの場合は、自動バランサーが範囲をシャード間で移行するようにする必要があります。 ただし、次のような場合に、範囲を手動で移行することをお勧めします。
空のコレクションを事前に分割する場合は、範囲を手動で移行して、シャード全体に均等に分散します。 一括データの取り込みをサポートするために、限られた状況で事前分割を使用します。
アクティブなクラスターのバランサーがバランシング ウィンドウ内で範囲を分散できない場合は、範囲を手動で移行する必要があります。
範囲を手動で移行するには、 moveChunk
またはmoveRange
コマンドを使用します。
オートバランサーが範囲をシャード間で範囲を移動する方法の詳細については、「バランサーの内部と範囲の移行 」を参照してください。
移行の調整の詳細については、 chunkMigrationConcurrency
を参照してください。
例
単一の範囲を移行
次の例では、フィールドusername
がmyapp
データベース内のusers
という名前のコレクションのシャードキーであり、値smith
が移行する範囲内に存在することを前提としています。 mongosh
で次のコマンドを使用して範囲を移行します。
db.adminCommand( { moveChunk : "myapp.users", find : {username : "smith"}, to : "mongodb-shard3.example.net" } )
このコマンドは、シャードキー値 "mit" を含む範囲をmongodb-shard3.example.net
という名前のシャードに移動します。 コマンドは移行が完了するまでブロックします。
Tip
シャードの一覧を返すには、 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]}) } }
事前分割の概要については、「 シャーディングされたクラスターで範囲を作成する」を参照してください。
バランサーが移行範囲内の次のドキュメントに進むタイミングを決定するには、 フィールドと
moveChunk
フィールドとともに コマンドを使用します。_secondaryThrottle
writeConcern
バランサーが移行範囲内の次のドキュメントに進むタイミングを決定するには、 フィールドと
moveRange
フィールドとともに コマンドを使用します。secondaryThrottle
writeConcern
詳しくは、 moveChunk
とmoveRange
を参照してください。
Change Streams と孤立したドキュメント
MongoDB 5.3 以降では、範囲の移行 中に、孤立したドキュメントの更新に対して 変更ストリームイベントは生成されません。