序章

サーバー、アプリケーション、およびトラフィックに関する統計を収集することをお勧めする理由はたくさんあります。 データを収集して整理することで、構成のスケーリング、トラブルシューティング、および問題点の追跡に関する意思決定に自信を持てるようになります。

マシンのメトリックを追跡するために使用できるさまざまなツールがあり、それらはプロセスの特定の小さな部分に委任されることがよくあります。 これらのツールを組み合わせて、結果を収集、記録、および表示するためのシステムを作成できます。

このガイドでは、サーバーとアプリケーションによって生成されたデータを収集、保存、および視覚化できるようにするいくつかのテクノロジーについて説明します。

Graphite について説明します。これは、時間の経過とともにデータの視覚的表現をレンダリングするために使用できるいくつかのコンポーネントで構成されるグラフ作成ライブラリです。 また、実行中のサーバーに関するほぼリアルタイムの情報を収集できるシステム統計デーモンであるcollectdについても調べます。 リストの最後は、 StatsD です。これは、任意のデータを収集および整理するために使用できる柔軟な統計アグリゲーターです。

後のガイドでは、Ubuntu 14.04サーバーにこれらのコンポーネントをインストールして構成し、稼働させる方法について説明します。

なぜデータを追跡するのですか?

最初に確立する必要があるのは、サーバーまたはアプリケーション環境でデータを追跡する理由です。

包括的な理由は実際には非常に単純です。データが多ければ多いほど、特定の瞬間に何が起こっているのかを理解できる可能性が高くなります。 これにより、ハードデータを使用して意思決定をバックアップし、変更が正しいコンポーネントを対象としているかどうかを事前に確認できる優れた機能が得られます。 統計の追跡は、アプリケーションログに存在しない可能性のある補足情報のソースを提供します。

ほとんどの(すべてではありませんが)ロギングシステムは、基本的に自己完結型のアプリケーション出力を表すため、さまざまなアプリケーションからのデータを相互に関連付けたり、イベントを特定のシステム状態に接続したりすることができません。 これにより、イベントを取り巻く状況の全体像を構築するのが難しくなる可能性があります。

データベースサーバーがダウンするという事件が発生したことを少し想像できます。 ログを読んでいると、15:35:28 UTCに、MySQLサービスがOOM(メモリ不足)エラーで強制終了されたことに気付くかもしれません。 メモリ使用量が問題であることがわかりましたが、以前は安定していたサーバーでメモリ使用量が急増した原因がわからない場合があります。

サーバーとアプリケーションに関するデータを追跡している場合は、明らかに異なるシステムデータをまとめて、問題が発生したときの環境が正確にどのようになっていたかを理解するのに役立てることができます。 メモリリークが原因でメモリ使用量が着実に増加していることがわかる場合があります。 アプリケーションレベルのメモリ使用量に関する情報があれば、どのプログラムが原因であるかを正確に確認できる可能性があります。 また、異常なスパイクがあったこともわかります。これは、まったく異なることを意味している可能性があります。

別のシナリオでは、デプロイの前後でシステムがどのように見えるかを確認できます。 新しいコードが奇妙な条件を作成した場合、それが他のコンポーネントに与える影響を確認し、そのパフォーマンスを古いコードと比較できます。 新しいコードが改善を示しているポイントと、間違いを犯した可能性のある場所を特定できます。

スマートデータ収集を使用すると、システムを、無関係なコンポーネントの緩いセットとしてではなく、システムとして見ることができます。

グラファイトコンポーネント

ここでは少し逆に始めて、最初にグラフ作成ライブラリであるGraphiteについて説明します。 次に、戻って、Graphiteがデータを取得するために使用できるソフトウェアのいくつかについて説明します。

Graphiteは、データの視覚的表現の保存とレンダリングを担当するグラフ作成ライブラリです。 これは、Graphiteがデータポイントを収集および転送するために他のアプリケーションを必要とすることを意味します。

Graphiteプロジェクト自体は、いくつかの異なるコンポーネントで構成されており、それぞれに特定の焦点を絞った目的があります。

グラファイトWebアプリ

Graphiteインストールの最も目に見える動的なコンポーネントは、GraphiteWebアプリケーションです。

ここで、データをプロットするグラフを設計できます。

Graphite example graph

Graphiteは、グラフを設計するための非常に柔軟なインターフェイスを提供します。 さまざまなタイプのメトリックを組み合わせたり、ラベル付け、フォント、色、線のプロパティを制御したり、データのサイズを自由に変更したり操作したりできます。

