MongoDBデータベースのパフォーマンスを監視する方法

Rick Golbaは、Perconaのソリューションエンジニアです。

MongoDBは、開発者に人気のデータベースです。NoSQLデータベースオプションとして、柔軟なスキーマ設計、自動フェイルオーバー、および開発者に馴染みのある入力言語、つまりJSONを備えたデータベース環境を開発者に提供します。

NoSQLデータベースにはさまざまな種類があります。Key-Valueストアは、名前(キーとも呼ばれます)を使用して各アイテムを格納および取得します。ワイド列ストアは、(リレーショナルデータベースのように)列と行を使用する一種のKey-Valueストアであり、テーブル内の列と行の名前のみを変更できます。グラフデータベースは、グラフ構造を使用してデータのネットワークを格納します。ドキュメント指向データベースはデータをドキュメントとして保存し、他のデータベースよりも構造的な柔軟性を提供します。

MongoDBは、ドキュメント指向のデータベースです。これは、バイナリエンコードされたJSON形式(バイナリJSON、またはBSONと呼ばれる)でドキュメント内のデータを保持するクロスプラットフォームデータベースです。バイナリ形式は、JSONの速度と柔軟性の両方を向上させ、より多くのデータ型を追加します。

MongoDBのレプリケーションメカニズムは高可用性の提供に役立ち、そのシャーディングメカニズムは水平方向のスケーラビリティを可能にします。FacebookやeBayなどの多くのトップインターネット企業は、データベース環境でMongoDBを使用しています。

なぜMongoDBを監視するのですか?

MongoDBデータベース環境は、シンプルまたは複雑、ローカルまたは分散、オンプレミスまたはクラウドにすることができます。パフォーマンスが高く利用可能なデータベースを確保したい場合は、次の目的で分析を追跡および監視する必要があります。

  • データベースの現在の状態を確認します
  • パフォーマンスデータを確認して、異常な動作を特定します
  • 特定された問題を解決するための診断データを提供する
  • 小さな問題が大きな問題に発展する前に修正する
  • 環境をスムーズに稼働させ続ける
  • 継続的な可用性と成功を保証する

測定可能で定期的な方法でデータベース環境を監視することで、パフォーマンスに影響を与える前に、不一致、奇妙な動作、または問題を見つけることができます。適切な監視とは、速度低下、リソース制限、またはその他の異常な動作をすばやく見つけて、Webサイトやアプリケーションの速度低下、データの利用不能、または顧客の不満の結果に見舞われる前に、これらの問題を修正するために行動できることを意味します。

何を監視する必要がありますか?

MongoDB環境で監視できることはたくさんありますが、何かがおかしい場合は、いくつかの重要な領域ですぐにヒントが得られます。次の指標を分析する必要があります。

  • レプリケーションラグ。レプリケーションラグとは、プライマリノードからセカンダリノードへのデータのコピーの遅延を指します。
  • レプリカの状態。レプリカの状態は、セカンダリノードが停止したかどうか、および新しいプライマリノードの選出があったかどうかを追跡する方法です。
  • ロック状態。ロック状態は、どのデータロックが設定されているか、およびそれらが設定されている時間の長さを示します。
  • ディスク使用率。ディスク使用率とは、ディスクアクセスを指します。
  • メモリ使用量。メモリ使用量とは、使用されているメモリの量と、その使用方法を指します。
  • 接続数。リクエストを可能な限り迅速に処理するためにデータベースが開いている接続の数。

詳細のいくつかを掘り下げてみましょう。

レプリケーションラグ

MongoDBはレプリケーションを使用して、可用性の課題と目標を満たします。レプリケーションとは、プライマリノードでの操作によってデータが変更されるときに、プライマリノードから複数のセカンダリノードにデータを伝播することです。これらのノードは、同じ場所、異なる地理的場所、または仮想に配置できます。

すべてが同じであれば、データ複製は問題なく迅速に行われるはずです。レプリケーションプロセスのスムーズな実行を妨げる多くのことが起こる可能性があります。最良の条件下でも、ネットワークの物理的特性により、データの複製速度が制限されます。レプリケーションの開始から完了までの遅延は、レプリケーションラグと呼ばれます。

