InfluxDB の Schema 設計

時系列DBで SQL like なクエリが書ける InfluxDB と、その可視化ツールである Grafana を使おうかなーと思っているのだけれど、InfluxDB はバージョン 0.9 系がもうすぐ出るらしい。気になるのは 0.8 系と 0.9 系間の違いと Grafana の InfluxDB 0.9 系への対応具合になる。0.9 系はまだ出ていないし、Grafana の方もちゃんと対応しきっていない。今 InfluxDB 0.8 系でを使い始めて、Grafana が 0.9 対応した時に移行できない可能性があるという微妙な時期。

Clustering, tags, and enhancements to come in 0.9.0 を読むと 0.9 の機能で気になるのは Tags のサポート。


Tags の話の前にまず 0.8 の時代での Schema 設計の話をする。例えば server01 のコアごとの CPU load を記録したいとする。コアが2つあって、ひとつめを 1 番、ふたつめを 2 番とする。これを表現する方法はいくつかあって、データ点内にコア情報を含めるか、Series(名前の通り時系列なデータ点が入るところ)の名前にコア情報を含める方法がある。

前者は Series 名を server01.cpu 、カラムに core というものを作って以下のようなデータ点を入れる方法。

{"core": 1, "value": 1.2, "time": 1400425947368}
{"core": 2, "value": 1.7, "time": 1400425947368}

後者はシリーズ名を server01.core.1.cpuserver01.core.2.cpu のふたつを用意して、server01.core.1.cpu には {"value": 1.2, "time": 1400425947368} を入れ、server01.core.2.cpu には {"value": 1.7, "time": 1400425947368} を入れるという方法。

InfluxDB Schema Design Guidelines に書いてあるけれど、前者のカラムに core を定義するやり方は index が効かない。コア 1 のデータがほしいだけなのにコア 2 のデータも走査してしまう。

一方、後者の Series 名にコア番号を含めるやり方だとコア 2 のデータを走査するというようなことがない。どっちのコアのデータもほしい場合は select * from /^server01\./ limit 100; というような、Series 名に対する正規表現で複数 Series を対象としたクエリを投げることができる。このやり方は SQL like という割には直感的ではなくて select * from server01 where core = 1 limit 100; と書くほうが SQL を書くのに慣れた人は直感的な気がする。そういう要望が多かったのかどうかは調べてないので知らないけど、0.9 からは index 化される Tags を用意したようだ。

Tags がどういう風に使われているかは v0.9.0 ドキュメントの Schema DesignReading and Writing Data を読めば分かる。

Clustering, tags, and enhancements to come in 0.9.0 の Migration のところを見ると、0.9 系に上げるまでは Series 名にコア番号を含めるやり方と同様に <tagName>.<tagValue>.<tagName>.<tagValue>.<measurement> みたいな Series 名にしておけば Tags を自動的に定義してくれるっぽい。

実際のところどうなのか・本当なのかは 0.9 系を動かして確かめたわけではないので、雑記クオリティということでひとつ。