便利な時系列データベースのInfluxDBと、その可視化ツールGrafanaについて

今回は、前回の記事で少し話題に出したデータベースのInfluxDBと、その可視化フロントエンドのGrafanaについて紹介していきたいと思います。 InfluxDBは、単純に利用するだけならばMySQL等のRDBMSと似た感覚で使用する事ができ、監視系のデータをとりあえず入れておくという用途にはぴったりのデータベースです。 GrafanaはInfluxDBに入れたデータを綺麗なグラフにして表示する事ができ、複数のグラフをまとめたものをダッシュボードとして保存して、いつでもそのグラフセットを簡単に呼び出すなど、機能も豊富な可視化ツールです。

概要

InfluxDBは時系列のデータを取り扱うのに特化したデータベースであり、Go言語で書かれています。 特徴としては、

  • スキーマレスである
  • HTTPのRestfulAPIから操作できるので、特別なクライアントが必要ない
  • 検索にはSQLライクなクエリ言語を利用できるため、クライアントサイドで利用するだけなら技術的障壁はかなり低い
  • 時系列での集計関数が豊富
  • シャーディングおよびレプリケーションによるスケールアウトの効果が大きい

などがあります。 単純にデータを挿入していくだけで自動的に時系列管理ができるため、弊社ではこれを監視システムによって取得したデータの保存先として利用しています。 何か問題が発生した場合は、このデータベースから情報を取得して、いつどのような問題が発生したかの解析の助けとします。

Grafanaは、InfluxDBを含めたいくつかの時系列データベースのための可視化フロントエンドで、Pure HTML5で書かれています。

f:id:hmikisato:20141210191733p:plain

上記スクリーンショットは弊社で実際に使っている画面(一部修正あり)ですが、ご覧の通りかなりカッコいい見た目で、 無骨な見た目のグラフで作業するよりもモチベーションが上がったという話も聞きます。 表示範囲や項目の表示非表示の切り替え、表示データのフィルタリングなども簡単に行う事ができ、問題が発生した時により調査を行いやすくなっています。

簡単な機能の紹介

InfluxDBの設置とクエリ発行

InfluxDBはdebおよびyumパッケージが用意されているため、InfluxDBを設置するサーバを用意して、サーバ上で以下のコマンドを実行するだけでInfluxDBをインストールする事ができます。

# debの場合
wget http://s3.amazonaws.com/influxdb/influxdb_latest_amd64.deb
sudo dpkg -i influxdb_latest_amd64.deb

# rpmの場合
wget http://s3.amazonaws.com/influxdb/influxdb-latest-1.x86_64.rpm
sudo rpm -ivh influxdb-latest-1.x86_64.rpm

InfluxDBは、データを「データベース」と「シリーズ」という単位で階層化します。 これはちょうどMySQLの「データベース」と「テーブル」に相当し、データベースこそ事前に作る必要はありますが、 シリーズはデータを格納すれば自動作成されます。 curlコマンドを使ってデータベース作成からデータの格納までを行うと次のようになります。

curl -X POST 'http://domain.of.influxdb.server:8086/db?u=root&p=root' -d '{"name": "testing"}'
curl -X POST 'http://domain.of.influxdb.server:8086/db/testing/series?u=root&p=root' -d '[{"name":"test","columns":["val"],"points":[[23]]}]' 
curl -X POST 'http://domain.of.influxdb.server:8086/db/testing/series?u=root&p=root' -d '[{"name":"test","columns":["val"],"points":[[33]]}]'

以上により、testingデータベースを作成し、testシリーズにval=23と、val=33という2つのデータを格納しました。 次にここからデータを検索してみます。

curl -G 'http://domain.of.influxdb.server:8086/db/testing/series?u=root&p=root' --data-urlencode "q=select * from test"
[{"name":"test","columns":["time","sequence_number","val"],"points":[[1418214673850,116725100001,33],[1418214334450,116703830001,23]]}]

本当にcurlだけでデータの格納から取得までができてしまいました。timeとsequence_numberが追加されていますが、格納された時間と、格納されたデータの通し番号が自動的に追加される仕組みです。 q=select * from test の部分に注目してください。SQLと全く同じ構文です。これは素晴らしい。 もちろんwhere句も使う事ができ、例えば select * from test where time > now() - 5m で、最新5分のデータを取得する事ができます。

他にも継続クエリや多数の集計関数(特定の時間間隔での合計、平均、差分、最大最小などなど)など、たくさんの機能がクエリから使用できます。詳しくは本家サイトのドキュメントを御覧ください。

Grafanaでの可視化

GrafanaはPure HTML5で書かれているため、普通のWebサイトの設置と同じ方法で利用する事ができます。 公式サイトからtar.gzファイルを落として来てWebサーバから見える場所に置き、config.jsonを環境に合わせて設定(主にInfluxDBへの接続設定)するだけで使用可能になります。画面の操作も簡単で、グラフの作成時にInfluxDBの強力な集計関数も利用することができます。特に差分値などは重宝しています。

成長するプロダクト達

InfluxDBもGrafanaも成長が著しいプロダクトです。 InfluxDBは、執筆時点(2014年12月現在)のバージョンはv0.8.6です。弊社に導入した時期は夏前頃だったのですが、 その時点では0.7.3でしたので、かなりの機能がこの間に追加されています。 性能が向上したのはもちろん、集計関数が追加されたり、シャーディングおよびレプリケーションの設定が以前より複雑でなくなったり、 正規表現を用いたシリーズのJOINが可能になったりなど、使い勝手がかなり向上しています。

Grafanaについても、以前は描いたグラフの情報を保存して次回接続時にも同じグラフを確認するためにはElasticsearchが必要でしたが、バージョンも上がってInfluxDBのみで設定が完結するようになりました。また、フィルタリング機能が強力になったなど、グラフの機能面でも強化されています。

これらのプロダクトの成長に負けないように、弊社のプロダクトも日進月歩で成長していきたいと思っています。