既存のシャーディングされたクラスターからシャードを削除する
項目一覧
シャードを削除するには、シャードのデータがクラスター内の残りのシャードに移行されていることを確認する必要があります。 この手順では、データを安全に移行する方法と、シャードを削除する方法について説明します。
チャンクの分布が不均一なクラスター内のシャードを削除すると、バランサーはまずドレイン シャードからチャンクを削除し、次に残りの不均一なチャンクの分布のバランスをとります。
この手順では、クラスターからシャードを削除する方法について説明します。 クラスター全体を新しいハードウェアに移行するには、この手順は使用しないでください。 移行するには、代わりに「自己管理型シャーディングされたクラスターを異なるハードウェアに移行する 」を参照してください。
シャードを削除するには、まず を使用してクラスターの インスタンスのmongos
1mongosh
つに接続します。このドキュメントに記載されている一連のタスクを使用して、クラスターからシャードを削除します。
Considerations
シャードを削除すると、開いている変更ストリームのカーソルが閉じてしまい、閉じた変更ストリームのカーソルが完全に再開できなくなることがあります。
シャード削除プロセス中にクラスターを安全に再起動できます。 ドレインプロセスの実行中にクラスターを再起動すると、クラスター コンポーネントが再起動した後もドレイン は自動的に続行されます。 MongoDB はシャード ドレイン ステータスを
config.shards
コレクションに記録します。
バランサー プロセスが有効になっていることを確認
シャードから正常にデータを移行するには、バランサープロセスを有効にする必要があります。 sh.getBalancerState()
mongosh
の ヘルパーを使用してバランサーの状態を確認します。詳しくは、「バランサー操作 」のセクションを参照してください。
削除するシャードの名前を決定する
シャードの名前を決定するには、 と次のいずれかを使用してmongos
mongosh
インスタンスに接続します。
次のように、
listShards
コマンドを使用します。db.adminCommand( { listShards: 1 } ) sh.status()
} メソッドまたはdb.printShardingStatus()
メソッドのいずれかを実行します。
shards._id
フィールドには、各シャードの名前が一覧表示されます。
シャードからチャンクを削除する
admin
データベースからremoveShard
コマンドを実行します。 これにより、削除対象のシャードからクラスター内の他のシャードへのチャンクの「ドレイン」が開始されます。 たとえば、 mongodb0
という名前のシャードの場合は、次を実行します。
db.adminCommand( { removeShard: "mongodb0" } )
"majority"
は、mongos
コマンドの書込み保証( writeremoveShard
concern )を に変換します。
この操作は、次の応答を返します。
{ "msg" : "draining started successfully", "state" : "started", "shard" : "mongodb0", "note" : "you need to drop or movePrimary these databases", "dbsToMove" : [ "fiz", "buzz" ], "ok" : 1, "operationTime" : Timestamp(1575398919, 2), "$clusterTime" : { "clusterTime" : Timestamp(1575398919, 2), "signature" : { "hash" : BinData(0,"Oi68poWCFCA7b9kyhIcg+TzaGiA="), "keyId" : NumberLong("6766255701040824328") } } }
バランサーによって、 mongodb0
という名前のシャードからクラスター内の他のシャードへのチャンクの移行が開始されます。 これらの移行は、クラスター全体に不要な負荷がかかるのを避けるために、低速で行われます。 ネットワーク容量とデータ量に応じて、この操作が完了するまでに数分から数日かかる場合があります。
注意
出力には、シャードがプライマリシャードであるデータベース(存在する場合)を示すフィールドdbsToMove
が含まれます。 すべてのチャンクがシャードから空になったら、データベースに対してmovePrimary
を実行するか、代わりにデータベースを削除する必要があります(これにより、関連するデータファイルが削除されます)。
移行のステータスを確認する
プロセスの任意のステージで移行の進行状況を確認するには、 admin
データベースからremoveShard
を再度実行します。 たとえば、 mongodb0
という名前のシャードの場合は、次を実行します。
db.adminCommand( { removeShard: "mongodb0" } )
"majority"
は、mongos
コマンドの書込み保証( writeremoveShard
concern )を に変換します。
このコマンドは、次のような出力を返します。
{ "msg" : "draining ongoing", "state" : "ongoing", "remaining" : { "chunks" : NumberLong(2), "dbs" : NumberLong(2), "jumboChunks" : NumberLong(0) }, "note" : "you need to drop or movePrimary these databases", "dbsToMove" : [ "fizz", "buzz" ], "ok" : 1, "operationTime" : Timestamp(1575399086, 1655), "$clusterTime" : { "clusterTime" : Timestamp(1575399086, 1655), "signature" : { "hash" : BinData(0,"XBrTmjMMe82fUtVLRm13GBVtRE8="), "keyId" : NumberLong("6766255701040824328") } } }
出力では、 remaining
フィールドには次のフィールドが含まれます。
フィールド | 説明 |
---|---|
| 現在シャードに残っているチャンクの合計数。 |
| プライマリ シャードがシャードであるデータベースの合計数。 これらのデータベースは |
|
|
残りのチャンク数が0
になるまで、 removeShard
コマンドのステータスをチェックし続けます。
db.adminCommand( { removeShard: "mongodb0" } )
データベースを別のプライマリ シャードに移動
シャードがクラスター内の 1 つ以上のデータベースのプライマリ シャードである場合は、そのデータベースがプライマリ シャードとして別のシャードを使用するようにする必要があります。 removeShard
では、移動する必要があるデータベースがコマンド出力のdbsToMove
フィールドに一覧表示されます。 シャードがどのデータベースのプライマリシャードでもない場合は、次のタスク「 移行の完了 」に進んでください。
データベースを別のシャードに移動するには、 movePrimary
コマンドを使用します。
重要
スムーズな移行を実現するには、 を実行する前に、 コマンドドキュメントの movePrimary
考慮事項movePrimary
を参照してください
fizz
データベースをmongodb0
からmongodb1
に移行するには、次のコマンドを発行します。
db.adminCommand( { movePrimary: "fizz", to: "mongodb1" })
mongos
は movePrimary
に対して"majority"
書込み保証(write concern) を使用し 。
このコマンドは、MongoDB がすべてのデータの移動を完了するまで返しません。 このコマンドの応答は、次のようになります。
{ "ok" : 1, "operationTime" : Timestamp(1575400369, 9), "$clusterTime" : { "clusterTime" : Timestamp(1575400369, 9), "signature" : { "hash" : BinData(0,"2Nz8QCcVXB0LJLm1hsXfpTCaM0M="), "keyId" : NumberLong("6766255701040824328") } } }
移行を終了する
すべてのメタデータ情報をクリーンアップして削除を確定するには、 removeShard
を再度実行します。 たとえば、 mongodb0
という名前のシャードの場合は、次を実行します。
db.adminCommand( { removeShard: "mongodb0" } )
"majority"
は、mongos
コマンドの書込み保証( writeremoveShard
concern )を に変換します。
完了時に成功メッセージが表示されます。
{ "msg" : "removeshard completed successfully", "state" : "completed", "shard" : "mongodb0", "ok" : 1, "operationTime" : Timestamp(1575400370, 2), "$clusterTime" : { "clusterTime" : Timestamp(1575400370, 2), "signature" : { "hash" : BinData(0,"JjSRciHECXDBXo0e5nJv9mdRG8M="), "keyId" : NumberLong("6766255701040824328") } } }
state
フィールドの値が「完了」したら、 mongodb0
シャードを構成する インスタンスを安全に停止できます。