OpenTSDB を使用した時系列データのモニタリング

このチュートリアルでは、Google Kubernetes Engine(GKE)Bigtable で稼働する OpenTSDB を使用して、Google Cloud で時系列データを収集、記録、モニタリングする方法について説明します。

時系列データは、トレンド分析、モニタリング、機械学習など、いくつかのアプリに使用できる大変貴重な資産です。時系列データを生成できるソースには、サーバー インフラストラクチャ、アプリコードなどが含まれます。OpenTSDB では、大量の時系列データを極めて細かい粒度で収集し、保持できます。

このチュートリアルでは、GKE を使用してスケーラブルなデータ収集レイヤを作成し、Bigtable を使用して収集したデータを処理する方法について詳しく説明します。次の図に、このソリューションのアーキテクチャ概要を示します。

このチュートリアルの Google Cloud 上で TSDB を使用するソリューションのアーキテクチャ概要図

目標

  • 新しい Bigtable インスタンスを作成する。
  • 新しい GKE クラスタを作成する。
  • OpenTSDB を GKE クラスタにデプロイする。
  • OpenTSDB に時系列指標を送信する。
  • OpenTSDB と Grafana を使用して指標を可視化する。

費用

このチュートリアルでは、Google Cloud の課金対象となる以下のコンポーネントを使用します。

  • Compute Engine
  • GKE
  • Bigtable
  • Cloud Storage

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを作成できます。

新しい Google Cloud ユーザーは無料トライアルをご利用いただける場合があります。

始める前に

  1. Google アカウントにログインします。

    Google アカウントをまだお持ちでない場合は、新しいアカウントを登録します。

  2. Cloud Console のプロジェクト セレクタページで、Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタのページに移動

  3. Google Cloud プロジェクトに対して課金が有効になっていることを確認します。 プロジェクトに対して課金が有効になっていることを確認する方法を学習する

  4. Cloud Bigtable, Cloud Bigtable Admin, Compute Engine, and Google Kubernetes Engine API を有効にします。

    API を有効にする

プロジェクト ID を書き留めます。この ID は、後のステップで使用します。

環境の準備

このチュートリアルでは、コマンドを入力するために Cloud Shell を使用します。Cloud Shell では Cloud Console のコマンドラインにアクセスできるほか、Google Cloud での開発に必要な Cloud SDK などのツールも利用できます。Cloud Shell は、Cloud Console の下部にウィンドウとして表示されます。初期化が完了するまでに数分かかることもありますが、ウィンドウはすぐに表示されます。

  1. Cloud Shell をアクティブにします。

    Cloud Shell をアクティブにする

  2. デフォルトの Compute Engine ゾーンを、Bigtable クラスタを作成するゾーンに設定します(us-central1-f など)。

    gcloud config set compute/zone us-central1-f
    
  3. サンプルコードが格納された git リポジトリのクローンを作成します。

    git clone https://github.com/GoogleCloudPlatform/opentsdb-bigtable.git
    
  4. サンプル ディレクトリに移動します。

    cd opentsdb-bigtable
    

Bigtable インスタンスの作成

このチュートリアルでは、収集した時系列データを保存するために Bigtable を使用します。そのためには、Bigtable インスタンスを作成する必要があります。

Bigtable はキー/ワイドカラム型ストアであり、時系列データ用の Bigtable スキーマ設計で説明しているように、時系列データで特に有用です。Bigtable は HBase API をサポートしていることから、OpenTSDB などの Apache HBase と連動するように設計されたソフトウェアを簡単に使用できます。OpenTSDB で使用する HBase スキーマの詳細については、OpenTSDB のドキュメントをご覧ください。

OpenTSDB の重要なコンポーネントは、AsyncHBase クライアントです。このクライアントにより、完全非同期、非ブロッキング、スレッドセーフという形で HBase に対する一括書き込みを行うことが可能になります。OpenTSDB を Bigtable で使用する場合、AsyncHBase は AsyncBigtable クライアントとして実装されます。

ニーズに合わせて簡単にスケーリングできることが Bigtable の主な特徴です。このチュートリアルでは単一ノードの開発クラスタを使用します。このタスクには単一のノードで十分対応でき、経済的です。開発クラスタでプロジェクトを開始し、本番環境データを処理する準備ができたら、規模を大きくした本番環境クラスタに移行してください。作業用のクラスタサイズを選択する際の参考としては、Bigtable のドキュメントに記載されているパフォーマンスとスケーリングに関する詳細な説明をご覧ください。