ここでダイジェストする重要なアイデアは、Graphite は、受け取ったデータポイントと指定した方向に基づいてグラフをレンダリングすることです。 グラフを印刷してデータを破棄するだけではありません。 その場で、必要なデータにデータをレンダリングできます。

Webアプリケーションでは、グラフのプロパティとレイアウトを保存することもできるため、必要なすべての設定を使用して監視インターフェイスを起動できます。 ダッシュボードビューはいくつでも作成できます。つまり、マシンまたはアプリケーションごとに個別のダッシュボードを作成できます。 これらの間でデータを相互に関連付ける必要がある場合は、グラフをドラッグアンドドロップするだけで表示を組み合わせることができます。

ただし、柔軟性はそれだけではありません。 Graphiteを使用すると、他のインターフェイスに埋め込むために、裸のURLでグラフをレンダリングできます。 JSONやCSVなどの非グラフィック表現でデータをエクスポートしたり、データ情報が埋め込まれたSVGを出力したりすることもできます。

データを取得したときにデータで何ができるかがわかったので、他のGraphiteコンポーネントについて話して、これを可能にするプロセスを見てみましょう。

炭素

Carbonは、Graphite構成のストレージバックエンドです。 単一のGraphite構成には、統計を収集および送信する他のプロセスによって送信されるデータの処理を担当する1つ以上のCarbonデーモンが含まれます(コレクターはGraphiteの一部ではありません)。

さまざまなCarbonデーモンがあり、それぞれが異なる方法でデータを処理します。 これらの最も基本的なものはcarbon-cache.pyと呼ばれます。 このデーモンは単純明快です。 ポート上のデータをリッスンし、到着時にそのデータを効率的な方法でディスクに書き込みます。

データは到着時に保存され、所定の時間が経過するとディスクにフラッシュされます。 Carbonコンポーネントがデータの受信およびフラッシュ手順を処理することを認識することが重要です。 実際のストレージメカニズムは処理しません。 これは、whisperコンポーネントに任されています。これについては後で説明します。

carbon-cache.pyデーモンには、動作する形式、プロトコル、およびポートが通知されます。 また、データストレージに使用するデータ保持ポリシーについても説明します。 これらはささやきに渡されます。 ほとんどの基本構成では、データ受信を処理するには、単一のcarbon-cache.pyインスタンスで十分です。

セットアップが大きくなるにつれて、複数のインスタンスを一度に実行できます。 これらは、前のcarbon-relay.pyまたはcarbon-aggregator.pyデーモンによってバランスを取ることができます。

carbon-relay.pyデーモンを使用して、冗長性を確保するためにすべてのバックエンドデーモンに要求を送信できます。 また、さまざまなcarbon-cache.pyインスタンス間でデータをシャーディングして、読み取り負荷を複数のストレージロケーションに分散させるためにも使用できます。

carbon-aggregator.pyデーモンは、データをバッファリングし、しばらくするとcarbon-cache.pyにダンプできます。 これにより、詳細を犠牲にして、統計処理がシステムに与える影響を減らすことができます。

ささやき

Whisperは、Graphiteが送信される情報を保存するために使用するデータベースライブラリです。

非常に柔軟性があり、時系列データを非常に詳細に保存できます。 さまざまな詳細レベルでさまざまなアーカイブを作成するため、実際の使用では、特定の構成済みのエージングしきい値を超えると、情報は適切に低解像度に低下します。

たとえば、特定のメトリックに対して1秒あたり1つのデータポイントを格納できます。 この詳細なデータは5時間保持する必要があるとささやくことができます。 低解像度のデータを保存するアーカイブがある場合もあります。 1分あたり1ポイントしか保存せず、6か月間保持する場合があります。

低解像度のアーカイブの各ポイントは、高解像度のアーカイブに記録されているのと同じデータから計算されます。 さまざまな解像度と保持率のアーカイブを必要な数だけ持つことができます。 追跡されているメトリックのタイプに応じて、whisperが低解像度のアーカイブのデータを計算する方法を構成できます。

たとえば、メトリックは、短い時間枠で何らかのイベントが発生した回数の集計である場合があります。 より低い解像度でより長い時間枠のポイントを作成するには、より高い解像度のアーカイブのデータポイントを合計して、より長い期間のデータ値を要約します。

Whisperは、メトリックの性質に応じて、他の方法で低解像度のデータを計算できます。 たとえば、一部のデータは平均化によって一般化されますが、他のデータは最大値を追跡している場合があります。 平均の場合、実際の平均値は、高解像度のポイントから計算され、低解像度のポイントが作成されます。 最大値については、最大値を保持し、残りは数値の意味を維持するために破棄する必要があります。

