【Iot自宅環境下準備】センシングしたデータをラズパイで保存するデータベースInfluxDBの設定

自宅環境センシングの2回目の記事として今回はラズパイ(Raspberry Pi)にデータベースのInfluxDBを入れて将来的にセンシングしたデータをInfluxDB保存していきます。

そして次回は、GrafanaというデータをWebで美しく表示してくれるデータ可視化ツールとラズパイのCPUやRAM使用率などをInfluxDBにインサートしてくれるtelegrafを入れて、まずはラズパイの中のセンシングをしていきます。

前回の自宅環境センシング最初の一歩でラズパイにRaspbian OSを簡単にインストールした方法は以下で書きました。今回はその続き。

自宅のIot化でLED照明オンオフ(Xiaomi LED)や玄関鍵の開閉(セサミ スマートロック)、壁スイッチのオンオフ、部屋の空気の状態を表示させたりしていますが、不満点は専用のアプリでないと操作できないこと。それと同じメーカーでないと他のメーカーのIot製品は表示・操作できないことが歯がゆい。 Iotの...

ということで今回のInfluxDBの設定はまだまだ準備段階で下準備が長いのが自作のつらいところ。ぜひ頑張って構築していきましょう。

センシングするためのデータベース・可視化ツールをインストールする

下図のようにInfluxDB・Telegraf・Grafana・Chronografをラズパイにインストール・設定してデータを保存・可視化していきます。

メインとなるデータベースInfluxDBは時系列でデータを集積してくれるのでセンシングで取得したデータをグラフ表示したりデータを元に操作(照明など)するのに最適です。

InfluxDB2

以下の4つのツールをラズパイにインストール・設定していきます。

  • データベース:InfluxDB(Web管理 Chronograf)
  • 可視化ツール:Grafana
  • センシング :Telegraf(ラズパイのCPU・RAM・Diskなど中身をセンシング)

今回はInfluxDBのみインストールして設定、簡単な操作ができるようになるまでやっていきます。

InfluxDB・Chronograf・Grafana・TelefrafはすべてInfluxDataという会社がリリースしているオープンソースソフトウェアです。以下のページからダウンロードできます。

InfluxDB・Chronograf・Grafana・Telefrafをインストール設定していって、最初のゴールは以下のようにラズパイの状態をセンシングして可視化すること。(その後は、ウチの温湿度・照度・紫外線・電力とか水耕栽培の水温・ポンプとかラズパイの無停電電源装置とかの可視化を行っていきます。)

Grafanaゴール

難しいことは置いといてセンシングしたデータを可視化したいだけの場合、この記事では「InfluxDB インストール・最低限の設定」の項目のみ作業を済ませてください。

※補足:以下の枠内の「$」はシェルの命令文です。命令文を打つ時に「$」はつけずに「cat /etc/hosts(例)」などを打ってリターンキーを押してください。「$」がつかない行は命令文の結果です。influxコマンドでinfluxDBに入っている状態では「>」プロンプトになります。行の最初に「>」があるのが命令文、その他の行は結果になります。それと「#」の右側部分は説明文になるのでシェルに入力しないようにしてくださいね。

InfluxDB インストール・最低限の設定

まずはInfluxDBのページの「Installation」を見ながらインストールしてみます。

Since its introduction in 2013, the Raspberry Pi platform has grown by leaps and bounds, gaining popularity and showing up in projects all over world.

インストール前の確認

Raspbian OSでRaspberry Pi 3B+,2B+,Zero w,Zero whではInfluxDBは動きました。他のラズパイやRaspbian OSのバージョンによっては動かない可能性もあるようですので以下のように確認してからインストールしてください。

$ cat /etc/os-release
PRETTY_NAME="Raspbian GNU/Linux 9 (stretch)"
NAME="Raspbian GNU/Linux"
VERSION_ID="9"
VERSION="9 (stretch)"
ID=raspbian
ID_LIKE=debian
HOME_URL="http://www.raspbian.org/"
SUPPORT_URL="http://www.raspbian.org/RaspbianForums"
BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs

VERSION_IDが「9」でないとダメみたい。

$ curl -sL https://repos.influxdata.com/influxdb.key | sudo apt-key add -
OK

リポジトリ追加。

$ sudo apt-get update
$ echo "deb https://repos.influxdata.com/debian stretch stable" | sudo tee /etc/apt/sources.list.d/influxdb.list
deb https://repos.influxdata.com/debian stretch stable #このような表示になればOK

インストール

InfluxDBをapt-getでインストール

apt-getで簡単にインストールしていきます。(2019/4最新版1.7.6がインストールされました。)

$ sudo apt-get upgrade
$ sudo apt-get install influxdb

インストール後、以下のようにdpkg -L パッケージ名でapt-getでインストールされたものを一覧表示することができます。

