Amazon Linux 2 に InfluxDB を導入

InfluxDB とは

OSS の時系列データベース。センサーデータなどの時系列データを保存するデータストアとして使うことにした。

他のデータストアの候補としては OpenTSDB などがあったが、OpenTSDB はバックエンドに HBase を使うなど規模感がやろうとしていることに対して大きすぎるということで influxDB を選択した。

導入手順

環境:Amazon Linux2 (Centos 7.x 互換)

現在の stable 最新版 v1.6 を使う。 Installing InfluxDB OSS | InfluxData Documentation

まず、yum でインストールするために、influxdb の rpm 取得元として yumリポジトリの追加

$ cat <<EOF | sudo tee /etc/yum.repos.d/influxdb.repo
[influxdb]
name = InfluxDB Repository - RHEL 7
baseurl = https://repos.influxdata.com/rhel/7/\$basearch/stable # 公式では '7' ではなく、'$releasever' を指定しているが Amazon Linux 2 では '$releasever' が '2' になってしまうので '7' に変更する
enabled = 1
gpgcheck = 1
gpgkey = https://repos.influxdata.com/influxdb.key
EOF

インストール&起動

$ sudo yum install influxdb
$ sudo service influxdb start
$ systemctl daemon-reload
$ systemctl enable influxdb # 自動起動を on に
influxdb.service is not a native service, redirecting to /sbin/chkconfig. # systemd サービスではないので、chkconfig にリダイレクトされる
Executing /sbin/chkconfig influxdb on

influxdb の設定ファイルは以下のパスに置かれている。とりあえずデフォルトのままでOK。

$ less /etc/influxdb/influxdb.conf

データ入力・出力

InfluxDB は API を使った入出力と CLI を使った入出力に対応している。 ここでは CLI(influx shell) を使ったデータの入力・出力を試す。 CLI では Influx QL という SQL に近いクエリ言語でデータの入出力を行う。

influx コマンドを利用して influxdb に接続する。precision は timestamp の表示形式を変更するオプション。指定がない場合は timestamp がエポック時間(例:1535166757911702475)で表示されるので rfc3339 形式を指定する。

データベースの作成、確認、利用の手順は mysql などと同じ流れ。

$ influx -precision rfc3339
Connected to http://localhost:8086 version 1.6.1
InfluxDB shell version: 1.6.1
> CREATE DATABASE mydb
> SHOW DATABASES
name: databases
name
----
_internal
mydb
> USE mydb
Using database performance_metrics
>

実際にデータを投入する前に、知っておかねばならない InfluxDB の用語を整理する。

  • measurement: 直訳で「測量」。InfluxDB では mysql などのテーブルに該当する概念を "measurement" と呼ぶ。measurement はスキーマレス。
  • tag: measurement の column。measurement の一レコードに複数の tag をつけることが可能。後述の field との違いとして tag には index が張られる。
  • field: measurement の column。measurement の一レコードに複数の field をつけることが可能。tag と違い、value には index が張られない。
  • series: measurement と tag の組み合わせ。1つの series に 1 つの value を設定するのがよいらしい(index を効かせるためでしょうか?)

mysql などのリレーショナルデータベースとの違いとしては measurement は予め作成しておく必要がなく、スキーマレス(column となる tag, field は任意のタイミングで追加可能)であるということ。

INSERT 構文は次のようになっている

INSERT <measurement>[,<tag-key>=<tag-value>...] <field-key>=<field-value>[,<field2-key>=<field2-value>...] [unix-nano-timestamp]
> INSERT cpu,host=serverA,region=us_west value=0.64
>

SELECT は通常の SQL がだいたい使えます。

> select "host", "region", "value" from "cpu"
name: cpu
time                           host    region  value
----                           ----    ------  -----
2018-08-25T03:12:37.911702475Z serverA us_west 0.64
> INSERT cpu,host=serverB,region=us_east value=0.10
> select "host", "region", "value" from "cpu"
name: cpu
time                           host    region  value
----                           ----    ------  -----
2018-08-25T03:12:37.911702475Z serverA us_west 0.64
2018-08-25T03:13:44.479107406Z serverB us_east 0.1
> INSERT cpu,host=serverB value=0.10
> select "host", "region", "value" from "cpu"
name: cpu
time                           host    region  value
----                           ----    ------  -----
2018-08-25T03:12:37.911702475Z serverA us_west 0.64
2018-08-25T03:13:44.479107406Z serverB us_east 0.1
2018-08-25T03:14:13.822910528Z serverB         0.1
> INSERT cpu,host=serverB,region=us_east value=0.10,value2="hoge"
> select * from "cpu"
name: cpu
time                           host    region  value value2
----                           ----    ------  ----- ------
2018-08-25T03:12:37.911702475Z serverA us_west 0.64
2018-08-25T03:13:44.479107406Z serverB us_east 0.1
2018-08-25T03:14:13.822910528Z serverB         0.1
2018-08-25T03:34:49.405686775Z serverB us_east 0.1   hoge