Bigtable インスタンスを作成するには、次のようにします。

  1. Cloud Console で [インスタンスの作成] ページに移動します。

    [インスタンスの作成] ページに移動

  2. [インスタンス名] ボックスに、インスタンスの名前を入力します。OpenTSDB instance または任意の名前を使用できます。インスタンス名を入力すると、このページの [インスタンス ID] フィールドと [クラスタ ID] フィールドに自動的に値が設定されます。

  3. [インスタンスのタイプ] を [開発] に設定します。

  4. [ゾーン] で、[us-central1-f]、または OpenTSDB を実行する予定のゾーンを選択します。

  5. [作成] をクリックしてインスタンスを作成します。

[インスタンス ID] と [ゾーン] の値を書き留めます。これらの値は、後のステップで使用します。

GKE クラスタの作成

GKE は、マネージド Kubernetes 環境を提供します。GKE クラスタを作成したら、そのクラスタに Kubernetes Pod をデプロイできます。このチュートリアルでは、GKE と Kubernetes のポッドを使用して OpenTSDB を実行します。

OpenTSDB は、ストレージがアプリケーション層から分離されているため、同時に複数のインスタンスにデプロイできます。このように並行実行すると、大量の時系列データを処理できます。OpenTSDB を Docker コンテナにパッケージ化すると、GKE を使用した大規模なデプロイが簡単になります。

次のコマンドを実行して Kubernetes クラスタを作成します。このオペレーションには数分かかることがあります。

gcloud container clusters create opentsdb-cluster --scopes \
"https://www.googleapis.com/auth/bigtable.admin",\
"https://www.googleapis.com/auth/bigtable.data"

GKE クラスタに上記 2 つのスコープを追加することにより、OpenTSDB コンテナと Bigtable 間のやりとりが可能になります。このクラスタは、デフォルトで Cloud Storage からイメージを読み取るので、Google Container Registry からイメージを pull するために Cloud Storage のスコープを追加する必要はありません。他のデプロイでは、スコープの追加が必要になる場合があります。

このチュートリアルの残りの部分では、Container Registry にあるビルド済みのコンテナ gcr.io/cloud-solutions-images/opentsdb-bigtable:v1 を使用します。コンテナのビルドに使用される Dockerfile スクリプトと ENTRYPOINT スクリプトは、チュートリアル リポジトリの build フォルダにあります。

構成の詳細を含む ConfigMap の作成

Kubernetes に備わっている ConfigMap と呼ばれるメカニズムは、アプリをより移植しやすくするために、コンテナ イメージから構成の詳細を切り離します。OpenTSDB の構成は opentsdb.conf 内で指定されます。サンプルコードには、opentsdb.conf を含む ConfigMap が含まれています。これを編集して、インスタンスの詳細を反映させる必要があります。

ConfigMap の作成

OpenTSDB の構成を編集して、インスタンスを作成したときに使用したプロジェクト名、インスタンス ID、ゾーンを反映させます。

  1. Cloud Shell ウィンドウの上部にあるツールバーで鉛筆アイコンをクリックして、Cloud Shell に組み込まれているコードエディタを開きます。

  2. opentsdb/configmaps の下にある opentsdb-config.yaml を選択して、このファイルをエディタで開きます。

  3. プレースホルダのテキストを、チュートリアルで前に設定したプロジェクト名、インスタンス ID、ゾーンで置き換えます。

  4. Cloud Shell プロンプトで、更新された opentsdb-config.yaml から ConfigMap を作成します。

    kubectl create -f configmaps/opentsdb-config.yaml
    

Bigtable での OpenTSDB テーブルの作成

OpenTSDB を使用してデータを読み書きするには、そのデータを格納するために Bigtable で必要なテーブルを作成する必要があります。テーブルを作成する Kubernetes Job を作成する手順は次のとおりです。

  1. ジョブを起動します。

    kubectl create -f jobs/opentsdb-init.yaml
    
  2. ジョブが完了するまでに 1 分以上かかることがあります。このコマンドを定期的に実行して、Job が正常に完了したことを確認します。

    kubectl describe jobs
    

    出力には、見出し「Pods Statuses」の下に 1 つの Job が正常に完了したことが示されているはずです。

  3. 次のコマンドを実行して、テーブル作成 Job のログを取得します。

    pods=$(kubectl get pods  --show-all --selector=job-name=opentsdb-init \
    --output=jsonpath={.items..metadata.name})
    
    kubectl logs $pods
    

