InfluxDB とは?
InfluxDB とは OSS で開発されている時系列データベースで,メトリクス/イベントなど,時系列データを扱うのに特化している.現在も活発に開発が進んでいて,先週に最新バージョンとなる InfluxDB 1.5.0 もリリースされている.CLI で操作できること,HTTP API で操作できること,クライアントライブラリが充実してること,Grafana と連携できることなどが,ポイントになる.
InfluxDB の導入事例を見ると,大きく以下の3種類に分類されていて,一般的なユースケースを知ることができる.
- DevOps Monitoring
- IoT and Sensor Monitoring
- Real-Time Analytics
また,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
InfluxDB を試す
ドキュメントの Getting started に沿って,データベースの作成,時系列データの操作を試してみた.
まず,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
の中に tags
と fields
を登録する.タグはメタデータのようなイメージで,フィールドは実際の時系列データとして扱う.そして常に 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 に書いてある通り,基本的な操作は全て実装されていた.
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
Grafana も Mac にインストールした.
$ brew update $ brew install grafana
普段は Grafana 3 を使っているので,今回 Grafana 5 をインストールしたら,ログイン画面がオシャレになっていて驚いた!
InfluxDB のデータソースを登録して,あとはポチポチとグラフ設定をすれば可視化できた.今回は「サンタモニカの平均気温」を可視化した.
まとめ
- 時系列データベース InfluxDB を試した
- CLI を使えば SQL ライクな操作ができるので,すんなりと理解できた
- クライアントライブラリも充実していて,今回は Ruby で試した
- 可視化も Grafana を使えば困ることはなさそう
今後
今回 InfluxDB を試したとは言え,まだチュートリアルレベルなので,例えば以下など,もう1歩踏み込んで調査したいと思う.あと,あまり身近で InfluxDB の導入事例を聞いたことがなくて,どの程度使われているんだろう?
- InfluxQL Continuous Queries
- Downsampling
- クラスタリング(スケールアウト)