$ dpkg -L influxdb
/.
/etc
/etc/logrotate.d
/etc/logrotate.d/influxdb
/etc/influxdb
/etc/influxdb/influxdb.conf
・・・省略
/usr
/usr/lib
/usr/lib/influxdb
/usr/lib/influxdb/scripts
/usr/lib/influxdb/scripts/influxdb.service
/usr/lib/influxdb/scripts/init.sh
・・・省略
/usr/bin
/usr/bin/influx_stress
/usr/bin/influx_tsm
/usr/bin/influx
/usr/bin/influxd
/usr/bin/influx_inspect
/etc/init.d/influxdb

/usr/bin/influx入っていればInfluxDBのバージョン1.7になっている。

InfluxDBの起動・終了

起動

$ sudo systemctl start influxdb.service

終了

$ sudo systemctl stop influxdb.service
apt-getでインストールした起動ファイルの場所(操作しないでOK)

以下、余談になります。InfluxDBの起動ファイルはこちら↓

/usr/lib/influxdb/scripts/influxdb.service

systemctl enable↓をすると「/etc/systemd/system/influxd.service」のエイリアスができてラズパイ起動時にInfluxDBが自動的に起動します。

$ sudo systemctl enable influxdb.service

以下のパスにエイリアス(ショートカット)ができます。↓

$ ls -al /etc/systemd/system/influxd.service
lrwxrwxrwx 1 root root 36  4月 20 05:15 /etc/systemd/system/influxd.service -> /lib/systemd/system/influxdb.service

influxコマンドをインストール

こちらは古い情報でInfluxDB1.7.6あたりから「sudo apt-get install influxdb」してinfluxコマンドが含まれていましたので以下の操作は必要なくなりました。

apt-getにinfluxdb-clientの中にinfluxコマンドが入っているのですが・・・「InfluxDB shell version: 1.0.2」と古いので一部エラーになるクエリーがあるので使えません。

$ sudo apt-get install influxdb-client #バージョンが古いのでインストールしない。
$ sudo apt-get remove influxdb-client #インストールしてしまった場合は←で削除しましょう。

tarからインストール

もっとも最新版はやはり公式サイトからダウンロードして手動でTarボールからインストールする方法。ラズパイはlinux_armhfのTarボール。