ログを取得したら、出力の下部を調べます。そこに、作成された各テーブルが示されています。この Job は、create 'TABLE_NAME' という形式のテーブル作成コマンドをいくつか実行します。0 row(s) in 0.0000 seconds という形式の行を探してください。ここで、0.0000 にはコマンドにかかった実際の所要時間が示されます。

出力には、次のようなセクションが含まれているはずです。

create 'tsdb-uid',
  {NAME => 'id', COMPRESSION => 'NONE', BLOOMFILTER => 'ROW'},
  {NAME => 'name', COMPRESSION => 'NONE', BLOOMFILTER => 'ROW'}
0 row(s) in 1.3680 seconds

Hbase::Table - tsdb-uid

create 'tsdb',
  {NAME => 't', VERSIONS => 1, COMPRESSION => 'NONE', BLOOMFILTER => 'ROW'}
0 row(s) in 0.6570 seconds

Hbase::Table - tsdb

create 'tsdb-tree',
  {NAME => 't', VERSIONS => 1, COMPRESSION => 'NONE', BLOOMFILTER => 'ROW'}
0 row(s) in 0.2670 seconds

Hbase::Table - tsdb-tree

create 'tsdb-meta',
  {NAME => 'name', COMPRESSION => 'NONE', BLOOMFILTER => 'ROW'}
0 row(s) in 0.5850 seconds

Hbase::Table - tsdb-meta

このジョブを実行する必要があるのは一度だけです。該当するテーブルがすでに存在する場合は、エラー メッセージが返されます。既存のテーブルがある場合は、そのテーブルを使用してチュートリアルを続行できます。

データモデル

これまでの手順で作成したテーブルには、OpenTSDB のデータポイントが格納されます。後のステップで、これらのテーブルに時系列データを書き込みます。時系列データポイントは、次のように編成されて保存されます。

フィールド 必須 説明
metric 必須 測定中の項目(デフォルトキー) sys.cpu.user
timestamp 必須 測定時のエポックタイム 1497561091
value 必須 測定値 89.3
tags 少なくとも 1 つのタグが必要です 測定をクエリできるようにします

hostname=www

cpu=0

env=prod

OpenTSDB のデプロイ

このチュートリアルの残りの部分では、サンプル シナリオを使用できるようにする方法を説明します。使用するアーキテクチャは、次の図に示すとおりです。

このチュートリアルで時系列データの書き込み、読み取り、可視化に使用したアーキテクチャの図

このチュートリアルでは、2 つの Kubernetes Deployment を使用します。 一方のデプロイでは指標を OpenTSDB に送信し、もう一方の Deployment で、その指標を読み込みます。2 つの Deployment を使用することで、長時間実行される読み取りオペレーションと書き込みオペレーションが互いにブロックすることがなくなります。それぞれの Deployment 内の Pod は、同じコンテナを使用します。各コンテナ内では、OpenTSDB が提供する tsd というデーモンが実行されます。

1 つの tsd プロセスで、高スループットのイベントを次々に処理できます。負荷を分散させるために、このチュートリアルでは各 Deployment で読み取り Pod と書き込み Pod の 3 つのレプリカを作成します。

指標を書き込むためのデプロイの作成

書き込み用 Deployment の構成情報は、チュートリアルのリポジトリにある deployments フォルダ内の opentsdb-write.yaml に格納されています。これを作成するには、次のコマンドを使用します。

kubectl create -f deployments/opentsdb-write.yaml

指標を読み取るためのデプロイの作成

読み取り用 Deployment の構成情報は、チュートリアルのリポジトリにある deployments フォルダ内の opentsdb-read.yaml に格納されています。これを作成するには、次のコマンドを使用します。

kubectl create -f deployments/opentsdb-read.yaml

本番環境 Deployment では、実行する tsd Pod の数を手動で、または Kubernetes の自動スケーリング機能を使用して増やすことができます。同様に、GKE クラスタのインスタンス数を手動で、またはクラスタ オートスケーラーを使って増やすことができます。

OpenTSDB サービスの作成

2 つのデプロイに一貫したネットワーク接続を提供するために、2 つの Kubernetes Service を作成します。一方の Service では OpenTSDB に指標を書き込み、もう一方の Service で指標を読み取ります。

指標を書き込むための Service の作成

指標書き込み Service の構成情報は、チュートリアル リポジトリの services フォルダにある opentsdb-write.yaml に格納されています。Service を作成するには、次のコマンドを使用します。

kubectl create -f services/opentsdb-write.yaml

このサービスは GKE クラスタ内に作成されて、クラスタ内で実行される他のサービスからアクセスできます。このチュートリアルの次のセクションで、この Service に指標を書き込みます。

