シャーディングされたクラスターからシャードを削除する
シャードを削除するには、シャードのデータがクラスター内の残りのシャードに移行されていることを確認する必要があります。 この手順では、データを安全に移行し、シャードを削除する方法について説明します。
このタスクについて
この手順の実行中にコレクションを作成、シャーディング、または移動すると、中断が発生し、予期しない結果につながる恐れがあります。
クラスター全体を新しいハードウェアに移行するには、この手順は使用 しない でください。 移行するには、「自己管理シャードクラスタの異なるハードウェアへの移行 」を参照してください。
チャンクの分布が不均一なクラスター内のシャードを削除すると、バランサーはまずドレイン シャードからチャンクを削除し、次に残りの不均一なチャンクの分布のバランスをとります。
シャードを削除すると、開いている変更ストリームのカーソルが閉じてしまい、閉じた変更ストリームのカーソルが完全に再開できなくなることがあります。
シャード削除プロセス中にクラスターを安全に再起動できます。 ドレインプロセスの実行中にクラスターを再起動すると、クラスター コンポーネントが再起動した後もドレインは自動的に続行されます。 MongoDBは、シャードドレインステータスを
config.shards
コレクションに記録します。
始める前に
この手順では、
sh.moveCollection()
メソッドを使用して、削除されたシャードからコレクションを移動します。 この手順を開始する前に、コマンドの動作を理解するためにmoveCollection
の考慮事項と要件を確認してください。シャードを削除するには、まず を使用してクラスターの インスタンスの
mongos
1mongosh
つに接続します。
手順
バランサーが有効になっていることを確認します
シャードからデータを移行するには、バランサープロセスを有効にする必要があります。 バランサーの状態を確認するには、 sh.getBalancerState()
メソッドを使用します。
sh.getBalancerState()
操作がtrue
を返す場合、バランサーは有効になっています。
この操作でfalse
が返される場合は、 「 バランサーを有効にする 」を参照してください。
削除するシャードの名前を決定します
シャードの名前を見つけるには、 listShards
コマンドを実行します。
db.adminCommand( { listShards: 1 } )
shards._id
フィールドにはシャード名が含まれます。
シャードからチャンクを削除する
削除するシャードのremoveShard
コマンドを実行します。
db.adminCommand( { removeShard: "<shardName>" } )
注意
"majority"
は、mongos
コマンドの書込み保証( writeremoveShard
concern )を に変換します。
removeShard
操作は以下を返します。
{ "msg" : "draining started successfully", "state" : "started", "shard" : "<shardName>", "note" : "you need to drop or movePrimary these databases", "dbsToMove" : [ "db1", "db2" ], "ok" : 1, "operationTime" : Timestamp(1575398919, 2), "$clusterTime" : { "clusterTime" : Timestamp(1575398919, 2), "signature" : { "hash" : BinData(0,"Oi68poWCFCA7b9kyhIcg+TzaGiA="), "keyId" : NumberLong("6766255701040824328") } } }
シャードはdraining
状態になり、バランサーは削除されたシャードからクラスター内の他のシャードへのチャンクの移行を開始します。 これらの移行はクラスター全体への重大な影響を回避するために、低速で行われます。 ネットワークキャパシティーとデータ量に応じて、この操作が完了するまでに数分から数日かかる場合があります。
Tip
シャードがdraining
状態の間、 reshardCollectionコマンドを使用して、削除されたシャードからデータを再配布できます。
reshardCollection
を使用してデータを移動すると、バランサーがチャンクを移行するのを待つよりも高速になる可能性があります。 このクラスターにより、ドレインシャードにデータが配置されないことが保証されます。 moveCollection
とreshardCollection
の操作を同時に実行することはできません。
シャーディングされたコレクションの名前空間を一覧表示する
シャーディングされたシャーディングされたコレクションの名前空間のリストを返すには、 $shardedDataDistribution
ステージを使用してns
フィールドをプロジェクトします。
use admin db.aggregate( [ { $shardedDataDistribution: { } }, { $project: { ns: 1 } } ] )
このチュートリアルの後半で参照するために出力を記録します。
シャードからコレクションを移動する
admin と config を除くクラスター内の各データベースに対して、次の手順を実行します。
データベースコレクションの一覧表示
データベースのコレクションを一覧表示して、次のタイプのコレクションを省略します。
CSFLE をサポートする内部コレクション
システム コレクション
時系列コレクション
ビュー
use <databaseName> db.getCollectionInfos( { $and: [ { type: { $nin: [ "view", "timeseries" ] } }, { name: { $not: { $regex: "^system\." } } }, { name: { $not: { $regex: "^enxcol_\..*(\.esc|\.ecc|\.ecoc|\.ecoc\.compact)$" } } } ] }, { nameOnly: true } )
必要なコレクションの移動
getCollectionInfos()
によって返されるコレクションごとに、次の手順を実行します。
注意
一度に進行できるmoveCollection
操作は 1 つだけです。 次のコレクションに移動する前に、すべてのサブステップを完了します。
コレクションを移動する必要があるかどうかを判断してください。
$collStats
集計ステージを実行し、 フィールドとns
shard
フィールドをプロジェクトします。db.<collName>.aggregate( [ { $collStats: { } }, { $project: { ns: 1, shard: 1 } } ] ) 次のいずれかの条件に一致する場合は、コレクションをスキップし、データベース内の次のコレクションのステップ
a
に戻ります。ns
フィールドは、ステップ4の$shardedDataDistribution
出力に存在します。shard
フィールドは、削除されるシャードではありません。
前述の条件のいずれも満たされていない場合は、現在のコレクションに対してステップ
b
を続行します。コレクションを移動します。
コレクション を移動するには、コレクションで
sh.moveCollection()
を実行しコレクション。sh.moveCollection( "<namespace>.<collection>", "<ID of recipient shard>" ) 注意
moveCollection
シャーディングされた名前空間でコマンドを実行すると、 は失敗します。 このエラー メッセージが表示された場合は、無視し、次のコレクションのステップa
に戻ります。データベース内の各コレクションに対してステップ
a
に戻ります。
プライマリシャードの変更
db.printShardingStatus()
メソッドを実行します。
db.printShardingStatus()
コマンド出力のdatabases
セクションで、 database.primary
フィールドを確認します。 primary
フィールドが削除されたシャードである場合は、そのデータベースのプライマリを別のシャードに移動する必要があります。
データベースのプライマリシャードを変更するには、 movePrimary
コマンドを実行します。
警告
movePrimary
を実行すると、 Move collections off of the shardステップで移動されなかったコレクションは、 movePrimary
プロセスでは使用できなくなります。
db.adminCommand( { movePrimary: <dbName>, to: <shardName> } )
移行ステータスの確認
移行の進行状況を確認するには、 admin
データベースからremoveShard
を再度実行します。
db.adminCommand( { removeShard: "<shardName>" } )
出力では、 remaining
フィールドには次のフィールドが含まれます。
フィールド | 説明 |
---|---|
chunks | 現在シャードに残っているチャンクの数 |
dbs | プライマリシャードがシャードであるデータベースの数。 これらのデータベースは dbsToMove の出力フィールドで指定されます。 |
jumboChunks |
|
残りのチャンク数が0になるまで、 removeShard
コマンドのステータスを確認し続けます。
db.adminCommand( { removeShard: "<shardName>" } )
シャード削除を終了します
シャード削除プロセスを終了するには、 removeShard
コマンドを再実行します。
db.adminCommand( { removeShard: <shardName> } )
注意
DDL 操作
クラスターが DDL操作( reshardCollection
などのコレクションを変更する操作)を実行しているときにシャードを削除すると、同時 DDL操作が完了した後にremoveShard
操作が実行されます。
シャードが削除されている場合、コマンド出力は次のようになります。
{ msg: 'removeshard completed successfully', state: 'completed', shard: '<shardName>', ok: 1, '$clusterTime': { clusterTime: Timestamp({ t: 1721941519, i: 7 }), signature: { hash: Binary.createFromBase64('AAAAAAAAAAAAAAAAAAAAAAAAAAA=', 0), keyId: Long('0') } }, operationTime: Timestamp({ t: 1721941519, i: 7 }) }