はじめに
- 最近、巷でよく見かける InfluxDB を触ってみたぜよ
参考
- InfluxDB
- influxdb/influxdb
- InfluxDB / HTTP API
- InfluxDB / Query Language
- InfluxDB を10分だけ触ってみた
- InfluxDB をちょっとさわってみた
- InfluxDB & LevelDB Inside-out
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
ポートがダッシュボードのポートなのでローカルホストのバインドされたポートにブラウザでアクセスすると...
デフォルトのユーザー名(root
)とパスワード(root
)を入力して API
用ポート 8086
ポートにバインドされたポートを入力してログインすると...
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
どうやら 8083
や 8086
以外にも 8090
や 8099
ポートも利用しているようだ。8090
と 8099
は go
で実装された Raft と呼ばれる耐障害性や一貫性を保証する為のプロトコル(他には Paxos という)という理解でいいのかな。ま、そんなサービスもバックエンドでは動いている。
データベースを作ってみる
スクリーンショットを撮ったりするのがキツイので以後は出来るだけ HTTP API で色々と操作したい。早速データベースを作ってみる。
curl -X POST 'http://localhost:8086/db?u=root&p=root' -d '{"name": "hogehuga"}'
上記を実行すると何のレスポンスも無い...が Web
のダッシュボードを見ると...
ちなみに以下のように実行すると...
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 メソッド使った時にレスポンスが返ってこないので成功かどうか不明なのでレスポンスコードが返ってくると嬉しいなあと思ったのでお願いしてみました