Whisperは、データを受信したとき(必要な値を収集するために必要な時間の後)に、低解像度のデータを計算して記録します。 データ集約手法(平均、最大など)を実行するために必要なデータポイントを収集し、それを書き込むだけです。

Graphiteは、グラフをレンダリングするためにデータをクエリするときに、要求された時間枠を含む最高解像度のアーカイブを使用します。

統計の収集と配信

上で述べたように、Graphite自体はデータ収集に関係していません。 代わりに、他のサービスから情報が提供されることに依存しています。 これにより、プロジェクトは狭い焦点を維持し、さまざまな入力サービスとモジュール式に相互作用することができます。

以下では、Graphiteが理解するプロトコルについて説明し、次に、処理のためにデータをCarbonに渡すために使用できる2つの一般的な収集プログラムcollectdStatsDについて説明します。

プロトコル

Graphiteにデータを送信するために使用できる3つの異なるプロトコルがあります。

まず、Graphiteはプレーンテキストを受け入れて理解できます。 ほとんどすべてのアプリケーションまたはサービスがテキスト出力を生成でき、これを使用してGraphiteまたは中間ツールにフィードできるため、これは最も柔軟な形式です。

プレーンテキストメッセージには、メトリック名、指定された値、およびその値のタイムスタンプに関する情報が含まれます。 これらのメッセージは、追加のフォーマットなしで、プレーンテキスト用に指定されたポートでCarbonに直接送信できます。

GraphiteはPythonで作成されているため、Graphiteは「ピクル」データシリアル化形式も受け入れます。 このPython標準を使用すると、1回のトランザクションで複数の時間値をバッファリングして送信できます。

Graphiteは、AMQPメッセージを使用してデータを受け入れることもできます。 これにより、大量のデータをより適切に処理できます。 この構成では、データを失うことなく、多数の統計情報を入力し、リモートホスト間のネットワーク接続の中断を処理できます。

集めた

サーバーに関する詳細情報を収集する最も簡単な方法の1つは、collectdと呼ばれるデーモンを使用することです。

Collectedは、サーバー環境のさまざまなコンポーネントに関する統計を収集できます。 これにより、メモリ使用量、CPU負荷、ネットワークトラフィックなどの一般的なメトリックを簡単に追跡できます。 これにより、イベントをシステムの状態と簡単に関連付けることができます。

collectdには、標準のシステム情報を収集するだけでなく、その機能を拡張するプラグインシステムもあります。 これは、Apache、Nginx、iptables、memcache、MySQL、PostgreSQL、OpenVPNなどの一般的なソフトウェアを簡単に追跡できることを意味します。

Collectdは、サーバー上のビルド前のアプリケーションと一般的なサービスからデータを取得する簡単な方法を提供します。 これは、インフラストラクチャと依存するサービスの動作を追跡するために使用する必要があります。

StatsD

StatsDは、他のデータをGraphiteに送信するために使用できる非常に単純なデーモンです。 このアプローチの利点は、作成しているアプリケーションとシステムに統計追跡を組み込むことが簡単になることです。

StatsDは、単一のデータポイントを表す単純なUDPパケットをインターフェイスでリッスンすることによって動作します。 これは、コネクションレス型の方法で膨大な量の情報を受け入れることができることを意味します。 次に、受け取った値を集約してGraphiteに渡すことができます。

このシステムを使用すると、アプリケーションの待ち時間の増加を心配することなく、統計を大量に送信できます。 StatsDサービスは、すべてのデータを収集し、それを集約してから、期待される時間枠で、適切に要約されたデータポイントをGraphiteに送信します。

これらの利点があるため、実際には、Graphiteに送信されるあらゆる種類のデータの優れた仲介者です。 しかし、これを活用できる主な方法は、作成した独自のアプリケーションとツールを監視することです。

StatsDは、UDPトラフィックを受け入れる汎用デーモンであるため、これに最適です。 StatsDインスタンスに直接データを送信できる、さまざまなプログラミング言語のさまざまなクライアント側ライブラリがあります。 これは、構築しているアプリケーションが追跡するデータを簡単に送信できることを意味します。

結論

これまでに、さまざまな統計およびグラフ作成ユーティリティのコレクションがどのように連携して環境の全体像を把握できるかについて、かなりよく理解しているはずです。

次のガイドでは、Ubuntu14.04サーバーにGraphiteをインストールする方法について説明します。 その後、collectdStatsDをGraphiteに接続して、監視する統計をフィードします。

ジャスティン・エリングウッド