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

シャーディングされたクラスターでのチャンクの移行

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

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

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

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

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

移行の調整の詳細については、 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コレクションのチャンクを均等に移行するには、各プレフィックス チャンクをもう 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コマンドを参照してください。

警告

moveChunkコマンドでは、次のエラー メッセージが表示される場合があります。

The collection's metadata lock is already taken.

これは、移行チャンクにアクセスするオープンカーソルが多すぎる場合に発生します。 カーソルが操作を完了するまで待つか、カーソルを手動で閉じます。

戻る

管理