シャードを削除するには、シャードのデータがクラスター内の残りのシャードに移行されていることを確認する必要があります。 この手順では、データを安全に移行し、シャードを削除する方法について説明します。
このタスクについて
この手順の実行中にコレクションを作成、シャーディング、または移動すると、中断が発生し、予期しない結果につながる恐れがあります。
クラスター全体を新しいハードウェアに移行するには、この手順は使用 しない でください。 移行するには、「自己管理シャードクラスタの異なるハードウェアへの移行 」を参照してください。
チャンクの分布が不均一なクラスター内のシャードを削除すると、バランサーはまずドレイン シャードからチャンクを削除し、次に残りの不均一なチャンクの分布のバランスをとります。
シャードを削除すると、開いている変更ストリームのカーソルが閉じてしまい、閉じた変更ストリームのカーソルが完全に再開できなくなることがあります。
シャード削除プロセス中にクラスターを安全に再起動できます。 ドレインプロセスの実行中にクラスターを再起動すると、クラスター コンポーネントが再起動した後もドレインは自動的に続行されます。 MongoDBは、シャードドレインステータスを
config.shardsコレクションに記録します。
始める前に
この手順では、
sh.moveCollection()メソッドを使用して、削除されたシャードからコレクションを移動します。 この手順を開始する前に、コマンドの動作を理解するためにmoveCollectionの考慮事項と要件を確認してください。シャードを削除するには、まず を使用してクラスターの インスタンスの
mongos1mongoshつに接続します。
注意
複数のシャードを削除する場合は、一度に 1 つずつではなく、同時に削除します。一度に 1 つのシャードを削除すると、バランサーは残りのシャードにデータを排除します。シャードは一度に 1 つのチャンク移行のみに参加できるため、1 つのシャードを削除すると データ移行のスループットが制限されます。
手順
バランサーが有効になっていることを確認します。
シャードからデータを移行するには、バランサープロセスを有効にする必要があります。 バランサーの状態を確認するには、 sh.getBalancerState()メソッドを使用します。
sh.getBalancerState()
操作がtrueを返す場合、バランサーは有効になっています。
この操作でfalseが返される場合は、 「 バランサーを有効にする 」を参照してください。
削除するシャードの名前を決定します。
シャードの名前を見つけるには、 listShardsコマンドを実行します。
db.adminCommand( { listShards: 1 } )
shards._idフィールドにはシャード名が含まれます。
シャードのドレインを開始します。
startShardDrainingコマンドを実行して、シャーディングされたコレクションからクラスター内の他のシャードへのチャンクの移動を開始します。
db.adminCommand( { startShardDraining: "shard04" } )
複数のシャードを排除する必要がある場合は、ドレインプロセスを開始して並行して実行できます。
コレクションを移動します。
でコレクションを作成し、mongos shardCollectionを呼び出しない場合、そのコレクションはシャーディングされないまま、 MongoDB はそれをクラスター内の特定のシャードに完全に保存します。シャードをプライマリとして使用するデータベースは、コレクションもシャードに保存します。
削除するシャードにシャーディングされていないコレクションまたは プライマリデータベースが含まれている場合は、コレクションを別のシャードに移動する必要があります。
削除するシャードにこれらのコレクションが含まれているかどうか、およびドレインステータスを確認するには、 コマンドを実行し、shardDrainingStatus 出力フィールドの配列を確認します。collectionsToMove
db.adminCommand( { shardDrainingStatus: "shard04" } )
{ msg: "draining ongoing", state: "ongoing", remaining: { chunks: Long(2), dbs: Long(2), jumboChunks: Long(0), collectionsToMove: Long(2) }, shard: "shard04", note: "you need to call moveCollection for collectionsToMove and afterwards movePrimary for the dbsToMove", dbsToMove: [ "accounts", ], collectionsToMove: [ "accounts.us-east", "accounts.us-west", "locations.us", ], ok: 1, operationTime: Timestamp(1575399086, 1655), $clusterTime: { clusterTime: Timestamp(1575399086, 1655), signature: { hash: BinData(0,"XBrTmjMMe82fUtVLRm13GBVtRE8="), keyId: Long("6766255701040824328") } } }
collectionsToMoveフィールドで見つかったコレクションは、このシャードに保存されているコレクションです。シャードを削除する前に、まずこれらのコレクションを別のシャードに移動する必要があります。
コレクションを別のシャードに移動するには、moveCollection コマンドを使用します。
db.adminCommand( { moveCollection: "accounts.us-east", toShard: "shard05" } )
プライマリを移動します。
シャーディングされたクラスター は、データベースのプライマリシャードとして機能する特定のシャードを指定します。削除するシャードがプライマリの場合は、それを別のシャードに移動する必要があります。
プライマリを識別するには、shardDrainingStatus コマンドを実行し、dbsToMove 出力フィールドの配列を確認します。
db.adminCommand( { shardDrainingStatus: "shard04" } )
{ msg: "draining ongoing", state: "ongoing", remaining: { chunks: Long(2), dbs: Long(2), jumboChunks: Long(0), collectionsToMove: Long(2) }, shard: "shard04", note: "you need to call moveCollection for collectionsToMove and afterwards movePrimary for the dbsToMove", dbsToMove: [ "accounts", ], collectionsToMove: [ ], ok: 1, operationTime: Timestamp(1575399086, 1655), $clusterTime: { clusterTime: Timestamp(1575399086, 1655), signature: { hash: BinData(0,"XBrTmjMMe82fUtVLRm13GBVtRE8="), keyId: Long("6766255701040824328") } } }
dbsToMoveフィールドに表示されている各データベースは、別のシャードに移動する必要があるデータベースです。
データベース を移動するには、次のようにmovePrimary コマンドを使用します。
db.adminCommand( { movePrimary: "accounts", to: "shard05" })
シャードを削除します。
シャードを削除する前に、ドレイン操作が完了していることを確認してください。
ドレイン操作のステータスを確認するには、shardDrainingStatus コマンドを実行します。
db.adminCommand( { shardDrainingStatus: "shard04" } )
{ "msg" : "draining completed successfully", "state" : "drainingComplete", "ok" : 1, "$clusterTime" : { "clusterTime" : Timestamp(1771839836, 139), "signature" : { "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="), "keyId" : NumberLong(0) } }, "operationTime" : Timestamp(1771839836, 139) }
stateフィールドが削除するシャードの drainingComplete を返すと、ドレインプロセスは完了します。シャードを削除できるようになりました。
シャードを削除するには、commitShardRemoval コマンドを実行します。
db.adminCommand( { commitShardRemoval: "shard04" } )
{ "ok" : 1, "$clusterTime" : { "clusterTime" : Timestamp(1771840037, 12), "signature" : { "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="), "keyId" : NumberLong(0) } }, "operationTime" : Timestamp(1771840037, 12) }
シャードが完全にドレインされていない場合、コマンドはエラーを返します。