kakakakakku blog

Weekly Tech Blog: Keep on Learning!

時系列データベース InfluxDB の基本操作と Grafana 連携を試した

InfluxDB とは?

InfluxDB とは OSS で開発されている時系列データベースで,メトリクス/イベントなど,時系列データを扱うのに特化している.現在も活発に開発が進んでいて,先週に最新バージョンとなる InfluxDB 1.5.0 もリリースされている.CLI で操作できること,HTTP API で操作できること,クライアントライブラリが充実してること,Grafana と連携できることなどが,ポイントになる.

github.com

InfluxDB の導入事例を見ると,大きく以下の3種類に分類されていて,一般的なユースケースを知ることができる.

  • DevOps Monitoring
  • IoT and Sensor Monitoring
  • Real-Time Analytics

www.influxdata.com

また,InfluxDB 以外の時系列データベースで言うと,RRDtool と Graphite あたりはよく知られていると思う.あくまで参考としてだけど,DB-Engines の時系列データベースランキングを見ると,InfluxDB はずっと1位をキープしている.

InfluxDB インストール

InfluxDB の雰囲気を知るため,チュートリアルレベルの機能を試してみた.今回は最新バージョンの InfluxDB 1.5.0 を Mac にインストールした.特に難しいことはなく,brew 経由でインストールできた.

$ brew update
$ brew install influxdb
$ influxd -config /usr/local/etc/influxdb.conf

docs.influxdata.com

InfluxDB を試す

ドキュメントの Getting started に沿って,データベースの作成,時系列データの操作を試してみた.

docs.influxdata.com

まず,CLI で InfluxDB に接続する.接続時に指定する -precision rfc3339 はタイムスタンプの精度を意味していて,今回の例だと RFC3339 format (YYYY-MM-DDTHH:MM:SS.nnnnnnnnnZ) となる.

$ influx -precision rfc3339
Connected to http://localhost:8086 version v1.5.0
InfluxDB shell version: v1.5.0
>

InfluxDB でもデータベースを作成する.このあたりは SQL と操作感が似ている.

> CREATE DATABASE mydb

> SHOW DATABASES
name: databases
name
----
_internal
mydb

> USE mydb
Using database mydb

InfluxDB では measurement と呼ぶテーブルのような概念があり,measurement の中に tagsfields を登録する.タグはメタデータのようなイメージで,フィールドは実際の時系列データとして扱う.そして常に time がプライマリインデックスとなる.以下の例を見るとよくわかる.なお,時系列データの操作感は SQL に似ている.

  • measurement
    • cpu
  • tags
    • host=serverA
    • region=us_west
  • fields
    • value=0.64
> INSERT cpu,host=serverA,region=us_west value=0.64

> SELECT "host", "region", "value" FROM "cpu"
name: cpu
time                          host    region  value
----                          ----    ------  -----
2018-03-10T16:33:42.39199169Z serverA us_west 0.64
  • measurement
    • temperature
  • tags
    • machine=unit42
    • type=assembly
  • fields
    • external=25
    • internal=37
> INSERT temperature,machine=unit42,type=assembly external=25,internal=37

> SELECT * FROM "temperature"
name: temperature
time                           external internal machine type
----                           -------- -------- ------- ----
2018-03-10T16:34:13.758402578Z 25       37       unit42  assembly

あとはクエリを書くだけという感じで,例えば,全部の measurement から1レコードを取得するというおもしろクエリも書ける.

> SELECT * FROM /.*/ LIMIT 1
name: cpu
time                          external host    internal machine region  type value
----                          -------- ----    -------- ------- ------  ---- -----
2018-03-10T16:33:42.39199169Z          serverA                  us_west      0.64

name: temperature
time                           external host internal machine region type     value
----                           -------- ---- -------- ------- ------ ----     -----
2018-03-10T16:34:13.758402578Z 25            37       unit42         assembly

Ruby から InfluxDB に接続する

次は,Ruby からクエリを投げてみる.既に公式でクライアントライブラリが提供されているので,それを使うと簡単だった.

github.com

今回は以下で動いた.GitHub に書いてある通り,基本的な操作は全て実装されていた.

require 'influxdb'

influxdb = InfluxDB::Client.new 'mydb'

# {"name"=>"cpu", "tags"=>nil, "values"=>[{"time"=>"2018-03-10T16:33:42.39199169Z", "host"=>"serverA", "region"=>"us_west", "value"=>0.64}]}
puts influxdb.query 'SELECT "host", "region", "value" FROM "cpu"'

Grafana 連携

次は NOAA から提供されている「温度/水温など」のサンプルデータをインポートして,Grafana で可視化してみた.サンプルデータのインポートは,以下のドキュメントに載っている.

$ influx -precision rfc3339
Connected to http://localhost:8086 version v1.5.0
InfluxDB shell version: v1.5.0

> CREATE DATABASE NOAA_water_database
> exit

$ curl https://s3.amazonaws.com/noaa.water-database/NOAA_data.txt -o NOAA_data.txt
$ influx -import -path=NOAA_data.txt -precision=s -database=NOAA_water_database

$ influx -precision rfc3339 -database NOAA_water_database
Connected to http://localhost:8086 version v1.5.0
InfluxDB shell version: v1.5.0

> SHOW measurements
name: measurements
name
----
average_temperature
h2o_feet
h2o_pH
h2o_quality
h2o_temperature

docs.influxdata.com

Grafana も Mac にインストールした.

$ brew update
$ brew install grafana

docs.grafana.org

普段は Grafana 3 を使っているので,今回 Grafana 5 をインストールしたら,ログイン画面がオシャレになっていて驚いた!

f:id:kakku22:20180311223511p:plain

InfluxDB のデータソースを登録して,あとはポチポチとグラフ設定をすれば可視化できた.今回は「サンタモニカの平均気温」を可視化した.

f:id:kakku22:20180311223500p:plain

まとめ

  • 時系列データベース InfluxDB を試した
  • CLI を使えば SQL ライクな操作ができるので,すんなりと理解できた
  • クライアントライブラリも充実していて,今回は Ruby で試した
  • 可視化も Grafana を使えば困ることはなさそう

今後

今回 InfluxDB を試したとは言え,まだチュートリアルレベルなので,例えば以下など,もう1歩踏み込んで調査したいと思う.あと,あまり身近で InfluxDB の導入事例を聞いたことがなくて,どの程度使われているんだろう?

  • InfluxQL Continuous Queries
  • Downsampling
  • クラスタリング(スケールアウト)