Docs Menu
Docs Home
/
MongoDBマニュアル
/ /

シャーディングされたクラスターで範囲を移行

項目一覧

  • Change Streams と孤立したドキュメント

ほとんどの場合は、自動バランサーが範囲シャード間で移行するようにする必要があります。 ただし、次のような場合に、範囲を手動で移行することをお勧めします。

  • 空のコレクションを事前に分割する場合は、範囲を手動で移行して、シャード全体に均等に分散します。 一括データの取り込みをサポートするために、限られた状況で事前分割を使用します。

  • アクティブなクラスターのバランサーがバランシング ウィンドウ内で範囲を分散できない場合は、範囲を手動で移行する必要があります。

範囲を手動で移行するには、 moveChunkまたはmoveRangeコマンドを使用します。

オートバランサーが範囲をシャード間で範囲を移動する方法の詳細については、「バランサーの内部範囲の移行 」を参照してください。

移行の調整の詳細については、 chunkMigrationConcurrencyを参照してください。

単一の範囲を移行

次の例では、フィールドusernamemyappデータベース内の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 フィールドとともに コマンドを使用します。_secondaryThrottlewriteConcern

  • バランサーが移行範囲内の次のドキュメントに進むタイミングを決定するには、 フィールドとmoveRange フィールドとともに コマンドを使用します。secondaryThrottlewriteConcern

詳しくは、 moveChunkmoveRangeを参照してください。

MongoDB 5.3 以降では、範囲の移行 中に、孤立したドキュメントの更新に対して 変更ストリームイベントは生成されません。

戻る

管理