指標を読み取るための Service の作成

指標読み取り Service の構成情報は、チュートリアル リポジトリの services フォルダにある opentsdb-read.yaml に格納されています。Service を作成するには、次のコマンドを使用します。

kubectl create -f services/opentsdb-read.yaml

OpenTSDB に時系列データを書き込む

OpenTSDB にデータを書き込むメカニズムはいくつかあります。サービス エンドポイントを定義すると、エンドポイントへのデータの書き込みを開始するようにプロセスに指示できます。このチュートリアルでは、Heapster を使用してデータを書き込む例を説明します。Heapster デプロイが GKE に関するデータを収集し、OpenTSDB を実行している GKE クラスタの指標を公開します。

Heapster をクラスタにデプロイするには、次のコマンドを使用します。

kubectl create -f deployments/heapster.yaml

OpenTSDB での時系列データの調査

チュートリアルで前にデプロイした opentsdb-read サービス エンドポイントを使用して、時系列指標をクエリできます。データの使用法はさまざまです。一般的なオプションの 1 つは、データを可視化することです。OpenTSDB には、収集した指標を可視化するための基本的なインターフェースが組み込まれています。このチュートリアルでは Grafana を使用します。これは指標の可視化に代わる一般的な方法で、追加の機能を利用できます。

Grafana のセットアップ

クラスタ内で Grafana を実行するには、OpenTSDB をセットアップする場合と同様の手順に従います。ConfigMap とデプロイの作成に加えて、GKE クラスタ内で実行中の Grafana にアクセスできるようにポート転送を構成する必要があります。

Grafana をセットアップする手順は次のとおりです。

  1. チュートリアルのリポジトリにある configmaps フォルダ内の grafana.yaml に格納されている構成情報を使用して、Grafana ConfigMap を作成します。

    kubectl create -f configmaps/grafana.yaml
    
  2. チュートリアルのリポジトリにある deployments フォルダ内の grafana.yaml に格納されている構成情報を使用して、Grafana デプロイを作成します。

    kubectl create -f deployments/grafana.yaml
    
  3. クラスタ内の Grafana Pod の名前を取得し、その名前を使用してポート転送を設定します。

    grafana=$(kubectl get pods --show-all --selector=app=grafana \
      --output=jsonpath={.items..metadata.name})
    
    kubectl port-forward $grafana 8080:3000
    
  4. 転送が成功したことを確認します。出力は次のようになるはずです。

    Forwarding from 127.0.0.1:8080 -> 3000
    Forwarding from [::1]:8080 -> 3000
    

Grafana ウェブ インターフェースへの接続

Cloud Shell で、[ウェブでプレビュー] をクリックし、[ポート 8080 でプレビュー] を選択します。

新しいブラウザタブが開き、Grafana ウェブ インターフェースに接続します。しばらくすると、ブラウザには次のようなグラフが表示されます。

Grafana の可視化の例

Grafana のこのデプロイは、チュートリアル向けにカスタマイズされています。ファイル configmaps/grafana.yamldeployments/grafana.yaml は、opentsdb-read サービスに接続し、匿名認証を許可して、いくつかの基本的なクラスタ指標を表示するように、Grafana を構成します。本番環境での Grafana のデプロイでは、適切な認証メカニズムが実装され、さらに豊富な情報を持つ時系列グラフが使用されます。

クリーンアップ

このチュートリアルで使用したリソースについて、Google Cloud Platform アカウントに課金されないようにする手順は次のとおりです。

  1. GKE クラスタを削除して、kubectl create コマンドで作成されたすべての成果物を終了します。

    gcloud container clusters delete opentsdb-cluster
    

    GKE クラスタを削除するには、「Y」を入力するか、Enter キーを押して操作を確定します。

  2. Bigtable クラスタを削除するには、Google Cloud Console で [プロダクトとサービス] をクリックします。[Bigtable] をクリックし、作成したクラスタを選択してから [削除] をクリックします。

次のステップ

  • OpenTSDB の使用パフォーマンスを向上させる方法については、時系列データ用の Bigtable スキーマ設計をご覧ください。

  • Google Cloud Next 17 で動画 Bigtable の実例を見る。この動画では、フィールド プロモーションやその他のパフォーマンスに関する考慮事項を説明しています。

  • GKE クラスタのクラスタ スコープに関するドキュメントを読む。このドキュメントでは、Cloud Storage などのデフォルト スコープと、他の Google サービスに追加できるスコープについて説明しています。

  • Google Cloud のその他の機能を試す。チュートリアルをご覧ください。