$ wget https://dl.influxdata.com/influxdb/releases/influxdb-1.7.6_linux_armhf.tar.gz
$ tar xvfz influxdb-1.7.9_linux_armhf.tar.gz
$ sudo mv influxdb-1.7.9-1/etc/influxdb /etc/influxdb #etc,usr,varがあるので全て移動する
$ sudo mv influxdb-1.7.9-1/etc/logrotate.d/influxdb /etc/logrotate.d/influxdb
$ sudo mv influxdb-1.7.9-1/usr/bin/* /usr/bin/
$ sudo mv influxdb-1.7.9-1/var/lib/* /var/lib/
$ sudo mv influxdb-1.7.9-1/var/log/* /var/log/
$ sudo mv influxdb-1.7.9-1/usr/lib//* /usr/lib/
$ sudo mv influxdb-1.7.9-1/usr/share/man/man1/* /usr/share/man/man1/
TarのInfluxDB自動起動

Tarを解凍したものを上記のように移動「mv」すれば/etc/init.dにinfluxdbファイルが移動して自動的にラズパイ再起動時に起動します。

/etc/init.d/influxdb

余談(操作しないでOK)ここまで、

動作確認

apt-getでのインストールが終わると自動で起動するので、ちゃんと起動しているかsystemctlコマンドでテストしてみます。

$ systemctl status influxdb
● influxdb.service - InfluxDB is an open-source, distributed, time series databa
   Loaded: loaded (/lib/systemd/system/influxdb.service; enabled; vendor preset:
   Active: active (running) since Sun 2019-01-20 11:17:44 JST; 5min ago
     Docs: man:influxd(1)
 Main PID: 1604 (influxd)
   CGroup: /system.slice/influxdb.service
           └─1604 /usr/bin/influxd -config /etc/influxdb/influxdb.conf

 1月 20 11:17:44 raspberrypi influxd[1604]: [admin] 2019/01/20 11:17:44 Starting 
 1月 20 11:17:44 raspberrypi influxd[1604]: [admin] 201・・・・省略

「Active: active (running)」など、上記のように表示されたらOKです。表示が止まって終わらないので[Ctrl]+[c]を押すとプロンプト「$」が表示されます。

Tarから手動でインストールした場合に起動出来ていない時は「Active: inactive (dead)」と出るのでなんらかのエラーが発生しています。ラズパイを再起動してみるか、「/usr/lib/influxdb/scripts/influxdb.service」の起動ファイルをチェックして、「/etc/systemd/system/influxd.service」にエイリアスがはられているか、確認しましょう。

activeが確認できたら動作確認してみましょう。PING打ったりデータベースを表示させてみて以下のようになれば正常。

$ curl -sl -I http://localhost:8086/ping
HTTP/1.1 204 No Content #この表示になればちゃんと接続できています。
Content-Type: application/json
Request-Id: aea43b2a-1c5b-11e9-8003-000000000000
X-Influxdb-Version: 1.0.2
Date: Sun, 20 Jan 2019 02:32:50 GMT
$ curl http://localhost:8086/query --data-urlencode "q=SHOW DATABASES" #データベース一覧表示 初期時は_internalのみ
{"results":[{"series":[{"name":"databases","columns":["name"],"values":[["_internal"]]}]}]}

シェルからは8086・Webからは8083にアクセス。間違えやすい。

$ ss -lntp | grep 808
LISTEN     0      128         :::8083                    :::*                  
LISTEN     0      128         :::8086                    :::*            
LISTEN     0      128         :::8088                    :::*         

8088ポートは詳細不明・・・ラズパイでは最初からオープンになってたような気がします。

アクセス制限

ローカルエリアでラズパイを運用する場合は外部からアクセスされる可能性は低いのですが、後々公開する場合はアクセス制限をしておきましょう。

公開しないでラズパイでとりあえず使いたい場合やローカルエリアでしか使わないときは特にアクセス制限はする必要なさそうです。

ユーザー作成

ユーザー作成からしていきます。作成する方法はシェルでInfluxコマンドで入ってCEATE USERで作る方法とWebブラウザでアクセスする方法があります。

Influxコマンドでユーザー作成してみましょう。

ユーザーは以下の例では「root」になります。パスワードは'xxxxx'の中を書き換えて実行してください。「ALL PRIVILEGES」ですべての特権があるユーザーを作成します。

$ influx
> CREATE USER root WITH PASSWORD 'xxxxx' WITH ALL PRIVILEGES

こちらのWebブラウザからユーザー作成する方法の場合は「Create Admin User」を選んで作成してください。アクセス制限をする場合はどちらかの方法でユーザーを作成しておいてください。

influxdb.confでアクセス制限設定

シェルでviやvimエディタを使ってinfluxdb.confファイルを編集します。もし苦手な場合はpicoエディタを使うと簡単かもしれません。以下の「vim」の部分を「pico」などに置き換えて編集してみてください。

vi(vimでも可、インストールはsudo apt-get install vim)の編集・操作方法を簡単に説明すると、シェルでsudo vi /etc/influxdb/influxdb.confでリターン、該当箇所を検索「/auth\-enabled」リターンを押すとジャンプしますので、右矢印(もしくは[Fn]+['])でauth-enabledの右にある「false」の「f」まで移動します。

「x」キーを5回押して「false」を消して「i」キーを押すと編集モードになりますので「true」を入力します。

入力が終わったら「:」([shift]+[;])を押して「wq」と入力してリターンを押せば保存完了。

viの操作を誤っておかしくなったので、保存しないで終了したい時は「:」を押して「q!」と入力してリターンを押してください。

編集箇所は以下のようにauth-enabledの部分の「false」を「true」に変更します。

$ sudo vim /etc/influxdb/influxdb.conf
・・・省略
[http]
  enabled = true
  bind-address = ":8086"
  auth-enabled = true
  log-enabled = true
  write-tracing = false
  pprof-enabled = false
  https-enabled = false
  https-certificate = "/etc/ssl/influxdb.pem"
・・・省略

うまく編集できたら以下のようにInfluxDBを再起動しましょう。

$ sudo systemctl restart influxdb

これでユーザー・パスワードでアクセス制限することができました。

次回からのinfluxコマンドでのログインは以下のようにします。(ユーザーをrootにした場合)

$ influx -username root -password 'xxxxx'

上記まで特にエラー無く進んだ場合はInfluxDBが使える状態ですので、以下の作業は特にしなくてもOKです。

ここからはInfluxDBでトラブルになった時やInfluxDBを詳細に操作できるようにしたい場合に参照してください。

InfluxDBのデータ構造

InfluxDBのDB・measurement・Tag・Fieldの関係は以下のようになっています。

Fieldには数値しか入れられません。timeは時系列データベースのInfluxDBならではで、特に指定しなければ登録した時刻が自動的に入ります。TimeとFieldがデータでDB・measurement・TagはFieldのデータを区別・探しやすいようにアドレス的な要素です。

DB1(データベース)
 ├ measurement1(table)
 │ ├ time
 │ ├ Tag1=aaa1
 │ ├ Tag2=bbb1
 │ ├ Field1=数値
 │ └ Field2=数値
 ├ measurement2(table)
 │ ├ time
 │ ├ Tag1=aaa1
 │ ├ Tag2=bbb1
 │ ├ Field1=数値
 │ └ Field2=数値
 └ measurement3(table)
   ├ time
   ├ Tag1=aaa1
   ├ Tag2=bbb1
   ├ Field1=数値
   └ Field2=数値
DB2(データベース)
 └ measurement1(table)
   ├ time
   ├ Tag1=bbb1
   ├ Tag2=bbb1
   ├ Field1=数値
   └ Field2=数値

他のデータベースと違ってInfluxDBは単純な構造なのでサクサク動いて速いのかもしれません。

influxコマンドでクエリーを発行する

DB作成テスト

InfluxDBにデータベース「test」を作ってみましょう。curlコマンドでHTTP経由でクエリーを発行するには以下のように打ちます。

$ curl -i -XPOST http://localhost:8086/query --data-urlencode "q=CREATE DATABASE test"
HTTP/1.1 200 OK #この表示は無事にクエリーが成功しています。
Connection: close
Content-Type: application/json
Request-Id: e88525b7-6581-11e9-8010-000000000000
X-Influxdb-Version: 1.0.2
Date: Tue, 23 Apr 2019 04:40:23 GMT
Transfer-Encoding: chunked

{"results":[{}]}

もしユーザー・パスワードを作った後にデータベースを作成しようとすると「HTTP/1.1 400 Bad Request」のエラーになりますので、URLの部分のqueryのあとに「?u=root&p=パスワード」を入れてダブルクォーテーションで囲んで以下のようにすると「test」DBが作成できます。

$ curl -i -XPOST "http://localhost:8086/query?u=root&p=パスワード" --data-urlencode "q=CREATE DATABASE test"

返答のHTTPで4XX系が表示されたらエラー、2XXが表示されたら正常です。

  • 204 No Content:OK
  • 400 Bad Request:エラー
  • 401 Unauthorized:ユーザー認証失敗

データインサート テスト

今作ったデータベース「test」にシェルのcurlコマンドを使ってtemp=25.85とhum=98.5245のデータをインサートしてみます。

InfluxDBのmeasurementは他のMySQLなどのデータベース管理システム (RDBMS)でいうところのTableに相当するもの。measurementはfieldと一緒にインサートすれば自動で作れます。データベースのように「Create measurement 名前」などのようにしてmeasurementだけ作ることはできません。

では、データベース「test」にデータをインサートしてみましょう。

--data-binaryの後は'measurement名 field1=数値,field2=数値'というルールでmeasurementとfieldの間は「 」(半角スペース)でfieldとfieldの間には「,」(カンマ)を入れます。例えばこのように→'table1 temp=25.85,hum=98.5245'書きます。

$ curl -i -XPOST "http://localhost:8086/write?db=test&u=ユーザー&p=パスワード" --data-binary 'table1 temp=25.85,hum=98.5245'
HTTP/1.1 204 No Content
Content-Type: application/json
Request-Id: c215fd07-1cf4-11e9-8011-000000000000
X-Influxdb-Version: 1.0.2
Date: Sun, 20 Jan 2019 20:48:36 GMT

その他にtag(タグ)がありまして、host=raspiやtype=name2のようなデータを判別するための文字列でタグは特に必要なければ省略可能。下で説明します。

インサート時にmeasurement(table)、tag、fieldのカンマとスペースに注意

まとめると以下のような配置にしないとうまく登録できないのでご注意ください。

measurement,tag1=a,tag2=b (半角ペース)field1=1,field2=2,field3=3

ようは最初のフィールドの前には必ず半角ペースを入れて、その他のフィールドとフィールドの間、measurementとタグの間などはすべてカンマを入れればOKです。これを間違えるとフィールドがタグとして認識されたりしてうまくいきません。自分はこれで相当悩みました・・・

実際には以下のようになります。タグは省略可能です。

$ curl -i -XPOST "http://localhost:8086/write?db=test&u=ユーザー&p=パスワード" --data-binary 'table1,host=pc,type=home temp=25.85,hum=98.5245'

measurementにデータが入っているか確認

クエリーSELECT * FROM table1を使ってデータがうまく登録されたか確認してみましょう。

成功例

まずは成功例、1行目のデータ登録--data-binaryの右のほうに注目してください。「table1 temp=25.85」tableの後に半角スペースが入っています。

$ curl -i -XPOST "http://localhost:8086/write?db=test&u=ユーザー&p=パスワード" --data-binary 'table1 temp=25.85,hum=98.5245'
$ curl -G 'http://localhost:8086/query?db=test&pretty=true' --data-urlencode 'q=SELECT * FROM table1'
{
    "results": [
        {
            "series": [
                {
                    "name": "table",
                    "columns": [
                        "time",
                        "hum",
                        "temp"
                    ],
                    "values": [
                        [
                            "2019-04-23T05:33:07.237833738Z",
                            98.5245,
                            25.85  #数値がダブルクォーテーションで囲われていない
                        ]
                    ]
                }
            ]
        }
    ]
}

このようになりました。もしvaluesの中身の数値に"(ダブルクォーテーション)で囲われている、例えば"98.5245"のようになっているとfieldとしてではなく、tag(タグ)として認識されているので失敗です。

失敗例

続いて失敗例、1行目のデータ登録--data-binaryの右のほうに注目してください。「table1,temp=25.85」tableの後にカンマが入っているのでtemp=25.85がtagとして認識されてしまいました・・・こうなるとFieldに「temp」項目が使えなくなって次に正しくFieldに「temp」を入れようとすると同じ名前になってしまうので後から登録するFieldのほうが勝手に「temp_1」になってしまう。

$ curl -i -XPOST "http://localhost:8086/write?db=test&u=ユーザー&p=パスワード" --data-binary 'table1,temp=25.85 hum=98.5245'
$ curl -G 'http://localhost:8086/query?db=test&pretty=true' --data-urlencode 'q=SELECT * FROM table1'
{
    "results": [
        {
            "series": [
                {
                    "name": "table",
                    "columns": [
                        "time",
                        "hum",
                        "temp"
                    ],
                    "values": [
                        [
                            "2019-01-20T20:48:36.533395326Z",
                            98.5245,
                            "25.85" #tagとして認識されてます!!
                        ]
                    ]
                }
            ]
        }
    ]
}

失敗してしまったら、influxコマンドで中に入って一度measurementを削除してしまって、もう一度データを登録してみましょう。削除方法は以下。

$ influx
Visit https://enterprise.influxdata.com to register for updates, InfluxDB server management, and monitoring.
Connected to http://localhost:8086 version 1.0.2
InfluxDB shell version: 1.0.2
> use test
Using database test
> drop measurement table1

「use test」でデータベースを選んでmeasurementの「table1」を削除しましょう。

DBやmeasurementの削除方法はこの記事の下のほうにも書きましたので参考にしてください。

curlコマンドでInfluxDBクエリー発行まとめ

データベース作成、データ登録、measurementの中を表示する方法をまとめました。データベース名などを置き換えて実行してみてください。後ほど個々のセンシングでスクリプト内でcurl を使ってInfluxDBにインサートする機会もあるので1,2度は実行して試すことをオススメします。

#データベース作成
$ curl -i -XPOST http://localhost:8086/query --data-urlencode "q=CREATE DATABASE データベース名"
#データベース削除
$ curl -i -XPOST "http://192.168.31.53:8086/query" --data-urlencode "q=DROP DATABASE データベース名"
#measurementの中を表示
$ curl -G 'http://localhost:8086/query?db=データベース名&pretty=true' --data-urlencode 'q=SELECT * FROM measurement名'
#データ登録
$ curl -i -XPOST "http://localhost:8086/write?db=データベース名" --data-binary 'measurement名,tag1=aa,tag2=bb field1=12.34,field2=56.78'

これでシェルで一通りデータベースの作成とmeasurement、データのインサートもできました。これは後ほどシェルスクリプトでセンシングしたデータをInfluxDBにインサートする時に役に立ちます。

Retention Policy含んだCurl インサート

$ curl -i -XPOST "http://localhost:8086/write?db=データベース名&rp=リテンションポリシー名" --data-binary 'measurement名,tag1=aa,tag2=bb field1=12.34,field2=56.78'

さらにDB削除やSelctなど詳しく操作するにはinfluxコマンドで操作すると便利です。influxコマンドのやり方はこの記事の下のほうにあるコチラを御覧ください。

InfluxDBをブラウザから操作してみる

シェルで操作もできますが、簡単なWebブラウザからも操作してみましょう。ブラウザからアクセスする場合はポートは8083。

こちらは開発終了で今後は代わりにChronografを使うようなので、少し使い勝手が悪いような気がします。

アクセス

同じWifi内にあるWindowsやMacからアクセスするにはWebブラウザで「http://192.168.31.53:8083/」←例(ラズパイのIPアドレス:8083)と打つと接続できます。

ラズパイのIPアドレスが分からない時はシェルでifconfigを実行してみてください。以下の例では「192.168.31.53」がラズパイのIPアドレスになります。

 $ ifconfig
eth0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
・・・省略
lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0 #ループバックアドレス 自分自身
・・・省略
wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.31.53  netmask 255.255.255.0  broadcast 192.168.31.255 #←コレ
        inet6 fe80::5d07:9bd:1340:a637  prefixlen 64  scopeid 0x20<link>
        ether b8:27:eb:c8:ea:80  txqueuelen 1000  (イーサネット)
        RX packets 227455  bytes 48122311 (45.8 MiB)
        RX errors 0  dropped 24  overruns 0  frame 0
        TX packets 99670  bytes 26297992 (25.0 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ラズパイのブラウザからアクセスする場合は「http://localhost:8083/」でOKです。

このような画面↓になります。MySQLをご存知の方はおなじみのphpMyAdminの簡易版のようなもの。Webサーバーは内包されているので特にApacheなどのWebサーバーを別途いれなくてもOKです。

Queryの右のフォーム

DBあるかQueryの右のフォームに「SHOW DATABASES」と打つと「_internal」(DB作成前の初期時)が出てきた。

右下の「Query Templates」にちょっとしたクエリーがある

↑右上の「Query Templates」にちょっとしたクエリーがあるので選択してリターンを押すだけでクエリーが発行されて文字を打たなくてもいいのが便利です。

ログイン

コチラでアクセス制限した場合には右上の歯車アイコンを押してConnection Settingsでユーザーとパスワードを入力してログインする必要があります。

(アクセス制限していない場合はこの操作は必要ありません。)

ユーザー作成

この画面からでもユーザー作成できます。Create UserやCreate Admin Userを作ることができますが、これを作ってもアクセス制限していない場合はユーザー・パスワード無しでInfluxDBを操作できる。

データベースごとにUser

Create Admin Userの場合はadminが「true」↓になってCreate Userの場合はadminが「false」になる。Create Admin Userでないとこのページにログインすることはできない。

データベースごとにUser

Create Userは?データベースごとのユーザーかと思いましたが?違うかな?詳細不明

クエリー一覧

このWebページでけっこうな数のクエリーを発行できますので説明しておきます。

InfluxDB クエリー

見たところSelect文が無いので実際にデータを表示させるのは自分でSelect文を発行するしかなさそう。

InfluxDB クエリー一覧

クエリーには上画像のように右上のほうのDatabaseから該当のデータベースを選択してクエリーを発行するものもあるのでご注意ください。

Show Databases データベース一覧表示
name
_internal
sensor
test
Create Database データベースを作成
SCREATE DATABASE "データベース名"
Drop Database データベースを削除
SDROP DATABASE "データベース名"
Show Measurements Measurements一覧表示
name
table1
table2
Show Tag Keys MeasurementsにあるTag一覧表示
SHOW TAG KEYS FROM "Measurements名"
tagKey
host
type
Show Tag Values SHOW TAG VALUES FROM "Measurements名" WITH KEY = "Tag名"
key value
host "raspi"
 
Show Retention Policies データ保持ポリシー表示
(データの期限を設定する場合に使う)
SHOW RETENTION POLICIES ON "データベース名"

Create Retention Policy データ保持ポリシー作成
CREATE RETENTION POLICY "ポリシー名" ON "データベース名" DURATION 30d REPLICATION 1 DEFAULT
autogenがデフォルト、rp_nameは追加したもの720h=30日でデータベース内の全てのMeasurementsの全てのデータを削除する(データ保持は最低1時間以上)
name duration shardGroupDuration replicaN default
autogen "0s" "168h0m0s" 1 false
rp1 "720h0m0s" "24h0m0s" 1 true
Drop Retention Policy データ保持ポリシー削除
DROP RETENTION POLICY "ポリシー名" ON "データベース名"
Show Continuous Queries 定期的に実行されてFieldを作成して格納する。
Create Continuous Query Continuousクエリー作成
CREATE CONTINUOUS QUERY "cq名" ON "データベース名" BEGIN SELECT min("field名") INTO "testtable" FROM "Measurements名" GROUP BY time(実行する間隔) END
Drop Continuous Query Continuousクエリー削除
Show Users ユーザー一覧表示
user admin
root true
test false
Create User ユーザー作成
CREATE USER "ユーザー名" WITH PASSWORD 'パスワード'
Create Admin User アドミンユーザー作成(すべての特権があるユーザー)
CREATE USER "ユーザー名" WITH PASSWORD 'パスワード' WITH ALL PRIVILEGES
Drop User ユーザー削除
DROP USER "ユーザー名"
Show Stats ステータス表示(結果は省略)
Show DIAGNOSTICS 環境表示
build
Branch Build Time Commit Version
unknown "" "unknown" "1.0.2"
network
hostname
Raspi2Bp
runtime
GOARCH GOMAXPROCS GOOS version
arm 4 "linux" "go1.7.3"
system
PID currentTime started uptime
383 "2019-04-25T04
:24:18.506839603Z"
"2019-04-24T07
:07:16.40560031Z"
"21h17m
2.101244033s"

この他にもSelectなども実行可能だったのでinfluxコマンドと同様な操作がQueryフォームを使ってできそう。

InfluxコマンドでInfluxDBを操作

シェルでコマンドを打つのに慣れている方はinfluxコマンドからクエリーを発行することができます。新たにデータベースを作ったり削除したりSelectする場合はこれが一番早くて便利でした。一通りクエリーを書いておきます。

公式ドキュメントは以下のページを御覧ください。

influxdbのバージョンを確認

influxコマンドを使う前にバージョンを確認してみましょう。

というのもInfluxDBの古いバージョン1.02などで操作すると以下のエラーになりました。

> SHOW FIELD KEY CARDINALITY ON "test"
ERR: error parsing query: found KEY, expected KEYS at line 1, char 12
> SHOW MEASUREMENTS ON "test"
ERR: error parsing query: found test, expected ; at line 1, char 19

確認方法はinfluxコマンドを打った時に出てくるInfluxDB shell version: 1.7.6でこれは最新のバージョン。

$ influx
Connected to http://localhost:8086 version 1.7.6
InfluxDB shell version: 1.7.6
Enter an InfluxQL query

apt-getでインストールした場合のバージョン確認方法は以下↓

$ dpkg -l | grep influxdb
ii influxdb 1.7.6-1 armhf Distributed time-series database.

このようにして確認してください。古いバージョンの場合はエラーになるクエリーがありますのでご注意ください。(バージョン違い、仕組みが変わってエラーになってハマるところがLinuxの辛いところ・・・)

influxコマンド

アクセス制限をした場合は以下のようにUsernameとPasswordオプションをつけてDBに入ります。

# アクセス制限をした場合
$ influx -username root -password 'xxxxx'
# アクセス制限なしの場合
$ influx

アクセス制限をしてユーザー・パスを入れない場合は、DBの中には入れますが全てエラーになりました。

$ influx #アクセス制限してUser・Passオプションなしで入ったときには何をやってもエラーになる。
> use test
ERR: unable to parse authentication credentials

その他のオプションはこちらの公式ドキュメントにあります。

データベース 一覧表示・選ぶ

> show databases #データベース一覧表示
name: databases
---------------
name
_internal
sensor
test
> use test # データベースtestを選ぶ
Using database test

MEASUREMENTS一覧表示

> SHOW MEASUREMENTS ON "test"
# use データベース名でDBを選んだ場合は以下のように省略も可能
> SHOW MEASUREMENTS
name: measurements
------------------
name
table1
table2

Select文

データを表示させたいときにSelect文を使います。

> select * from table1 # MEASUREMENTSの中のTag・Field全て表示
name: table1
------------
time                    host    hum     temp    type
1556169694416924111     raspi   76.25   23.85   1
1556169694416924111     raspi   76.25   23.85   1
1556170240407334428     Linux   68.11   28.85   2
1556170257918590254     Mac     38.11   12.85   3

> select * from table1 where host='raspi' $ hostがraspiのみ表示させる
name: table1
------------
time                    host    hum     temp    type
1556169694416924111     raspi   76.25   23.85   1

TIMEをrfc3339の日付形式で表示させたい場合は以下のようにする。

$ influx -precision rfc3339
> select * from water #以下は例です。
time                           host         place     retentionPolicy wlevel
----                           ----         -----     --------------- ------
2019-07-27T08:31:14.293423935Z esp32-wlevel leaf-wl36 2hours          48
2019-07-27T08:31:15.024275355Z esp32-wlevel leaf-wl39 2hours          65
2019-07-27T08:31:15.216204573Z esp32-wlevel leaf-wl34 2hours          179

データベース作成

> CREATE DATABASE sensor

Insert(データ登録)

最初はMEASUREMENTS(table)とカラム同時に作る。MEASUREMENTSのみを作るクエリーは無い。

Tag(以下のplace=room,host=espd32,type=12)、Field(以下のtemp=17.025213452336,humi=56.0211211356)はあとからも追加可能。

> INSERT table1,place=room,host=espd32,type=12 temp=17.025213452336,humi=56.0211211356
  • MEASUREMENTS:table1
  • Tag:place=room,host=espd32,type=12(カンマ区切り)TagとFieldの間は半角スペース
  • Field:temp=17.025213452336,humi=56.0211211356(カンマ区切り)

この後、Fieldは追加可能。TagなしでFieldのみでも追加可能↓以下サンプル

> INSERT table,place=room,host=esp321 co2=440.456413
> INSERT table,place=bath,host=esp325 atmo=2155.254694561
> INSERT table atmo=2155.254694561 #TagなしでもOK
> INSERT table,place=living,host=esp322 temp=17.025213452336,humi=56.0211211356,atmo=2155.2546394561,co2=440.456413,o=21.123156131313

リテンションポリシー(RETENTION POLICY)を作成

通常のデフォルトのリテンションポリシーはautogenでインサートされたデータの保存期間は無限ですが、リテンションポリシーを設定して有効期限を決めておけば一定時間でデータが削除されるのでディスク容量を節約する。

> CREATE RETENTION POLICY "2day" ON "sensor" DURATION 2d REPLICATION 1

リテンションポリシーを選択するインサート方法

インサート時にリテンションポリシーを選択しない場合はデフォルトのautogenになります。作成したリテンションポリシーを選択する場合は以下のようにする。

> INSERT INTO "2hours" test,host=test ddd=58.32223123

上記例ではRetention Policyは「2hours」でダブルクォーテーションで囲わないとエラーになってインサートできなかった。

通常のインサートと違うところは「INSERT」を「INSERT INTO "Retention Policy"」にする。

Delete(削除)

データベース削除

> DROP DATABASE test

MEASUREMENT削除

> DROP MEASUREMENT test

MEASUREMENT内のデータ削除

> DROP SERIES FROM test

Fieldのタイプを表示する

MEASUREMENTS内にあるフィールドのタイプを表示します。

  • float:浮遊小数点
  • integer:整数

これがちょっと曲者で最初のレコード投稿時に整数を指定すると以降は常に整数になってしまうので、小数点のある数値を投入すると「Fatal error: Uncaught InfluxDB\Exception: HTTP Code 400 {"error":"partial write: field type conflict: input field \"Field名\" on measurement \"measurement名\" is type float, already exists as type integer dropped=1"」になる・・・

> show field keys from test
name: test
fieldKey fieldType
-------- ---------
hpa      float
humi     float
lux      float
noise    float
pga      float
rssi     integer

integerをfloatにする方法はない・・・ので最初にfieldを11.1111などの適当な小数点のある数値を入れてfloatにするしかなさそう。

ということで、最初のインサートでmeasurementを作る時にFieldは全てfloat型(浮遊小数点)にしておいたほうがよさそうです。

InfluxDB エクスポート・バックアップ・リストア

バックアップ・リストアは触り程度しかいじってないので以下の作業は実用的ではないかもしれません。

Export(エクスポート)

exportファイルが生成される。すべてのデータは出力されないみたい。新しいTableはでてこなかった。意味ないなぁ。

$ influx_inspect export -datadir "/var/lib/influxdb/data" -waldir "/var/lib/influxdb/wal" -out "export" -database sensor -retention autogen
writing out tsm file data for sensor/autogen...complete.

Backup

エクスポートよりもバックアップのほうがよさそう。

Using InfluxDB OSS backup and restore utilities for online, Enterprise-compatible use and portability between InfluxDB Enterprise and InfluxDB OSS servers..

metaをバックアップ

$ influxd backup /home/pi/backup

データベースをバックアップ

$ influxd backup -database test /home/pi/backup

こんなファイルが保存される。

以下のようにcronで定期的にバックアップしてみましたが、ファイルが増えすぎるのでやめた。

$ crontab -e
#以下を追加
* * * * 6 /usr/bin/influxd backup -database sensor /home/pi/backup
・・・結果↓
2019/02/28 14:24:25 backing up metastore to /home/pi/backup/meta.00
2019/02/28 14:24:25 backing up db=sensor
2019/02/28 14:24:25 backing up db=sensor rp=autogen shard=28 to /home/pi/backup/sensor.autogen.00028.00 since 0001-01-01T00:00:00Z
2019/02/28 14:24:25 backing up db=sensor rp=autogen shard=38 to /home/pi/backup/sensor.autogen.00038.00 since 0001-01-01T00:00:00Z
2019/02/28 14:24:25 backing up db=sensor rp=autogen shard=48 to /home/pi/backup/sensor.autogen.00048.00 since 0001-01-01T00:00:00Z
2019/02/28 14:24:25 backing up db=sensor rp=autogen shard=58 to /home/pi/backup/sensor.autogen.00058.00 since 0001-01-01T00:00:00Z
2019/02/28 14:24:25 backup complete:
2019/02/28 14:24:25     /home/pi/backup/home/pi/backup/meta.00
2019/02/28 14:24:25     /home/pi/backup/home/pi/backup/sensor.autogen.00028.00
2019/02/28 14:24:25     /home/pi/backup/home/pi/backup/sensor.autogen.00038.00
2019/02/28 14:24:25     /home/pi/backup/home/pi/backup/sensor.autogen.00048.00
2019/02/28 14:24:25     /home/pi/backup/home/pi/backup/sensor.autogen.00058.00

Restore

metaとdatabaseをリストアする必要がある。/home/pi/backupディレクトにファイルを保存しておいた。

meta=meta.00などのファイル

$ sudo influxd restore -metadir /var/lib/influxdb/meta /home/pi/backup
2019/02/28 14:34:05 backing up db=sensor since 0001-01-01 00:00:00 +0000 UTC
2019/02/28 14:34:05 backing up metastore to /home/pi/backup/meta.00
2019/02/28 14:34:05 backup complete

続いてDatabaseのリストア

$ sudo influxd restore -database sensor -datadir /var/lib/influxdb/data /home/pi/backup
Restoring from backup /home/pi/backup/sensor.*
unpacking /var/lib/influxdb/data/sensor/autogen/28/000000001-000000005.tsm
unpacking /var/lib/influxdb/data/sensor/autogen/38/000000001-000000003.tsm
unpacking /var/lib/influxdb/data/sensor/autogen/48/000001444-000000002.tsm
unpacking /var/lib/influxdb/data/sensor/autogen/58/000000001-000000001.tsm
unpacking /var/lib/influxdb/data/sensor/autogen/58/000000002-000000001.tsm
unpacking /var/lib/influxdb/data/sensor/autogen/58/000000003-000000001.tsm
unpacking /var/lib/influxdb/data/sensor/autogen/58/000000004-000000001.tsm
unpacking /var/lib/influxdb/data/sensor/autogen/58/000000005-000000001.tsm

InfluxDBデータのバックアップ・リストアは面倒なのでラズパイをまるごとバックアップする方法で対応します。

以上、これで一通りInfluxDBが操作できるようになったと思います。続いてGrafanaなどをインストールしてラズパイの状態を可視化していきましょう。

スポンサーリンク

コメントをどうぞ

メールアドレスが公開されることはありません。