InfluxDBを触ってみた

InfluxDBを触ってみた

NoSQLを使うことも一般的になってきた昨今ですが、NoSQLの一種に、時系列データベース (Time Series Database; TSDB)と呼ばれるものが有ります。
TSDBはその名のとおり、時系列データを取り扱うことに特化したDBです。
サーバ監視したログデータや、センサデータなんかを取り扱うことが得意なDBということですね。

そのうち、DB-ENGINESDB-Engines Ranking of Time Series DBMSで一位を取っているInfluxDBを触ってみました。

InfluxDBの公式ドキュメントはInfluxData | Documentation | InfluxDB Version 1.2 Documentationにあります。

参考にした資料・実行環境

今回はQiita/DockerのInfluxDBとGrafanaでdweet.ioのデータを可視化するの前半を参考に、Docker上でInfluxDBを実行してみました。
なお、上記の記事中では、~tutum/influxdb~というイメージを使用していますが、現在はInfluxDBオフィシャルのイメージが提供されていますので、そちらを利用します。
最新の安定版を利用しますので、InfluxDBのバージョンは1.2.0です。

InfluxDBコンテナを起動する

早速InfluxDBコンテナを起動してみます。

$ docker pull influxdb
$ docker run --name influxdb_test -p 8083:8083 -p 8086:8086 influxdb

これだけです。簡単ですね。Exposeしているポートの中身は以下のようになっています。

  • 8083: Admin Web インターフェース
  • 8086: HTTP API

Admin UIにアクセスする

Admin UIにアクセスしてみます。
InfluxDBにはWebアクセスできるUIがついています。

まずはコンテナのIPを調べてみましょう。

$ docker inspect influxdb_test

HostConfig > NetworkSettings > Networks > bridge > IPAddress にコンテナのIPが記載されています。
今回は172.17.0.2だったとして進めます。

ブラウザを起動し、172.17.0.2:8083にアクセスします。

influxdb_adminui_index
すると、上記のような画面が現れます。
この画面から、InfluxDBの基本的な操作を行うことができます。

データベースを作る

初期状態では、_internalという、InfluxDB自体が使用するデータベースがあるのみなので、まずはデータベースを作成します。
データベースを作るには、SQLと同じような、CREATE DATABASE文を使います。WebUIのQueryに、以下のように入力します。

CREATE DATABASE test_db

セミコロンは必要ありません。また、InfluxDBは固定スキーマでは無いので、カラムの指定も必要ありません。

influxdb_create_database
データベースの作成に成功すると、上の図のようにSuccess!と表示されます。

データを挿入する

データベースができたので、データを挿入してみます。
作成したデータベースにデータを挿入するため、データベースの選択を行います。
画面右上のDatabase: _internalと表示されたところをクリックし、選択肢から先程作成したtest_dbを選択します。

選択後、いよいよデータを挿入します。
データの挿入は、タイトル横のWrite Dataから行います。
Write Dataをクリックすると、データの入力画面が表示されます。
ココに、データをLine Protocolと呼ばれる形式でデータを記述します。

<measurement>[,<tag-key>=<tag-value>...] <field-key>=<field-value>[,<field2-key>=<field2-value>...] [unix-nano-timestamp]

MeasurementはRDBMSでいうところのテーブルのようなもので、データの系列を表現しています。
TagはIndexされる値で、key=valueの形式で記入します。メタデータなどに用います。
FieldはIndexされない値で、key=valueの形式で記入します。こちらが通常の値です。

InfluxDBでは、ある時点での値のセットをまとめて、pointと呼びます。pointは時間、所属するMeasurement、0個以上のTag set、1個以上のField setから構成されます。

Fieldの値に使える型は4種類(Float, Integer, String, Boolean)です。
Integer型が有りますが、通常の数値(整数含む)は基本的にFloatで扱います。
また、文字列は最大64KBまでとなっています。

何らかのアプリケーションのログという体裁でデータを挿入してみます。

log,level=Error detail="An Error"

influxdb_insert_data

これでデータを挿入できましたので、Queryを発行して確認してみましょう。

Queryを発行する

データを引き出すため、Queryを発行してみます。
WebUIのトップにある、Query窓にQueryを記述します。

SQLとそっくりなSELECT文を使います。

SELECT * FROM log

ココでもセミコロンはいりません。

入力し、エンターを押すと、以下のようにデータが出力されます。
influxdb_select_query
Queryの場合はクエリストリングのq=の値にQuery文字列を入れます。
Writeの場合は、POSTのbodyにLine Protocolで書きます。
それぞれ、dbを指定する必要がある操作の場合はdb=にデータベース名を書きます。

先程のQueryを実際にHTTPで叩くと、以下のようになります。

$ curl 'http://172.17.0.2:8086/query?db=test_db&q=SELECT+*+FROM+log'
{"results":[{"statement_id":0,"series":[{"name":"log","columns":["time","detail","level"],"values":[["2017-02-18T09:21:45.251016378Z","An Error","Error"]]}]}]}

まとめ

簡単に、InfluxDBの一通りの操作を行ってみました。
各言語向けの公式ライブラリも整備されているようです。

ログの集計等に便利そうです。

Subscribe to