このトピックでは、compact
コマンドを実行してApsaraDB for MongoDBインスタンスのディスクをデフラグメントし、ディスク使用率を高める方法について説明します。 ディスクフラグメントは、多数のデータ挿入および更新操作またはデータ削除のために生成されます。 このコマンドは、インスタンス内のプライマリノードとセカンダリノードのディスクのデフラグに使用されます。
ApsaraDB for MongoDBコンソールに表示されるストレージ分析機能を使用して、インスタンスのディスクの最適化を行うことを推奨します。 これにより、最適化が簡素化され、ビジネスへの影響が最小限に抑えられます。 この機能では、インスタンス内の隠しノードのディスクの最適化のみを行うことができます。 インスタンス内のプライマリノードとセカンダリノードのディスクを最適化するには、プライマリ /セカンダリスイッチオーバーを実行します。 詳細については、「ストレージ分析」をご参照ください。
前提条件
インスタンスのストレージエンジンは WiredTigerです。
背景情報
インスタンスからデータが削除されると、削除されたデータが使用するストレージは空きストレージとしてマークされます。 新たに書き込まれたデータは、フリーストレージに直接格納されてもよいし、ファイルのストレージが拡張された後にファイルの最後に格納されてもよい。 その結果、空きストレージの一部は使用されない。 このような未使用のフリーストレージはディスクフラグメントを構成します。 ディスクフラグメントが増えると、ディスク使用率が低下します。
db.ru nCommand({collStats: <collection_name>})
コマンドを実行して、ノードにアクセスし、指定したコレクションのストレージを表示できます。 上記のコマンドの一部のキーワード:size
: コレクションの論理ストレージサイズ。storageSize
: コレクションの物理ストレージサイズ。freeStorageSize
: デフラグできる空きストレージのサイズ。 このキーワードは、MongoDB 4.4以降を実行するインスタンスにのみ必要です。
remove
コマンドを実行してドキュメントを削除すると、size
の値が小さくなります。 ただし、storageSize
値は必ずしも小さくなるとは限らない。 この場合、freeStorageSize
値をstorageSize
値で割った数値を表示できます。 高い数値は、高い最適化率を示します。
size
、storageSize
、およびfreeStorageSize
キーワードの詳細については、「collStats-Output」をご参照ください。
compact
コマンドは、ApsaraDB for MongoDBのインスタンスのディスクの最適化に使用します。compact
コマンドの詳細については、「compact」をご参照ください。
使用上の注意
データバックアップ: インスタンスのディスクを最適化する前に、インスタンスデータをバックアップすることを推奨します。 詳細については、「インスタンスの手動バックアップの設定」をご参照ください。
Imacts of the
compact
command:読み取り /書き込み操作のブロックとパフォーマンスの低下
MongoDB 4.4より前のバージョンのMongoDBを実行しているインスタンスで
compact
コマンドを実行すると、指定されたコレクションが属するデータベースがロックされ、データベースで実行される読み取り /書き込み操作がブロックされます。 オフピーク時にこの操作を実行するか、インスタンスをMongoDB 4.4以降にアップグレードすることを推奨します。 インスタンスのバージョンをアップグレードする方法の詳細については、「インスタンスのメジャーバージョンのアップグレード」をご参照ください。 ブロッキングの動作の詳細については、「ブロッキング」をご参照ください。MongoDB 4.4以降を実行するインスタンスで
compact
コマンドを実行する場合、インスタンスで実行される読み取り /書き込み操作はブロックされません。 ただし、インスタンスのパフォーマンスが低下する可能性があります。 オフピーク時にこの操作を行うことを推奨します。
ノードの再構築
MongoDB 3.4.x、MongoDB 4.0.x、MongoDB 4.0.22以前、またはMongoDB 5.0.6以前を実行しているインスタンスでは、
compact
コマンドが実行されているノードがRECOVERING状態になります。 ノードが長期間この状態のままである場合、そのノードは、インスタンス検出コンポーネントによって異常なノードとして識別される。 これにより、再構築操作がトリガーされます。 詳細については、「セカンダリノードのバージョン固有の考慮事項」をご参照ください。 MongoDBのバージョンの詳細については、「ApsaraDB For MongoDBのマイナーバージョン」をご参照ください。前のバージョンより後のバージョンのMongoDBを実行するインスタンスでは、
compact
コマンドが実行されているノードはSECONDARY状態のままです。 これは再構築操作をトリガーしません。
compact
コマンドの無効な実行をします。次のシナリオでは、
compact
コマンドを実行できません。 詳細については、「オープンソースコード」をご参照ください。物理コレクションのサイズは1 MB未満です。
ファイルストレージの最初の80% のうち、空きストレージは20% 未満です。 ファイルストレージの最初の90% のうち、空きストレージは10% 未満です。
デフラグ期間:
compact
コマンドを実行してインスタンスのディスクをデフラグするのに必要な時間は、コレクション内のデータ量やシステム負荷などの要因によって異なります。その他:
compact
コマンドを実行すると、インスタンスの解放されたストレージが空きストレージよりも小さくなる可能性があります。 この場合,compact
コマンドの実行が完了したあと, 次の実行が開始されるようにしてください。 これにより、頻繁に繰り返される実行が回避されます。compact
コマンドは、ディスクストレージがいっぱいになったためにインスタンスがロックされたときに実行できます。
デフラグするディスクストレージの見積もり
mongoシェルを使用してインスタンスに接続します。 ビジネスへの影響を軽減するために、レプリカセットインスタンスのセカンダリノードに接続することを推奨します。 接続方法は、インスタンスアーキテクチャによって異なります。 詳細については、以下のトピックを参照してください。
指定したコレクションが格納されているデータベースに切り替えます。
構文:
use <database_name>
上記のコマンドのパラメーター:
<database_name>
: コレクションが属するデータベースの名前。説明show dbs
コマンドを実行して、現在のデータベースの名前を照会できます。例:
test_databaseデータベースに切り替えます。
use test_database
コレクション用にデフラグするディスクストレージを表示します。
構文:
db.<collection_name>.stats().wiredTiger["block-manager"]["file bytes available for reuse"]
次のコマンドのパラメーター:
<collection_name>
コレクションの名前。説明show tables
コマンドを実行して、現在のコレクションの名前を照会できます。例:
db.test_database_collection.stats().wiredTiger["block-manager"]["file bytes available for reuse"]
次の結果が返されます。
207806464
この結果は、デフラグされる推定ディスクストレージが207,806,464バイトであることを示しています。
スタンドアロンまたはレプリカセットインスタンスのディスクのデフラグメント
スタンドアロンインスタンスのノードは 1 つです。 プライマリノードに接続し、
compact
コマンドを実行してプライマリノードのディスクを最適化できます。レプリカセットインスタンスには複数のノードがあります。 インスタンス内のプライマリノードとセカンダリノードのディスクを最適化する必要があります。 ビジネスへの影響を軽減するために、インスタンス内のセカンダリノードのディスクを最適化し、プライマリ /セカンダリの切り替えを実行してプライマリノードをセカンダリノードに切り替えてから、新しいセカンダリノードのディスクを最適化することを推奨します。 プライマリ /セカンダリスイッチオーバーを実行する方法の詳細については、「レプリカセットインスタンスのプライマリ /セカンダリスイッチオーバーの設定」をご参照ください。
説明レプリカセットインスタンスに読み取り専用ノードがある場合、プライマリノードとセカンダリノードのディスクをデフラグする方法と同様の方法を使用して、ノードのディスクをデフラグする必要があります。
mongo shellを使用して、スタンドアロンまたはレプリカセットインスタンスに接続します。 接続方法は、インスタンスアーキテクチャによって異なります。 詳細については、以下のトピックを参照してください。
指定されたコレクションが格納されているデータベースに切り替えます。
構文:
use <database_name>
上記のコマンドのパラメーター:
<database_name>
: コレクションが属するデータベースの名前。説明show dbs
コマンドを実行して、現在のデータベースの名前を照会できます。例:
replica_databaseデータベースに切り替えます。
use replica_database
デフラグ前にデータベースが占有しているディスクストレージを表示します。
db.stats()
説明このコマンドは変更なしで使用できます。
コレクションのディスクをデフラグメントします。
構文:
db.runCommand({compact:"<collection_name>",force:true})
上記のコマンドのパラメータ:
<collection_name>
: コレクションの名前。説明show tables
コマンドを実行して、現在のコレクションの名前を照会できます。force
: オプション。 値を true に設定します。このパラメーターは、MongoDB 4.2以前を実行するインスタンスのプライマリノードでコマンドを実行する場合に必要です。
例:
db.runCommand({compact:"sharded_collection"})
次の応答が返されます。
{ "ok" : 1 }
デフラグ後にデータベースが占有しているディスクストレージを表示します。
db.stats()
説明このコマンドは変更なしで使用できます。
シャードクラスタインスタンスのディスクのデフラグメント
シャードクラスターインスタンスの場合、インスタンス内のシャードコンポーネントのディスクを最適化するだけで済みます。 インスタンス内のmongosおよびConfigServerコンポーネントは、ユーザーデータを保存しません。 加えて、より多くの追加および更新動作およびより少ない削除動作が実行されます。 したがって、mongosおよびConfigServerコンポーネントのディスクを最適化する必要はありません。
compact
コマンドはインスタンスの読み取り専用ノードではサポートされていません。したがって、読み取り専用ノードのディスクはデフラグできません。
mongoシェルを使用してインスタンスに接続します。 詳細については、「mongo shellを使用したシャードクラスターインスタンスへの接続」をご参照ください。
指定したコレクションが格納されているデータベースに切り替えます。
構文:
use <database_name>
上記のコマンドのパラメーター:
<database_name>
: コレクションが属するデータベースの名前。説明show dbs
コマンドを実行して、現在のデータベースの名前を照会できます。例:
sharded_databaseデータベースに切り替えます。
use sharded_database
デフラグ前にデータベースが占有しているディスクストレージを表示します。
db.stats()
説明このコマンドは変更なしで使用できます。
コレクションのディスクをデフラグメントします。
インスタンスのシャードコンポーネントのプライマリノードとセカンダリノードのディスクを最適化する必要があります。 ビジネスへの影響を軽減するために、コンポーネント内のセカンダリノードのディスクを最適化し、プライマリ /セカンダリの切り替えを実行してプライマリノードをセカンダリノードに切り替えてから、新しいセカンダリノードのディスクを最適化することを推奨します。 プライマリ /セカンダリスイッチオーバーを実行する方法の詳細については、「シャードクラスターインスタンスのプライマリ /セカンダリスイッチオーバーの設定」をご参照ください。
シャードコンポーネントのプライマリノードのディスクをデフラグメントします。
構文:
db.runCommand({runCommandOnShard:"<Shard ID>","command":{compact:"<collection_name>",force:true}})
上記のコマンドのパラメータ:
<Shard ID>
: シャードコンポーネントのID。説明ApsaraDB for MongoDBコンソールにログインし、[基本情報] ページの [シャードリスト] セクションでシャードコンポーネントのIDを表示できます。
<collection_name>
: コレクションの名前。説明show tables
コマンドを実行して、現在のコレクションの名前を照会できます。force
: オプション。 値を true に設定します。このパラメーターは、MongoDB 4.2以前を実行するシャードクラスターインスタンスでコマンドを実行する場合に必要です。
例:
db.runCommand({runCommandOnShard:"shard01","command":{compact:"sharded_collection",force:true}})
シャードコンポーネント内のセカンダリノードのディスクをデフラグメントします。
この操作は、mongoshとは異なる方法でmongo shellで実行されます。 クライアントに合った操作を選択します。
モンゴシェル
構文:
db.runCommand({runCommandOnShard:"<Shard ID>","command":{compact:"<collection_name>"},$queryOptions: {$readPreference: {mode: 'secondary'}}})
上記のコマンドのパラメータ:
<Shard ID>
: シャードコンポーネントのID。説明ApsaraDB for MongoDBコンソールにログインし、[基本情報] ページの [シャードリスト] セクションでシャードコンポーネントのIDを表示できます。
<collection_name>
: コレクションの名前。説明show tables
コマンドを実行して、現在のコレクションの名前を照会できます。
例:
db.runCommand({runCommandOnShard:"shard01","command":{compact:"sharded_collection"},$queryOptions: {$readPreference: {mode: 'secondary'}}})
モンゴッシュ
説明runCommandOnShardコマンドは、v2.xのmongoshではサポートされていません。 このコマンドをmongosh v1.xで実行します。
構文:
db.getMongo().setReadPref('secondary') db.runCommand({runCommandOnShard:"<Shard ID>","command":{compact:"<collection_name>"}})
上記のコマンドのパラメータ:
<Shard ID>
: シャードコンポーネントのID。説明ApsaraDB for MongoDBコンソールにログインし、[基本情報] ページの [シャードリスト] セクションでシャードコンポーネントのIDを表示できます。
<collection_name>
: コレクションの名前。説明show tables
コマンドを実行して、現在のコレクションの名前を照会できます。
例:
db.getMongo().setReadPref('secondary') db.runCommand({runCommandOnShard:"d-2ze91ae9d55d6604","command":{compact:"test"}})
デフラグ後にデータベースが占有しているディスクストレージを表示します。
db.stats()
説明このコマンドは変更なしで使用できます。