シャードを削除するには、シャードのデータがクラスター内の残りのシャードに移行されていることを確認する必要があります。 この手順では、データを安全に移行し、シャードを削除する方法について説明します。
このタスクについて
この手順の実行中にコレクションを作成、シャーディング、または移動すると、中断が発生し、予期しない結果につながる恐れがあります。
クラスター全体を新しいハードウェアに移行するには、この手順は使用 しない でください。 移行するには、「自己管理シャードクラスタの異なるハードウェアへの移行 」を参照してください。
チャンクの分布が不均一なクラスター内のシャードを削除すると、バランサーはまずドレイン シャードからチャンクを削除し、次に残りの不均一なチャンクの分布のバランスをとります。
シャードを削除すると、開いている変更ストリームのカーソルが閉じてしまい、閉じた変更ストリームのカーソルが完全に再開できなくなることがあります。
シャード削除プロセス中にクラスターを安全に再起動できます。 ドレインプロセスの実行中にクラスターを再起動すると、クラスター コンポーネントが再起動した後もドレインは自動的に続行されます。 MongoDBは、シャードドレインステータスを
config.shards
コレクションに記録します。
始める前に
この手順では、
sh.moveCollection()
メソッドを使用して、削除されたシャードからコレクションを移動します。 この手順を開始する前に、コマンドの動作を理解するためにmoveCollection
の考慮事項と要件を確認してください。シャードを削除するには、まず を使用してクラスターの インスタンスの
mongos
1mongosh
つに接続します。
注意
複数のシャードを削除する場合は、一度に 1 つずつではなく、同時に削除します。一度に 1 つのシャードを削除すると、バランサーは残りのシャードにデータを排除します。シャードは一度に 1 つのチャンク移行のみに参加できるため、1 つのシャードを削除すると データ移行のスループットが制限されます。
手順
バランサーが有効になっていることを確認します
シャードからデータを移行するには、バランサープロセスを有効にする必要があります。 バランサーの状態を確認するには、 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 call moveCollection for collectionsToMove and afterwards movePrimary for the dbsToMove", "dbsToMove" : [ "db1", "db2" ], collectionsToMove: ["db1.collA"] "ok" : 1, "operationTime" : Timestamp(1575398919, 2), "$clusterTime" : { "clusterTime" : Timestamp(1575398919, 2), "signature" : { "hash" : BinData(0,"Oi68poWCFCA7b9kyhIcg+TzaGiA="), "keyId" : Long("6766255701040824328") } }
シャードはdraining
状態になり、バランサーは削除されたシャードからクラスター内の他のシャードへのチャンクの移行を開始します。 これらの移行はクラスター全体への重大な影響を回避するために、低速で行われます。 ネットワークキャパシティーとデータ量に応じて、この操作が完了するまでに数分から数日かかる場合があります。
Tip
シャードがdraining
状態の間、 reshardCollectionコマンドを使用して、削除されたシャードからデータを再配布できます。
reshardCollection
を使用してデータを移動すると、バランサーがチャンクを移行するのを待つよりも高速になる可能性があります。 このクラスターにより、ドレインシャードにデータが配置されないことが保証されます。 moveCollection
とreshardCollection
の操作を同時に実行することはできません。
完全な手順については、シャードを追加および削除するための再シャーディング を参照してください。
シャーディングされていないコレクションを別のシャードに移動する
どのコレクションを移動する必要があるかを決定する
シャード上のシャーディングされていないコレクションを一覧表示するには、集計ステージ
$listClusterCatalog
を使用します。use admin db.aggregate([ { $listClusterCatalog: { shards: true } }, { $match: { $and: [ { sharded: false }, { shards: '<shard_to_remove>' }, { type: { $nin: ["timeseries","view"] } }, { ns: { $not: { $regex: "^enxcol_\..*(\.esc|\.ecc|\.ecoc|\.ecoc\.compact)$" }}}, { $or: [{ns: {$not: { $regex: "\.system\." }}}, {ns: {$regex: "\.system\.buckets\."}}]}, { db: { $ne: 'config' } }, { db: { $ne: 'admin' } } ]}}, { $project: { _id: 0, ns: { $cond: [ "$options.timeseries", { $replaceAll: { input: "$ns", find: ".system.buckets", replacement: "" } }, "$ns" ] } }} ]) コレクションを 1 つずつ移動します
コレクションを移動するには、
sh.moveCollection()
を実行します。sh.moveCollection( "<database>.<collection>", "<ID of recipient shard>" ) 注意
moveCollection
シャーディングされた名前空間でコマンドを実行すると、 は失敗します。 このエラー メッセージが表示された場合は、無視し、次のコレクションのステップ1
に戻ります。ステップ
1
に戻り、ドレインシャードにシャーディングされていないコレクションが残っていないことを確認します。
プライマリシャードの変更
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
フィールドには次のフィールドが含まれます。
フィールド | 説明 |
---|---|
| 現在シャードに残っているチャンクの数 |
| プライマリシャードがシャードであるデータベースの数。 これらのデータベースは |
|
|
残りのチャンク数が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 }) }