シャーディングされたクラスターでのチャンクの移行
ほとんどの場合は、自動 バランサー が シャード 間で チャンク を移行できるようにする必要があります。ただし、次のような場合に、チャンクを手動で移行する必要がある場合があります。
空のコレクションを事前に分割する場合は、 チャンク を手動で移行して、シャード全体に均等に分散します。 一括データの取り込みをサポートするために、限られた状況で事前分割を使用します。
アクティブなクラスターの バランサー がバランシング ウィンドウ内でチャンクを分散できない場合は、チャンクを手動で移行する必要があります。
範囲を手動で移行するには、 moveChunk
コマンドを使用します。
オートバランサーがシャード間で範囲を移動する方法の詳細については、「クラスター バランサー 」を参照してください。
移行の調整の詳細については、 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
コレクションのチャンクを均等に移行するには、各プレフィックス チャンクをもう 1 つのシャードに配置し、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
パラメーターがあります。 詳しくは、 moveChunk
コマンドを参照してください。