ディスク領域使用率は、ApsaraDB for MongoDB インスタンスにとって重要なメトリックです。インスタンスのディスク領域が枯渇すると、インスタンスは利用できなくなります。ディスク領域の使用状況を確認し、使用率が高くなる原因を特定して、最適化戦略を適用する方法について説明します。
背景情報
ディスク領域使用率が 80 % 以上になった場合は、データベースの実際の領域消費量を削減するか、ストレージ容量を拡張して、インスタンスが満杯になるのを防いでください。
領域使用状況の確認
レプリカセットアーキテクチャ
ApsaraDB for MongoDB インスタンスがレプリカセットアーキテクチャを使用している場合、ApsaraDB for MongoDB コンソール にログインし、以下の方法で領域使用状況を確認できます。
-
概要
基本情報 ページの Specification Information セクションで、インスタンスの ディスク容量 と 使用率 を確認します。
-
モニタリングチャート分析
左側のナビゲーションウィンドウで、Monitoring Information をクリックします。対象ノードを選択して、その ディスク使用率 (バイト) および ディスク使用率 (%) を表示します。
ApsaraDB for MongoDB のレプリカセットインスタンスは、読み取り・書き込み操作用のプライマリノード、高可用性のための 1 つ以上のセカンダリノード、非表示ノード、およびオプションの読み取り専用ノードで構成されます。各ノードの領域使用量は
data_sizeとlog_sizeで構成され、ins_size = data_size + log_sizeとなります。-
data_size:データが使用するディスク領域(localデータベースを除く)。これには、データファイル(collectionで始まる)、インデックスファイル(indexで始まる)、およびWiredTiger.wtなどのメタデータファイルが含まれます。 -
log_size:localデータベースの物理サイズ、MongoDB ランタイムログのサイズ、および一部の監査ログのサイズ。
-
-
詳細分析
領域使用状況を詳細に分析するには、以下の方法を使用します。
-
MongoDB のネイティブコマンド
db.stats()およびdb.$collection_name.stats()を使用します。これらのコマンドの詳細については、以下の MongoDB ドキュメントをご参照ください。
-
ページを使用します。
ページでは、以下の情報を確認できます。
-
データベースおよびコレクションの領域使用状況の概要、平均日次増加量、およびストレージが満杯になるまでの予測日数。
-
異常なデータベースおよびテーブルの領域使用状況。
-
ビジネスコレクションの詳細な領域使用状況(インデックスファイルサイズ、データファイルサイズ、圧縮率分析、平均ドキュメントサイズを含む)。
-
-
シャードクラスターアーキテクチャ
ApsaraDB for MongoDB インスタンスがシャードクラスターアーキテクチャを使用している場合、ApsaraDB for MongoDB コンソール にログインし、以下の方法で領域使用状況を確認できます。
-
モニタリングチャート分析
Monitoring Information ページで、対象ノードを選択して、その ディスク使用率 (バイト) および ディスク使用率 (%) を表示します。
-
詳細分析
MongoDB のネイティブコマンド
db.stats()およびdb.$collection_name.stats()を使用して、各ノードの領域使用状況を順次分析します。
データの断片化による領域使用率の増加
コンパクション中のインスタンスへの影響
compact 操作は、その持続時間がコレクションサイズに比例するため、時間がかかることがあります。読み取り・書き込み操作への影響を避けるため、compact はピーク時以外の時間帯に実行してください。
compact メソッド
ビジネスへの影響を最小限に抑えるため、まずセカンダリノードで db.runCommand({compact:"collectionName"}) コマンドを実行し、その後プライマリ/セカンダリ スイッチオーバーを実施します。collectionName は、ご利用のコレクション名に置き換えてください。
compact コマンドの使用方法の詳細については、「ディスクの最適化によるディスク使用率の改善」をご参照ください。
大規模なログによる領域使用量の増加
ジャーナルログの肥大化による領域ギャップ
ApsaraDB for MongoDB 4.0 より前のバージョンでは、ホストマシン上のオープンファイル数が上限に達すると、内部ログサーバーのクリーンアップスレッドが中断され、ジャーナルログが無制限に増加します。MongoDB ランタイムログに以下のようなログエントリが表示される場合は、カーネルを ApsaraDB for MongoDB 4.0 以降にスペックアップしてください。一時的な対処法として、mongod プロセスを再起動することも可能です。詳細については、「log-server thread exit quietly on error while the mongodb process still running」をご参照ください。
2019-08-25T09:45:16.867+0800 I NETWORK [thread1] Listener: accept() returns -1 Too many open files in system
2019-08-25T09:45:17.000+0800 I - [ftdc] Assertion: 13538:couldn't open [/proc/55692/stat] Too many open files in system src/mongo/util/processinfo_linux.cpp 74
2019-08-25T09:45:17.002+0800 W FTDC [ftdc] Uncaught exception in 'Location13538: couldn't open [/proc/55692/stat] Too many open files in system' in full-time diagnostic data capture subsystem. Shutting down the full-time diagnostic data capture subsystem.
レプリケーションラグおよびバックアップによるログの増加
ApsaraDB for MongoDB インスタンスでレプリケーションラグが発生すると、oplog の使用可能サイズは設定ファイルで定義された固定サイズコレクションによって制限されなくなります。理論的には、プロビジョニングされたディスク容量の 20 % まで増加することがあります。ラグが解消された後も、oplog が占有していた追加領域は自動的に回収されません。
物理バックアップ中、非表示ノード上の ApsaraDB for MongoDB インスタンスは多数のチェックポイントを生成し、データおよびログ領域をより多く消費します。
いずれのシナリオでも、oplog に対して compact 操作を実行することで問題を解決できます。
compact 操作中は、すべての書き込み操作がブロックされます。
db.grantRolesToUser("root", [{db: "local", role: "dbAdmin"}])
use local
db.runCommand({ compact: "oplog.rs", force: true })
不適切なシャーディングによるデータの不均衡
不適切なシャードキーの種類
シャードクラスターでは、シャードキーの種類の選択が重要です。主な種類はハッシュシャーディングとレンジシャーディングです。ディスクのバランスを取る観点では、ハッシュシャーディングがレンジシャーディングよりも優れた戦略となることが多いです。これは、ApsaraDB for MongoDB が内部ハッシュ関数を使用してキー値に基づいてデータを均等にシャード間で分散させるためです。一方、レンジシャーディングはキー値の範囲に基づいてデータを分散させるため、「ホット」チャンクに新しいデータが集中し、そのシャードでディスク I/O が高くなり、短期的なデータの不均衡が発生する可能性があります。
シャードキーの種類の詳細については、「sharding-shard-key」、「hashed-sharding」、および「ranged-sharding」をご参照ください。
不適切なシャードキーフィールド
各シャード上のチャンク数がほぼ同程度であっても、データの大部分が少数のチャンクに集中している場合があります。その結果、「ホット」チャンクを含むシャードは、他のシャードよりも著しく多くのデータを格納することになります。sh.status() コマンドを実行し、ApsaraDB for MongoDB ランタイムログを確認すると、以下のような警告メッセージが表示されることがあります。
2019-08-27T13:31:22.076+0800 W SHARDING [conn12681919] possible low cardinality key detected in superHotItemPool.haodanku_all - key is { batch: "201908260000" }
2019-08-27T13:31:22.076+0800 W SHARDING [conn12681919] possible low cardinality key detected in superHotItemPool.haodanku_all - key is { batch: "201908260200" }
2019-08-27T13:31:22.076+0800 W SHARDING [conn12681919] possible low cardinality key detected in superHotItemPool.haodanku_all - key is { batch: "201908260230" }
Mongos バランサーは、各シャード上のチャンク数を基準にデータのバランスを判断します。このため、チャンク数はバランスが取れているが、実際のデータ分布が大きく偏っているというシナリオが発生することがあります。これは、チャンク内のシャードキー値がほぼ同一であるために起こります。チャンクが 64 MB の分割しきい値に達すると、MongoDB はそれを分割して空のチャンクを作成します。時間の経過とともに、チャンク数は増加し移行が発生しますが、移行されるチャンクは多くの場合空であるため、チャンク数はバランスが取れていてもデータは不均衡のままになります。これを修正するには、高カーディナリティのフィールドをシャードキーとして使用するようにシャーディングポリシーを再設計してください。
分割の詳細については、「sharding-data-partitioning」および「split-chunks-in-sharded-cluster」をご参照ください。
シャードクラスター内の非シャードデータベース
ApsaraDB for MongoDB のシャードクラスターインスタンスは、シャードおよび非シャードの両方のデータベースをサポートしています。非シャードデータベースのすべてのデータは単一のプライマリシャード上に存在するため、そのデータベースが大規模な場合、そのプライマリシャードは他のシャードよりも著しく多くのデータを格納することになります。
この問題は、ソースの mongos クラスターから新しいクラスターにデータをインポートする際に、インポート前に送信先クラスターでシャーディングを設定し忘れた場合にも発生します。
これらの問題に対処するには、以下の方法を推奨します。
-
送信先クラスターをインポートで初期化する場合は、開始前にシャーディングを設計および有効にしてください。
-
サイズがほぼ同じで多数の非シャードデータベースがある場合は、
movePrimaryコマンドを使用して、特定のデータベースを異なるシャードに移動してください。 -
非常に大規模な非シャードデータベースが存在する場合は、シャーディングを適用するか、スタンドアロンのレプリカセットインスタンスに移行することを推奨します。
-
この状況が発生してもディスク領域に余裕がある場合は、この問題を無視することも可能です。
moveChunk 操作によるディスク使用率の不均衡
moveChunk 操作は、データを送信先シャードに書き込んだ後、ソースシャードから削除します。デフォルトでは、削除操作によってディスク領域は解放されません。WiredTiger エンジンでは、各コレクションに個別のデータファイルおよびインデックスファイルがあり、これらのファイルが削除されない限り、合計ディスク領域は縮小しません。この問題は、シャーディング設計なしで長期間稼働していたクラスターでシャーディングを有効にした場合に最もよく見られます。
したがって、多数の moveChunk 操作またはドキュメント削除操作の後は、影響を受けたシャードで compact 操作を実行して、断片化した領域を回収してください。
moveChunk の詳細については、「migrate-chunks-in-sharded-cluster」および「manage-sharded-cluster-balancer」をご参照ください。