この記事のまとめ:
- 時系列データベースのオープンソースソフトウェアであるInfluxDBについて周辺状況からはじめての使う方法まで調べてみたので紹介しています。
背景
時系列データの機械学習をやりたくで、練習用に何かのデータを溜めておこうと思い、今まで使っていたPostgreSQLに溜め込めばいいかと当初は考えていたのですが、改めてテーブルまで作ってみたもののどう考えても非効率。それで少し調べてみたら近年時系列DBなるものがあることを知って、業界ではトップシェアを誇るというInfluxDBを使用してみましたので、動かすまでの手順を記録として残しておきます。
InfluxDBについて
InfluxDBについて全然知らなかったもので、Wikipediaの説明を軽く日本語訳してみます。
InfluxDBは、InfluxData社が開発したオープンソースの時系列DBです。Go言語で記述されており、運用監視、アプリケーションメトリック、IoTセンサーデータ、リアルタイム分析などの分野で、時系列データの高速、高可用性のストレージおよび検索用に最適化されています。 また、Graphiteからのデータの処理もサポートしています。
業界シェアとInfluxData社についても少し調べてみました。
業界シェア
DB-ENGINESというサイトの調査では他の製品を抑え、3年連続スコアNo.1のようです。
InfluxDBをGoogle検索していると日本だからだと思いますが東芝系のGridDBというものも引っかかってきます。そしてGridDBのパフォーマンスがいいと言っています。とりあえず客観的に見てどんな感じなのかもDB-ENGINESが比較してくれているので参考になります。
#個人的にはGridDBは"Recent citations in the news"に日本語記事しかないのと、最終更新が結構古いのが一番気になりました…。
InfluxData社について
全く聞いたことのない会社だったのでcrunchbaseで少し調べてみました。
InfluxData社は2012年創業で比較的新しい会社ですが、2018年2月にSeries Cの出資を受けるレベルまで成長してきています。ただし、出資者がすべてVCやファンドのようなので、大きなユーザー企業からの出資を受けれたり、exitできると確実になりそうですね。今のところ対抗馬は見えていませんが、AWSやGCP次第な気もしますね。
メディアは比較的好印象な感じなのでしばらくは使い続けられることは間違いないでしょう。
InfluxDBのインストール
InfluxData社のホームページからパッケージをダウンロードしてきてインストールすることもできますが、APTでインストールします。
まずはInfluxDBの公開鍵を追加します。
$ curl -sL https://repos.influxdata.com/influxdb.key | sudo apt-key add -
OK
パッケージソースをsources.list
に追加します。
$ source /etc/lsb-release
$ echo "deb https://repos.influxdata.com/${DISTRIB_ID,,} ${DISTRIB_CODENAME} stable" | sudo tee /etc/apt/sources.list.d/influxdb.list
deb https://repos.influxdata.com/ubuntu xenial stable
パッケージリストを更新します。
$ sudo apt update
Hit:1 http://archive.canonical.com/ubuntu xenial InRelease
Hit:2 http://archive.ubuntu.com/ubuntu xenial InRelease
Get:3 http://security.ubuntu.com/ubuntu xenial-security InRelease [107 kB]
Get:4 http://archive.ubuntu.com/ubuntu xenial-updates InRelease [109 kB]
Fetched 216 kB in 1s (133 kB/s)
Reading package lists... Done
E: The method driver /usr/lib/apt/methods/https could not be found.
N: Is the package apt-transport-https installed?
E: Failed to fetch https://repos.influxdata.com/ubuntu/dists/xenial/InRelease
E: Some index files failed to download. They have been ignored, or old ones used instead.
が、aptコマンドはデフォルトではHTTPSに対応していないようです。そのため、指示の通り、apt-transport-https
をインストールします。
$ sudo apt install apt-transport-https
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following NEW packages will be installed:
apt-transport-https
0 upgraded, 1 newly installed, 0 to remove and 226 not upgraded.
Need to get 26.1 kB of archives.
After this operation, 215 kB of additional disk space will be used.
Get:1 http://archive.ubuntu.com/ubuntu xenial-updates/main amd64 apt-transport-https amd64 1.2.27 [26.1 kB]
Fetched 26.1 kB in 0s (218 kB/s)
Selecting previously unselected package apt-transport-https.
(Reading database ... 89128 files and directories currently installed.)
Preparing to unpack .../apt-transport-https_1.2.27_amd64.deb ...
Unpacking apt-transport-https (1.2.27) ...
Setting up apt-transport-https (1.2.27) ...
そして再度アップデートを行うことでInfluxDBがパッケージリストに追加されます。
$ sudo apt update
Hit:1 http://archive.canonical.com/ubuntu xenial InRelease
Hit:2 http://archive.ubuntu.com/ubuntu xenial InRelease
Get:3 http://archive.ubuntu.com/ubuntu xenial-updates InRelease [109 kB]
Get:4 http://security.ubuntu.com/ubuntu xenial-security InRelease [107 kB]
Get:5 https://repos.influxdata.com/ubuntu xenial InRelease [4,731 B]
Get:6 https://repos.influxdata.com/ubuntu xenial/stable amd64 Packages [917 B]
Fetched 222 kB in 2s (93.6 kB/s)
Reading package lists... Done
Building dependency tree
Reading state information... Done
これでようやくaptコマンドでInfluxDBをインストールできます。
$ sudo apt install influxdb
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following NEW packages will be installed:
influxdb
0 upgraded, 1 newly installed, 0 to remove and 226 not upgraded.
Need to get 24.8 MB of archives.
After this operation, 81.0 MB of additional disk space will be used.
Get:1 https://repos.influxdata.com/ubuntu xenial/stable amd64 influxdb amd64 1.6.1-1 [24.8 MB]
Fetched 24.8 MB in 13s (1,883 kB/s)
Selecting previously unselected package influxdb.
(Reading database ... 89134 files and directories currently installed.)
Preparing to unpack .../influxdb_1.6.1-1_amd64.deb ...
Unpacking influxdb (1.6.1-1) ...
Processing triggers for man-db (2.7.5-1) ...
Setting up influxdb (1.6.1-1) ...
Created symlink from /etc/systemd/system/influxd.service to /lib/systemd/system/influxdb.service.
Created symlink from /etc/systemd/system/multi-user.target.wants/influxdb.service to /lib/systemd/system/influxdb.service.
これで今日現在(2018.8.25)の最新版であるv1.6.1のインストールは完了したので、最後に起動してみます。
$ sudo systemctl start influxdb
$ sudo systemctl status influxdb
? influxdb.service - InfluxDB is an open-source, distributed, time series database
Loaded: loaded (/lib/systemd/system/influxdb.service; enabled; vendor preset: enabled)
Active: active (running) since Sat 2018-08-25 18:41:27 JST; 11s ago
Docs: https://docs.influxdata.com/influxdb/
Main PID: 24403 (influxd)
CGroup: /system.slice/influxdb.service
mq24403 /usr/bin/influxd -config /etc/influxdb/influxdb.conf
Aug 25 18:41:27 46683.s.time4vps.cloud influxd[24403]: ts=2018-08-25T09:41:27.356801Z lvl=info msg="Starting precreation service" log_id=0A87CQ9W000 service=shard-precreatio
Aug 25 18:41:27 46683.s.time4vps.cloud influxd[24403]: ts=2018-08-25T09:41:27.356813Z lvl=info msg="Starting snapshot service" log_id=0A87CQ9W000 service=snapshot
Aug 25 18:41:27 46683.s.time4vps.cloud influxd[24403]: ts=2018-08-25T09:41:27.356822Z lvl=info msg="Starting continuous query service" log_id=0A87CQ9W000 service=continuous_
Aug 25 18:41:27 46683.s.time4vps.cloud influxd[24403]: ts=2018-08-25T09:41:27.356834Z lvl=info msg="Starting HTTP service" log_id=0A87CQ9W000 service=httpd authentication=fa
Aug 25 18:41:27 46683.s.time4vps.cloud influxd[24403]: ts=2018-08-25T09:41:27.356841Z lvl=info msg="opened HTTP access log" log_id=0A87CQ9W000 service=httpd path=stderr
Aug 25 18:41:27 46683.s.time4vps.cloud influxd[24403]: ts=2018-08-25T09:41:27.356953Z lvl=info msg="Listening on HTTP" log_id=0A87CQ9W000 service=httpd addr=[::]:8086 https=
Aug 25 18:41:27 46683.s.time4vps.cloud influxd[24403]: ts=2018-08-25T09:41:27.356972Z lvl=info msg="Starting retention policy enforcement service" log_id=0A87CQ9W000 service
Aug 25 18:41:27 46683.s.time4vps.cloud influxd[24403]: ts=2018-08-25T09:41:27.360680Z lvl=info msg="Listening for signals" log_id=0A87CQ9W000
Aug 25 18:41:27 46683.s.time4vps.cloud influxd[24403]: ts=2018-08-25T09:41:27.361318Z lvl=info msg="Storing statistics" log_id=0A87CQ9W000 service=monitor db_instance=_inter
Aug 25 18:41:27 46683.s.time4vps.cloud influxd[24403]: ts=2018-08-25T09:41:27.361923Z lvl=info msg="Sending usage statistics to usage.influxdata.com" log_id=0A87CQ9W000
activeとなっているので問題ないようですね。
InfluxDBをはじめて使ってみる
データベースの作成
公式のドキュメントの Getting started を見ながら進めていきます。
ローカルにInfluxDBがインストールされている場合には下記のコマンドでInfluxDBのCLIが起動し、ローカルのInfluxDBインスタンスに接続されるようです。-precision
引数はタイムスタンプのフォーマットと精度を指定する引数で、今回はrfc3339
でRFC3339フォーマット形式(YYYY-MM-DDTHH:MM:SS.nnnnnnnnZ)を指定していることになります。
$ influx -precision rfc3339
Connected to http://localhost:8086 version 1.6.1
InfluxDB shell version: 1.6.1
>
CLIからCREATE DATABASE
コマンドでデータベースを作成できます。下記では、mydb
という名前のデータベースを作成できます。
> CREATE DATABASE mydb
>
なお、古い記事ではWeb UIからデータベースの作成ができると書いてありますが、version 1.3以降は使えなくなっています。
データベースの読み書き
データベースの読み書きをするためには先だって使用するデータベースを宣言する必要があります。
USE
コマンドで使用するデータベースを宣言できます。下記ではmydb
を使用する場合の例です。
> USE mydb
using database mydb
データベースフォーマット
InfluxDBのデータベースは、通常のリレーションデータベースとは異なり、下記の4つの要素のみで構成されます。
time
: タイムスタンプ。
measurement
: リレーションデータベースで言うところのテーブルに相当。
field
: フィールド名とデータの値のセット。少なくとも1つ以上のセットが必要です。
tag
: 値に関するメタデータ。設定しないこともできますし、複数設定することもできます。
field
とtag
はリレーションデータベースでいうカラムに相当しますが、それぞれ数値と文字列しか扱いません。また、それらの4つの要素をまとめた一つのデータセットをpoint
といいます。InfluxDBはこの組み合わせしかないため、リレーションデータベースのようにテーブルの構成要素(スキーマ)を定義する必要がありません。また、NULL
値が保管されることもありません。
point
の記述は下記のフォーマットで行います。
<measurement>[,<tag-key>=<tag-value>...] <field-key>=<field-value>[,<field2-key>=<field2-value>...] [unix-nano-timestamp]
[unix-nano-timestamp]
の定義はこちらをご覧ください。
例えば、次のような株価についてのデータセットを扱うとします。
time | measurement | tags | fields |
timestamp | marketplace | exchange | company | bid | ask |
2018-08-30T15:00:00.000000Z | newyork | NASDAQ | TM | 125.62 | 125.63 |
2018-08-30T15:00:00.000000Z | newyork | NASDAQ | AMZN | 1986.90 | 1986.91 |
これをpoint
で表すと次のようになります。
newyork,exchange=NASDAQ,company=TM bid=125.62,ask=125.63 1535608800000000000
newyork,exchange=NASDAQ,company=AMZN bid=1986.90,ask=1986.91 1535608800000000000
データベースへの書き込み
上記のフォーマットの記述方法がわかれば、書き込みは簡単です。
書き込みはSQLと同じく、INSERT
コマンドですが、それに続くシンタックスが上記のフォーマットになります。
例えば上記の例を書き込む場合は次のようになります。
INSERT newyork,exchange=NASDAQ,company=TM bid=125.62,ask=125.63 1535608800000000000
INSERT newyork,exchange=NASDAQ,company=AMZN bid=1986.90,ask=1986.91 1535608800000000000
データベースの読み込み
読み込みもSQLと同じく、SELECT
コマンドが使えます。基本なシンタックスはSELECT
項とFROM
項からなるシンタックスです。
SELECT <field_key>[,<field_key>,<tag_key>] FROM <measurement_name>[,<measurement_name>]
さらにWHERE
項を付ける場合には、次のようなシンタックスになります。
SELECT_clause FROM_clause WHERE <conditional_expression> [(AND|OR) <conditional_expression> [...]]
なお、tag-key
やfield-key
はダブルクォーテーション"
で挟むか、何もつけなくてもよいですが、tag-value
を指定する場合はシングルクォーテーション'
で挟まなければなりません。ダブルクォーテーションや何もつけない場合には認識してくれませんので注意が必要です。filed-value
は何もつけてはなりません。
その他の詳細は、v1.6の公式Docs "Data exploration using InfluxDB"をご覧ください。
データベース操作
大体ざっくりと使い方がわかってきたかと思います。その他のCLIでの操作についてはv1.6の公式Docs "InfluxDB command line interface (CLI/shell)"を見るとわかると思います。気が向いたら必要そうなものを紹介していきます。
今回は以上です。
最後まで読んでいただき、ありがとうございます。
関連記事
InfluxDB用Pythonライブラリの使い方
時系列データベースのオープンソースソフトウェアであるInfluxDBに対して、Pythonからデータベースを操作するための基本的な使い方の説明を行います。
コメント
コメントを投稿