InfluxDBに入門してみる
参考
この記事はほぼ上記のドキュメントの拙訳(±α)になっています。
環境
Ubuntu18.04
インストール
$ wget https://dl.influxdata.com/influxdb/releases/influxdb_1.7.6_amd64.deb
$ sudo dpkg -i influxdb_1.7.6_amd64.deb
データベースを作成する
$ service influxdb start # サーバーの起動
$ influx -precision rfc3339 # influxDBに接続
Connected to http://localhost:8086 version 1.7.6
InfluxDB shell version: 1.7.6
Enter an InfluxQL query
>
注意 : InfluxDB HTTP APIはデフォルトで8086ポート上で起動する。したがって、influxはデフォルトでローカルホストに8086ポートで接続しようとする。もしデフォルトから変える必要があれば、influx --help
を実行するとよい。
-precision
引数は任意の返ってきたタイムスタンプのformat/precisionを特定する。この例では、rfc3339はInfluxDBにRFC3339 format (YYYY-MM-DDTHH:MM:SS.nnnnnnnnnZ)でタイムスタンプを返すように指定している。
話を戻す。 InfluxDBのフレッシュインストール後には(_internal
は別として)データベースが存在しないので、まずはデータベースを作成する。CREATE DATABASE <db-name>
でデータベースを作成ですることができる。<db-name>
は作りたいデータベースの名前。データベースの名前は文字列がダブルクオーテーションで挟まれていればどんなユニコード文字列を含んでいてもよい。アスキー文字、ディジット、あるいはアンダースコアのみを含んでいてディジットで始まらない限りはクオーテーションでDB名を囲う必要はない。
> CREATE DATABASE mydb
データベースが無事作られたかどうか調べるためにSHOW DATABASES
と打ち込んで存在するすべてのデータベースを表示してみる。
> SHOW DATABASES
name: databases
name
----
_internal
mydb
注意: _internal
データベースは内部のランタイムメトリクスを保存するために作成され、InfluxDBに使われる。
SHOW DATABASES
とは異なりほとんどのInfluxQLステートメントは特定のデータベースに対して不利に働かなければならない(most InfluxQL statements must operate against a specific database)。各々のクエリでデータベースに名前をつけても良いが、CLIは便利なステートメントを用意している。USE <db-name>
はすべての将来に渡るリクエストに対して、データベースを自動的にセットする。例えば:
> USE mydb
Using database mydb
>
これで、今後のコマンドはmydb
データベースに対してのみ実行される。
データを書き込んで探索する
今やデータベースが存在するので、InfluxDBはクエリの発行や書き込みの準備が出来ていることになる。
まずはじめに、データ保存に関する短い入門から始める。InfluxDB内のデータは"time series"(時系列)によって組織化されており、“cpu_load"や"temperature"のように測定された値を含んでいる。時系列はゼロから複数のpoints
(各々の測定からの離散的サンプルに対する一つ(one for each discrete sample of the metric))を持つ。Pointsはtime
(タイムスタンプ)、measurement
(例えば"cpu_load")、少なくとも1つのkey-valuefield
(測定された値そのもので、例えば"value=0.64"や"temperature=21.2")、そして値に対するメタデータを含んだzero to many key value tags
(例えば、“host=server01”, “region=EMEA”, “dc=Frankfurt”)で構成される。
概念的にはmeasurement
をSQLテーブルとして考えることができる。プライマリーインデックスが常に時間であると考えればよい。tags
とfields
は実質的にはテーブル内のカラムである。tags
はインデックス化され、fields
はされない。(SQLテーブルとの)違いはというと、InfluxDBを使うことで数百万のmeasurementの値をもつことが出来、スキーマを前もって定義する必要がなくヌル値は保存されないということである。
PointsはLine Protocolを使って次のようなフォーマットにしたがってInfluxDBに書かれる。
<measurement>[,<tag-key>=<tag-value>...] <field-key>=<field-value>[,<field2-key>=<field2-value>...] [unix-nano-timestamp]
InfluxDBに書き込むことが出来るpointsのすべての例は次のようになる:
cpu,host=serverA,region=us_west value=0.64
payment,device=mobile,product=Notepad,method=credit billed=33,licenses=3i 1434067467100293230
stock,symbol=AAPL bid=127.46,ask=127.48
temperature,machine=unit42,type=assembly external=25,internal=37 1434067467000000000
CLIを使って単一の時系列データポイントをInfluxDBに挿入するためにpointがあとに続くINSERT
文を入力する:
> INSERT cpu,host=serverA,region=us_west value=0.64
>
cpu
というmeasurementの名前とhost
およびregion
というタグを伴ったpointは今、測定されたvalue
が0.64
という形でデータベースに書き込まれる。
書き込んだデータに対してクエリを発行してみる:
> SELECT "host", "region", "value" FROM "cpu"
name: cpu
time host region value
---- ---- ------ -----
2019-06-24T21:59:49.117249421Z serverA us_west 0.64
>
別の種類のデータを保存してみる。同じmeasurement内で2つのフィールドを持ったものとする:
> INSERT temperature,machine=unit42,type=assembly external=25,internal=37
>
クエリによってすべてのフィールドとタグを返すために、*
演算子を使うことができる:
> SELECT * FROM "temperature"
name: temperature
time external internal machine type
---- -------- -------- ------- ----
2019-06-24T22:05:42.841203137Z 25 37 unit42 assembly
InfluxQLはここではカバーされていない多くのフィーチャーやキーワードを持っており、その中にはGo-style regexのためのサポートも含まれている。例えば:
> SELECT * FROM /.*/ LIMIT 1
--
> SELECT * FROM "cpu_load_short"
--
> SELECT * FROM "cpu_load_short" WHERE "value" > 0.9
これでInfluxDBにデータを書き込みクエリを返すために知っておく必要があることは全てである。InfluxDB write protocolについてもっと学ぶためにはWriting Dataに関するガイドをチェックするとよい。クエリ言語をさらに探索するためには、Querying Dataに関するガイドをチェックするとよい。InfluxDBに関するさらなる情報に関しては、Key Conceptsページをチェックするとよい。