スムーズに実行されるプライマリノードとセカンダリノードのセット(「レプリカセット」と呼ばれる)では、セカンダリはプライマリで変更をすばやくコピーし、操作の各グループを発生するのと同じ速さで(またはできるだけ近くに)oplogから複製します。 。目標は、レプリケーションラグをゼロに近づけることです。任意のノードからのデータ読み取りは一貫している必要があります。選択されたプライマリノードがダウンしたり、使用できなくなったりした場合、クライアントへのデータの精度に影響を与えることなく、セカンダリがプライマリの役割を引き継ぐことができます。レプリケートされたデータは、プライマリがダウンする前にプライマリデータと一致している必要があります。

レプリケーションラグは、プライマリノードとセカンダリノードが同期しなくなる理由です。セカンダリノードがプライマリに選出され、レプリケーションラグが大きい場合、セカンダリのデータのバージョンが古くなっている可能性があります。レプリケーションラグが上昇した状態は、いくつかの非永続的または未定義の理由で発生し、自動的に修正される可能性があります。ただし、レプリケーションラグが高いままであるか、一定の割合で増加し始める場合、これはシステムまたは環境の問題の兆候です。いずれの場合も、レプリケーションラグが大きくなり、高いままでいる時間が長くなるほど、クライアントにとってデータが古くなるリスクが高くなります。

このメトリックを分析する唯一の方法は、監視することです。これは24時間365日監視する必要があるメトリックであるため、自動化とトリガー警告を使用して、望ましくないしきい値に達するとすぐにDBAまたは応答システム管理者に警告するのが最適です。このしきい値の構成は、レプリケーション遅延に対するアプリケーションの許容度によって異なります。適切なしきい値を決定するには、Compass、MongoBooster、Studio 3T、Percona Monitoring and Management(PMM)などの時間の経過に伴う遅延をグラフ化するツールを使用します。

レプリカの状態

レプリケーションはレプリカセットを介して処理されます。レプリカセットは、選択されたプライマリノードといくつかのセカンダリノードを持つノードのセットです。プライマリノードは最新のデータのキーパーであり、プライマリに変更が加えられると、そのデータはセカンダリに複製されます。

通常、レプリカセットの1つのメンバーがプライマリであり、他のすべてのメンバーはセカンダリです。割り当てられたステータスはめったに変更されません。もしそうなら、私たちはそれについて知りたいです(通常はすぐに)。通常、役割の変更は迅速に、通常はシームレスに行われますが、ハードウェアまたはネットワークの障害が原因である可能性があるため、ノードのステータスが変更された理由を正確に理解することが重要です。一次状態と二次状態の間の変化(フラッピングとも呼ばれます)は通常の発生ではなく、完全な世界では、既知の理由(たとえば、ソフトウェアやハードウェアのアップグレードなどの環境メンテナンス中、またはそのような特定のインシデント中)によってのみ発生するはずです。ネットワークの停止として)。

ロック状態

データベースは非常に並行性が高く、揮発性の高い環境であり、複数のクライアントが要求を行い、データに対して実行されるトランザクションを開始します。これらの要求とトランザクションは、順番に、または合理的な順序で発生することはありません。競合が発生する可能性があります。たとえば、トランザクションが同じレコードまたはドキュメントを更新しようとした場合、データの更新中に読み取り要求が発生した場合などです。多くのデータベースがデータへのアクセスを整理して処理する方法は「ロック」です。 」ロックは、現在のトランザクションの処理が完了するまで、トランザクションによってデータベースレコード、ドキュメント、行、テーブルなどが変更または読み取られない場合に発生します。

MongoDBでは、同時トランザクション間の競合を防ぐために、コレクションまたはドキュメントレベルでロックが実行されます。特定の操作では、グローバルデータベースロックも必要になる場合があります(たとえば、コレクションを削除する場合)。ロックが頻繁に発生すると、トランザクション(読み取りを含む)がデータベースのロックされた部分が読み取りまたは変更できるようになるまで待機するため、パフォーマンスに影響します。ロック率が高いということは、ハードウェア障害、スキーマ設計の誤り、インデックスの構成の誤り、インデックスの使用など、データベース内の他の問題の兆候です。

ロック率を監視することが重要です。パフォーマンスに関して許容できるパーセンテージと、パフォーマンスに影響を与える前にパーセンテージを維持できる期間を知っておく必要があります。ロック率が高いためにパフォーマンスが大幅に低下すると、サーバーが応答しなくなるため、レプリケートの状態が変化する可能性があります。

ディスク使用率

すべてのDBAは、データベースサーバーで使用可能なディスク容量を監視する必要があります。データベースがホストのディスク領域を使い果たすと、そのサーバーは突然停止します。データのプロアクティブなサイズ設定とログファイルサイズの監視は、データベースのサイズ設定に最適な手法です。

