ディスク使用量は、ApsaraDB for MongoDBインスタンスを監視するために使用される重要な指標です。 インスタンスのディスク使用量が100% に達すると、インスタンスは使用できなくなります。 このトピックでは、ディスク使用量の詳細を表示し、インスタンスの高ディスク使用量のトラブルシューティングを行う方法について説明します。
背景情報
インスタンスのディスク使用量が80% から85% の範囲を超える場合は、データベースのストレージ使用量を減らすか、ストレージ容量を拡張してディスク使用量が100% に達しないようにすることができます。
ストレージ使用量の表示
レプリカセットインスタンス
次の方法を使用して、ApsaraDB for MongoDBコンソールでレプリカセットインスタンスのディスク使用状況を表示できます。
概要
[基本情報] ページの [仕様情報] セクションで、インスタンスの [ディスク容量] と [使用率] の情報を表示します。
モニタリングチャートを使用した詳細分析
左側のナビゲーションウィンドウで、[モニタリングデータ] をクリックします。 表示されるページで、ノードを指定し、ノードの [ディスク使用量 (バイト)] および [ディスク使用量 (%)] の値を表示します。
レプリカセットインスタンスは、読み取りおよび書き込み操作をサポートするプライマリノード、1つ以上の高可用性セカンダリノード、隠しノード、および1つ以上のオプションの読み取り専用ノードで構成されます。 ノードのディスクはデータとログによって使用され、ディスクのストレージ容量は次の式に基づいて計算できます。ins_size = data_size + log_size。 設定する必要があるパラメータ:
data_sizeは、コレクションで始まる物理データファイル、インデックスで始まる物理インデックスファイル、WiredTiger.wtなどの物理メタデータファイルなどのデータファイルで使用されるディスク領域を示します。 データファイルはローカルデータベースを除外します。
log_sizeは、ローカルデータベース、ランタイムログ、および一部の監査ログによって使用されるディスク領域を示します。
詳細分析
次の方法を使用して、ディスク使用状況の詳細を表示できます。
MongoDBが提供する
db.stats()
およびdb.$collection_name.stats()
コマンドを実行します。を選択し、[ストレージ分析] ページで詳細を表示します。
ストレージ分析ページでは、次の項目を表示できます。
データベースとテーブルのディスク使用量の概要、1日の平均増分、およびストレージの予測利用可能日数
異常なデータベースとテーブルのディスク使用
特定の業務テーブルのディスク使用量の詳細 (インデックスファイルおよびデータファイルで使用されるディスク容量、圧縮率、平均行サイズなど)
シャードクラスタインスタンス
次の方法を使用して、ApsaraDB for MongoDBコンソールでシャードクラスターインスタンスのディスク使用率を表示できます。
モニタリングチャートを使用した詳細分析
インスタンスの [モニタリングデータ] ページで、ノードを選択し、ノードの [ディスク使用量 (バイト)] と [ディスク使用量 (%)] の値を表示します。
コマンドの実行による詳細分析
MongoDBが提供する
db.stats()
およびdb.$collection_name.stats()
コマンドを実行して、各ノードのディスク使用量を分析します。
compactコマンドによる大量データのトラブルシューティング
コンパクトな操作とインスタンスへの影響
compactコマンドの実行期間は、コレクションのデータ量に関連しています。 データ量が多い場合、compactコマンドは長時間実行されます。 そのため、ピーク時以外にcompactコマンドを実行することを推奨します。
コンパクト操作
セカンダリノードでdb.ru nCommand({compact:"collectionName"})
コマンドを実行し、プライマリ /セカンダリの切り替えを実行して、ビジネスへの影響を最小限に抑えます。 collectionName
パラメーターは、コレクション名を示します。 パラメーター値を実際のコレクション名に置き換えます。
MongoDB 4.2以前のバージョンでは、compactコマンドはインスタンスの読み取りおよび書き込み操作をブロックします。 ビジネストラフィックを処理しないセカンダリノードでのみ、compactコマンドを実行することをお勧めします。
MongoDB 4.4以降のバージョンでは、compactコマンドはインスタンスの読み取りおよび書き込み操作をブロックしません。 ただし、プライマリノードでcompactコマンドを実行すると、インスタンスのパフォーマンスが低下する可能性があります。 compactコマンドをセカンダリノードまたは非表示ノードで実行することを推奨します。 プライマリノードでcompactコマンドを実行する場合は、オフピーク時にcompactコマンドを実行することを推奨します。 compactコマンドの詳細については、「compact」、「MongoDBコマンド」、および「ディスクのデフラグメントによるディスク使用率の向上」をご参照ください。
MongoDB 4.4.9より前のバージョンを実行するインスタンスでは、compactコマンドが実行されているノードはRECOVERING状態です。 ノードが長い間この状態のままである場合、そのノードは、インスタンス検出コンポーネントによって、異常なノードとして識別される。 これにより、再構築操作がトリガーされます。 MongoDB 4.4.9以降を実行するインスタンスでは、compactコマンドが実行されているノードはSECONDARY状態のままです。 詳細については、「MongoDBドキュメント」をご参照ください。
インスタンスのメジャーエンジンバージョンが4.4で、インスタンスのマイナーエンジンバージョンが4.4.9以降かどうかを判断できない場合、 チケットを起票し、Alibaba Cloudテクニカルサポートにお問い合わせください。
無効なコンパクト操作
compactコマンドを実行した後、既存のデータを格納するための新しいスペースはすぐには作成されません。 代わりに、既存のデータはフリースペースに連続的に移動されます。 しかしながら、空き領域は、既存のデータを格納するために再利用されない。 次のセクションでは、シナリオとソリューションについて説明します。
compactコマンドを実行すると、コンパクト操作が成功したことを示すプロンプトが表示されます。 ただし、既存の空き領域は使用できません。 この場合、別のレプリカを作成することをお勧めします。
MongoDB 3.4より前のバージョンでは、コンパクト操作はデータファイルに対してのみ有効になり、大量のデータが削除された後はインデックスファイルに対しては有効になりません。 この場合、データベースエンジンのバージョンをMongoDB 3.4以降にアップグレードすることを推奨します。 コンパクト操作がインデックスファイルに対して有効かどうかを確認するには、次のいずれかの操作を実行します。
db.$table_name.stats().indexSizes
コマンドを実行します。物理インデックスファイルのサイズを表示します。
大量のログデータによる高容量使用量のトラブルシューティング
ジャーナルログの数が多いため、プライマリノードとセカンダリノードで使用されるスペースのギャップが大きくなります。
MongoDB 4.0より前のバージョンでは、ホスト上の開いているファイルのサイズが指定された上限に達すると、MongoDBログサーバー上のよりクリーンなスレッドが終了します。 その結果、ジャーナルログのサイズは無限に大きくなります。 次のコードブロックに似たコンテンツがインスタンスのランタイムログに表示される場合は、MongoDBのバージョンを4.0以降にアップグレードするか、mongodプロセスを再起動することで、一時的に問題を解決できます。 詳細については、「mongodbプロセスの実行中にエラーが発生した場合にログサーバースレッドが静かに終了する」をご参照ください。
2019-08-25T09:45:16.867 + 0800ネットワーク [thread1] Listener: accept() returns -1 Too many open files in system
2019-08-25T09:45:17.000 + 0800 I - [ftdc] アサーション: 13538: 開くことができませんでした [/proc/55692/stat] システムsrc/mongo/util/processinfo_linux.cppで開いているファイルが多すぎます74
2019-08-25T09:45:17.002 0800 W FTDC [ftdc] 「Location13538: フルタイムの診断データキャプチャサブシステムで [/proc/55692/stat] システム内の開いているファイルが多すぎる」のキャッチされない例外。 フルタイムの診断データ取得サブシステムをシャットダウンします。
セカンダリノードのレイテンシと増分バックアップにより、セカンダリノードの使用済みログスペースのサイズが継続的に増加する場合があります。
プライマリノードとセカンダリノード間の同期中にレイテンシが発生した場合、oplogの利用可能なスペースは、構成ファイルで定義された固定コレクションサイズによって制限されません。 理論的には、使用可能なスペースは、適用するディスクスペースの20% に達する可能性があります。 しかしながら、セカンダリノード上の待ち時間が経過した後、oplogによって使用される物理的空間は解放されない。
隠しノードでインスタンスの物理バックアップを実行すると、多数のチェックポイントが大量のデータを生成し、大きなログ領域を占有します。
上記のシナリオの問題を解決するには、次のコードに示すようにoplogsに対してコンパクト操作を実行します。
すべての書き込み操作は、コンパクト操作中にブロックされます。
db.grantRolesToUser("root", [{db: "local", role: "dbAdmin"}])
ローカルを使用
db.ru nCommand({ compact: "oplog.rs", force: true })
不合理なシャーディングによる不均一なデータ分布のトラブルシューティング
シャーディングキータイプの不当な選択により、データが不均一に分散されます
シャードクラスタインスタンスでは、適切なシャーディングキーが重要です。 ほとんどの場合、ハッシュシャーディングまたはレンジドシャーディングが使用されます。 ディスクの負荷分散には、レンジドシャーディングよりもハッシュシャーディングの方が適しています。 ハッシュシャーディングは、組み込みのハッシュ関数を使用して、さまざまなキー値に基づいてデータをシャード間で均等に分散します。 レンジドシャーディングは、キー値の範囲に基づいてシャード間でデータを分散するため、データの分散が不均一になります。 データは、ポピュレートされたチャンクに分散される。 これにより、チャンクが配置されているディスクでのI/Oワークロードが高くなり、短期間のデータ分散が不均一になる可能性があります。
シャーディングキーの種類については、「sharding-shard-key」、「hashed-sharding」、および「ranged-sharding」をご参照ください。
シャーディングキーフィールドの不当な選択により、データが不均一に分散されます
各シャードのチャンク数は基本的に同じです。 ただし、ほとんどのデータはいくつかのポピュレートされたチャンクにのみ格納されるため、データ分散が不均一になります。 インスタンスのランタイムログを表示するには、sh.status()
コマンドを実行します。 アラート情報は、出力に表示され得る。 次のコードは、アラート情報の例を示しています。
2019-08-27T13:31:22.076 + 0800 W SHARDING [conn12681919] superHotItemPoolで検出された可能性のある低濃度キー。haodanku_all-キーは {batch: "201908260000"} です
2019-08-27T13:31:22.076 + 0800 W SHARDING [conn12681919] superHotItemPoolで検出された可能性のある低濃度キー。haodanku_all-キーは {batch: "201908260200"} です
2019-08-27T13:31:22.076 + 0800 W SHARDING [conn12681919] superHotItemPoolで検出された可能性のある低濃度キー。haodanku_all-キーは {batch: "201908260230" }
ですMongoDBバランサーは、データ量に関係なく、各シャードのチャンク数を監視します。 この場合、各シャードのチャンクの数はバランスが取れていますが、データが大きく歪んでいる可能性があります。 チャンクでは、シャーディングキーはほぼ同じです。 チャンクサイズが64 MBに達すると、空のチャンクが作成されます。 このようにして、チャンクの数が増加し、チャンクの移行が完了する。 ただし、移行されたチャンクは空のチャンクです。 結果として、シャードは、等しい数のチャンクを有するが、大きく異なるデータサイズを有し得る。 この場合、差別性の高い適切な列を使用して、シャーディングキーを再設計する必要があります。
チャンクの分割方法の詳細については、「チャンクによるデータパーティショニング」および「シャードクラスターのチャンクの分割」をご参照ください。
ジャンボシャードはアンシャードデータベースから発生します
ApsaraDB for MongoDBインスタンスの一部のデータベースのみをシャードできます。 このように、アンシャードデータベースのデータは同じシャードに格納されます。 大量のデータがデータベースに格納されている場合、入力されたシャードのデータ量は他のシャードのデータ量よりもはるかに大きくなります。
別のケースでは、データがソースApsaraDB for MongoDBインスタンスからターゲットApsaraDB for MongoDBインスタンスに論理的にインポートされる場合、ターゲットApsaraDB for MongoDBインスタンスがシャードされない場合があります。
上記のシナリオの問題を解決するには、次の操作を実行することを推奨します。
宛先インスタンスがデフォルトでシャードされていない場合は、データをインポートする前に宛先インスタンスのシャーディングポリシーを設定します。
アンシャードデータベースの数が多く、データベースのデータ量が類似している場合は、ApsaraDB for MongoDBが提供する
movePrimary
コマンドを実行して、特定のデータベースを特定のシャードに移行します。データベースのデータ量が多すぎてシャードされていない場合は、データベースをシャードするか、データベースを個別のレプリカセットとして分割することをお勧めします。
ディスク容量が十分な場合は、これらの問題を無視することを推奨します。
複数のmovechunk操作によってディスク使用量が不均一になる
movechunk操作は、データが宛先シャードに書き込まれた後にソースデータを削除するために使用されます。 デフォルトでは、remove操作はスペースを解放しません。 各テーブルには、wiredTigerエンジンを実行するインスタンスにデータファイルとインデックスファイルがあります。 ファイルが削除されない場合、占有スペースは解放されません。 ほとんどの場合、この問題は、インスタンスが一定期間実行された後にシャーディングがインスタンスに実装されるために発生します。
理論的には、ムーベンク操作によって引き起こされる空間断片化は、大量のデータが削除される操作によって引き起こされるものと同様である。 したがって、シャードで大量のムーベンク操作または削除操作が必要な場合は、シャードでコンパクト操作を実行して、フラグメントで使用されているスペースを解放できます。
movechunkの詳細については、「シャードクラスターでの範囲の移行」および「シャードクラスターバランサーの管理」をご参照ください。