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

既存のシャーディングされたクラスターからシャードを削除する

項目一覧

  • Considerations
  • バランサー プロセスが有効になっていることを確認
  • 削除するシャードの名前を決定する
  • シャードからチャンクを削除する
  • 移行のステータスを確認する
  • データベースを別のプライマリ シャードに移動
  • 移行を終了する

シャードを削除するには、シャードのデータがクラスター内の残りのシャードに移行されていることを確認する必要があります。 この手順では、データを安全に移行する方法と、シャードを削除する方法について説明します。

チャンクの分布が不均一なクラスター内のシャードを削除すると、バランサーはまずドレイン シャードからチャンクを削除し、次に残りの不均一なチャンクの分布のバランスをとります。

この手順では、クラスターからシャードを削除する方法について説明します。 クラスター全体を新しいハードウェアに移行するには、この手順は使用しないでください。 移行するには、代わりに「自己管理型シャーディングされたクラスターを異なるハードウェアに移行する 」を参照してください。

シャードを削除するには、まず を使用してクラスターの インスタンスのmongos 1mongosh つに接続します。このドキュメントに記載されている一連のタスクを使用して、クラスターからシャードを削除します。

  • シャードを削除すると、開いている変更ストリームのカーソルが閉じてしまい、閉じた変更ストリームのカーソルが完全に再開できなくなることがあります。

  • シャード削除プロセス中にクラスターを安全に再起動できます。 ドレインプロセスの実行中にクラスターを再起動すると、クラスター コンポーネントが再起動した後もドレイン は自動的に続行されます。 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フィールドには次のフィールドが含まれます。

フィールド
説明

chunks

現在シャードに残っているチャンクの合計数。

dbs

プライマリ シャードがシャードであるデータベースの合計数。 これらのデータベースはdbsToMove出力フィールドで指定されます。

jumboChunks

chunksの合計数のうち、ジャンボである数値。

jumboChunksが 0 より大きい場合は、 jumboChunksのみがシャード上に残るまで待ちます。 jumboチャンクのみが残ったら、ドレイン が完了する前に ジャンボ フラグを手動でクリアする必要があります。 「 jumboフラグのクリア 」を参照してください。

jumboフラグがクリアされると、バランサーはこれらのチャンクを移行できます。 移行手順の詳細については、「範囲の移行手順 」を参照してください。

残りのチャンク数が0になるまで、 removeShardコマンドのステータスをチェックし続けます。

db.adminCommand( { removeShard: "mongodb0" } )

シャードがクラスター内の 1 つ以上のデータベースのプライマリ シャードである場合は、そのデータベースがプライマリ シャードとして別のシャードを使用するようにする必要があります。 removeShardでは、移動する必要があるデータベースがコマンド出力のdbsToMoveフィールドに一覧表示されます。 シャードがどのデータベースのプライマリシャードでもない場合は、次のタスク「 移行の完了 」に進んでください。

データベースを別のシャードに移動するには、 movePrimaryコマンドを使用します。

重要

スムーズな移行を実現するには、 を実行する前に、 コマンドドキュメントの movePrimary考慮事項movePrimary を参照してください

fizzデータベースをmongodb0からmongodb1に移行するには、次のコマンドを発行します。

db.adminCommand( { movePrimary: "fizz", to: "mongodb1" })

mongosmovePrimary に対して"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シャードを構成する インスタンスを安全に停止できます。

戻る

シャードへのノードの追加