ようへいの日々精進XP

よかろうもん

InfluxDB を触ってみたぜよ

はじめに

  • 最近、巷でよく見かける InfluxDB を触ってみたぜよ

参考


InfluxDB とは

こちらのトップページをおっさんなりに意訳。

  • 時系列データベース
  • 時系列データの取り扱いが得意な KVS(意訳)
  • イベントデータの蓄積等も得意(意訳)
  • HTTP でデータの登録や検索可能
  • スキーマレス
  • SQL ライクなクエリ
  • Web UI が同梱されている
  • RDBMS で言うところのデータベースのことは同じくデータベースと呼ぶ
  • テーブルのことは series と呼ぶようだ

間違っていたらすいません。

名前は何と呼べば良いのか解らないが「インフラックス」だったら、もしかして「インフラ」寄りな DB だったりしてw...(シーン)ま、時系列データやイベントデータの蓄積ということはアレやコレや用途が思いついたのでどんな動きするのか試してみることにした。


触ってみる

Dockerfile

どうせなら Docker で試したいのでこちらのような Dockerfile で環境を構築する。

docker build -t inokappa/influxdb .

以後は上記の Docker 上での利用で進める。尚、boot2docker の為、実際に InfluxDB が利用するポートとは異なるポートとなるのでご注意を。

起動

docker run -t -d -p 8083 -p 8086 inokappa/influxdb

こんな感じで起動して 8083 ポートがダッシュボードのポートなのでローカルホストのバインドされたポートにブラウザでアクセスすると...

f:id:inokara:20140418042521p:plain

デフォルトのユーザー名(root)とパスワード(root)を入力して API 用ポート 8086 ポートにバインドされたポートを入力してログインすると...

f:id:inokara:20140418042835p:plain

Database の作成をしなければいけないようだ...

ちなみに以下のように起動すると...

/usr/bin/influxdb -pidfile /opt/influxdb/shared/influxdb.pid -config /opt/influxdb/shared/config.toml

下記のようなメッセージが表示されると共に InfluxDB が起動する。

[04/08/14 03:45:16] [INFO] Loading configuration file /opt/influxdb/shared/config.toml
[04/08/14 03:45:16] [INFO] Redirectoring logging to /opt/influxdb/shared/log.txt
[04/08/14 03:45:16] [INFO] Starting Influx Server bound to 0.0.0.0 ...
[04/08/14 03:45:16] [INFO]
+---------------------------------------------+
|  _____        __ _            _____  ____   |
| |_   _|      / _| |          |  __ \|  _ \  |
|   | |  _ __ | |_| |_   ___  _| |  | | |_) | |
|   | | | '_ \|  _| | | | \ \/ / |  | |  _ <  |
|  _| |_| | | | | | | |_| |>  <| |__| | |_) | |
| |_____|_| |_|_| |_|\__,_/_/\_\_____/|____/  |
+---------------------------------------------+


[04/08/14 03:45:16] [INFO] Opening database at /opt/influxdb/shared/data/db
[04/08/14 03:45:16] [INFO] Opening wal in /opt/influxdb/shared/data/wal
[04/08/14 03:45:16] [INFO] Using /dev/random to initialize the raft server name
[04/08/14 03:45:16] [INFO] Setting raft name to 5ae35e6
[04/08/14 03:45:16] [INFO] Ssl will be disabled since the ssl port or certificate path weren't set
[04/08/14 03:45:16] [INFO] Initializing Raft HTTP server
[04/08/14 03:45:16] [INFO] Raft Server Listening at http://b5beafae8e47:8090
[04/08/14 03:45:16] [INFO] Initializing Raft Server: /opt/influxdb/shared/data/raft 8090
[04/08/14 03:45:16] [INFO] Starting as new Raft leader...
[04/08/14 03:45:16] [INFO] (raft:5ae35e6) Selected as leader. Starting leader loop.
[04/08/14 03:45:16] [INFO] Added server to cluster config: 1, http://b5beafae8e47:8090, b5beafae8e47:8099
[04/08/14 03:45:16] [INFO] Checking whether this is the local server new: b5beafae8e47:8099, local: b5beafae8e47:8099