多くの場合、データベースは自動的に拡張する必要があります。このような場合、ハードウェアを超えないことを保証する必要があります。ディスク容量を定期的に確認することで、予期しないデータベースサーバーの停止を防ぎ、設計上の問題(完全なコレクションスキャンを必要とするクエリなど)を見つけることができます。

メモリ使用量

すべてのデータをRAMに保持すると、データベースの応答時間が短縮されます。しかし、それはどういう意味ですか、そして何かがRAMにあることをどうやって知るのですか?

データベースがメモリを使用する方法は、やや不明確な場合があります。サーバーが使用するメモリの大部分は、バッファプール(データ)用です。どのデータベースがバッファプールメモリの最大部分を使用しているかを見つけるのは難しい場合があり、どのコレクションまたはドキュメントが実際にバッファプールメモリにあるのかを見つけるのはさらに難しい場合があります。この情報を知ることは、(シャーディングを介して)複数のサーバー間でデータベースの負荷を分散する場合、または1つのサーバーインスタンスへの統合に最適なデータを特定する場合に役立ちます。

ツールを使用して、どのインスタンスが最もメモリを使用しているか、どのデータを使用しているかを判断すると、環境を最適化するのに役立ちます。

接続数

データベーストランザクションは通常、「接続」を介してアプリケーションとプロセスによって開始されます。開いている接続の数は、データベースのパフォーマンスに影響を与える可能性があります。理論的には、トランザクションが完了したら、接続を終了する必要があります。ただし、実際には、接続の多くは開いたままになります。データベースが特定のトランザクションを容易にするために一部の接続を維持するのは正常ですが、開いたままになっている接続が多すぎると、接続プールで使用可能な数が制限される可能性があります。

ベストプラクティスとして、データベースは、要求を完了するために必要な最小限の時間、接続を開いたままにしておく必要があります。これにより、接続の小さなプールで大量のトランザクション要求を処理できます。そうしないと、アプリケーショントランザクション要求は、開いている接続を待ってスタックします。データベースで開いている接続の数を監視して、それらが閉じられていること、および着信要求のためにプールに正常な数の接続が残っていることを確認する必要があります。

MongoDBで提供されるツール

何を監視する必要があるかがわかったので、次の質問はどのようにするかです。幸い、MongoDBには、サーバー統計を監視するための使いやすいツールがいくつか付属しています。

mongostat

このユーティリティは、メモリ使用量、レプリカセットのステータスなどに関するグローバル統計を提供し、毎秒更新されます(デフォルト)。

このmongostatユーティリティは、MongoDBサーバーインスタンスの概要を提供します。単一の「mongod」インスタンスを実行している場合は、その単一のインスタンスの統計が表示されます。MongoDBクラスター環境を実行している場合は、「mongos」インスタンスの統計を返します。mongostat特定のイベント(たとえば、特定のアプリケーション要求が着信したときに何が起こるか)について単一のインスタンスを監視する場合に最適です。このコマンドを使用して、基本的なサーバー統計を監視できます。

  • CPU
  • 記憶
  • ディスクIO
  • ネットワークトラフィック

mongostat使用法の詳細については、のMongoDBドキュメントを参照してください。

mongotop

このユーティリティは、読み取りおよび書き込みアクティビティに関するコレクションレベルの統計を提供します。

このmongotopコマンドは、MongoDBサーバーインスタンスで読み取りおよび書き込み操作を完了するために必要な時間を追跡します。コレクションごとのレベルで統計を提供します。mongotopデフォルトでは毎秒値を返しますが、必要に応じて時間枠を調整できます。

1秒あたりのメトリックはすべて、サーバーの構成とクラスターアーキテクチャに関連しています。ローカルで実行される単一インスタンスの場合、デフォルトのポートを使用する場合は、mongotopコマンドを入力するだけです。複数のmongodおよびmongosインスタンスがあるクラスター環境で実行している場合は、コマンドでホスト名とポート番号を指定する必要があります。

mongotop使用法の詳細については、のMongoDBドキュメントを参照してください。

rs.status()

このコマンドは、レプリカセットのステータスを提供します。

このrs.status()コマンドを使用して、実行中のレプリカセットに関する情報を取得できます。このコマンドは、任意のセットの任意のメンバーのコンソールから実行でき、問題のメンバーから見たレプリカセットのステータスを返します。

rs.status()使用法の詳細については、のMongoDBドキュメントを参照してください。