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

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

時系列データは、傾向分析、モニタリング、機械学習などのさまざまなアプリケーションで使用できる、非常に価値のあるアセットです。時系列データを生成できるソースには、サーバー インフラストラクチャ、アプリケーション コードなどが含まれます。OpenTSDB では、大量の時系列データを極めて細かい粒度で収集し、保持できます。

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

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

目標

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

料金

このチュートリアルでは、以下を含む、Cloud Platform の有料コンポーネントを使用します。

  • Compute Engine
  • Kubernetes Engine
  • Cloud Bigtable
  • Google Cloud Storage

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

Cloud Platform を初めて使用する方は、無料トライアルをご利用いただけます。

始める前に

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

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

  2. GCP プロジェクトを選択または作成します。

    [リソースの管理] ページに移動

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

    課金を有効にする方法について

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

    APIを有効にする

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

環境の準備

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

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

    Cloud Shell をアクティブにする

  2. デフォルトの Compute Engine ゾーンを、Cloud 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
    

Cloud Bigtable インスタンスの作成

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

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

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

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

Cloud Bigtable インスタンスを作成する手順は次のとおりです。

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

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

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

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

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

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

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

Kubernetes Engine クラスタの作成

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

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

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

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

Kubernetes クラスタに上記 2 つのスコープを追加することにより、OpenTSDB コンテナと Cloud 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
    

Cloud Bigtable 内の OpenTSDB テーブルの作成

OpenTSDB を使用してデータの読み取り / 書き込みを行うには、その前に、Cloud Bigtable 内でデータを保管するために必要なテーブルを作成しなければなりません。テーブルを作成する Kubernetes ジョブを作成する手順は次のとおりです。

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

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

    kubectl describe jobs
    

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

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

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

ログを取得したら、出力の下部を調べます。そこに、作成された各テーブルが示されています。このジョブは、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 デプロイを使用します。一方のデプロイでは指標を OpenTSDB に送信し、もう一方のデプロイで、その指標を読み込みます。2 つのデプロイを使用することで、長時間実行される読み取りオペレーションと書き込みオペレーションが互いにブロックすることがなくなります。それぞれのデプロイ内のポッドは、同じコンテナを使用します。各コンテナ内では、OpenTSDB が提供する tsd というデーモンが実行されます。

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

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

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

kubectl create -f deployments/opentsdb-write.yaml

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

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

kubectl create -f deployments/opentsdb-read.yaml

本番環境デプロイでは、実行する tsd ポッドの数を手動で、または Kubernetes の自動スケーリング機能を使用して増やすことができます。同様に、Kubernetes Engine クラスタ内のインスタンスの数も、手動で、またはクラスタ オートスケーラーを使用して増やすことができます。

OpenTSDB サービスの作成

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

指標を書き込むためのサービスの作成

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

kubectl create -f services/opentsdb-write.yaml

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

指標を読み取るためのサービスの作成

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

kubectl create -f services/opentsdb-read.yaml

OpenTSDB への時系列データの書き込み

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

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

kubectl create -f deployments/heapster.yaml

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

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

Grafana のセットアップ

クラスタ内で Grafana を実行するには、OpenTSDB をセットアップしたときと同様のプロセスに従います。ただし、ConfigMap とデプロイを作成するだけでなく、Kubernetes クラスタ内で実行中の 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 ポッドの名前を取得し、その名前を使用してポート転送を設定します。

    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.yaml ファイルと deployments/grafana.yaml ファイルによって、Grafana が opentsdb-read サービスに接続し、匿名認証を許可して基本的なクラスタ指標を表示するように構成されています。本番環境での Grafana のデプロイでは、適切な認証メカニズムが実装され、さらに豊富な情報を持つ時系列グラフが使用されます。

クリーンアップ

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

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

    gcloud container clusters delete opentsdb-cluster

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

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

次のステップ

  • OpenTSDB 使用時のパフォーマンスを向上させる方法を学習する。時系列データ用の Cloud Bigtable スキーマ設計をご覧ください。

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

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

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

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...