[04/08/14 03:45:16] [INFO] Added the local server
[04/08/14 03:45:16] [INFO] Waiting for local server to be added
[04/08/14 03:45:16] [INFO] Setting server id to 1 and recovering
[04/08/14 03:45:21] [INFO] Recovering from log...
[04/08/14 03:45:21] [INFO] local: Initializing write buffer with buffer size of 10000
[04/08/14 03:45:21] [INFO] Waiting for servers to recover
[04/08/14 03:45:21] [INFO] ProtobufServer listening on 0.0.0.0:8099
[04/08/14 03:45:21] [INFO] Recovering local server
[04/08/14 03:45:21] [INFO] Recovering server 1 from request 0
[04/08/14 03:45:21] [INFO] Recovered local server
[04/08/14 03:45:21] [INFO] recovered
[04/08/14 03:45:21] [INFO] Connecting to other nodes in the cluster
[04/08/14 03:45:21] [INFO] Starting admin interface on port 8083
[04/08/14 03:45:21] [INFO] Starting Http Api server on port 8086

どうやら 80838086 以外にも 80908099 ポートも利用しているようだ。80908099go で実装された Raft と呼ばれる耐障害性や一貫性を保証する為のプロトコル(他には Paxos という)という理解でいいのかな。ま、そんなサービスもバックエンドでは動いている。

データベースを作ってみる

スクリーンショットを撮ったりするのがキツイので以後は出来るだけ HTTP API で色々と操作したい。早速データベースを作ってみる。

curl -X POST 'http://localhost:8086/db?u=root&p=root' -d '{"name": "hogehuga"}'

上記を実行すると何のレスポンスも無い...が Web のダッシュボードを見ると...

f:id:inokara:20140418050553p:plain

ちなみに以下のように実行すると...

curl -X GET 'http://localhost:8086/db?u=root&p=root' 

以下のようにデータベース名が表示された。

[{"name":"hogehuga","replicationFactor":1}]

超シンプル。

データをポストしてみる

以下のようにしてデータをポストすることが出来るようだ。

curl -X POST 'http://localhost:8086/db/${DB_Name}/series?u=root&p=root' -d '${JSON like Query}'

早速投げてみる。

curl -X POST 'http://localhost:8086/db/hogehuga/series?u=root&p=root' -d \
'[
  {
    "name": "events",
    "columns": ["state", "email", "type"],
    "points": [
      ["ny", "paul@influxdb.org", "follow"],
      ["ny", "todd@influxdb.org", "open"]
    ]
  },
  {
    "name": "errors",
    "columns": ["class", "file", "user", "severity"],
    "points": [
      ["DivideByZero", "example.py", "someguy@influxdb.org", "fatal"]
    ]
  }
]'

もちろんレスポンスは無いが以下のように GET メソッドを使ってポストしたデータを確認することが出来る。

curl -s -X GET 'http://localhost:8086/db/hogehuga/series?u=root&p=root&q=select%20%2a%20from%20events' 

パラメータ q= の後に URL エンコーディングしたクエリを渡してあげると...

[
  {
    "points": [
      [
        1396945983426,
        80001,
        "todd@influxdb.org",
        "ny",
        "open"
      ],
      [
        1396945983426,
        70001,
        "paul@influxdb.org",
        "ny",
        "follow"
      ]
    ],
    "columns": [
      "time",
      "sequence_number",
      "email",
      "state",
      "type"
    ],
    "name": "events"
  }
]

上記のような結果が返ってくる。(※上記は jq を介している)


引き続き

InfluxDB を触っていくことにするが現時点でイイなあと思ったところと改善していただけると嬉しいなあというところ。

イイなあ

  • 今んとこ軽い
  • Docker コンテナでも普通に動いた
  • いきなり Web UI は有り難い

あったら嬉しい

  • HTTP API で POST メソッド使った時にレスポンスが返ってこないので成功かどうか不明なのでレスポンスコードが返ってくると嬉しいなあと思ったのでお願いしてみました