自宅環境センシングの2回目の記事として今回はラズパイ(Raspberry Pi)にデータベースのInfluxDBを入れて将来的にセンシングしたデータをInfluxDB保存していきます。
そして次回は、GrafanaというデータをWebで美しく表示してくれるデータ可視化ツールとラズパイのCPUやRAM使用率などをInfluxDBにインサートしてくれるtelegrafを入れて、まずはラズパイの中のセンシングをしていきます。
- センシングしたデータをラズパイで保存するデータベースInfluxDBの設定 (現在このページにいます)
- InfluxDB+Grafana+telegrafでラズパイデータ可視化 カッコいいグラフを作ろう
前回の自宅環境センシング最初の一歩でラズパイにRaspbian OSを簡単にインストールした方法は以下で書きました。今回はその続き。
ということで今回のInfluxDBの設定はまだまだ準備段階で下準備が長いのが自作のつらいところ。ぜひ頑張って構築していきましょう。
センシングするためのデータベース・可視化ツールをインストールする
下図のようにInfluxDB・Telegraf・Grafana・Chronografをラズパイにインストール・設定してデータを保存・可視化していきます。
メインとなるデータベースInfluxDBは時系列でデータを集積してくれるのでセンシングで取得したデータをグラフ表示したりデータを元に操作(照明など)するのに最適です。
以下の4つのツールをラズパイにインストール・設定していきます。
- データベース:InfluxDB(Web管理 Chronograf)
- 可視化ツール:Grafana
- センシング :Telegraf(ラズパイのCPU・RAM・Diskなど中身をセンシング)
今回はInfluxDBのみインストールして設定、簡単な操作ができるようになるまでやっていきます。
InfluxDB・Chronograf・Grafana・TelefrafはすべてInfluxDataという会社がリリースしているオープンソースソフトウェアです。以下のページからダウンロードできます。
InfluxDB・Chronograf・Grafana・Telefrafをインストール設定していって、最初のゴールは以下のようにラズパイの状態をセンシングして可視化すること。(その後は、ウチの温湿度・照度・紫外線・電力とか水耕栽培の水温・ポンプとかラズパイの無停電電源装置とかの可視化を行っていきます。)
難しいことは置いといてセンシングしたデータを可視化したいだけの場合、この記事では「InfluxDB インストール・最低限の設定」の項目のみ作業を済ませてください。
※補足:以下の枠内の「$」はシェルの命令文です。命令文を打つ時に「$」はつけずに「cat /etc/hosts(例)」などを打ってリターンキーを押してください。「$」がつかない行は命令文の結果です。influxコマンドでinfluxDBに入っている状態では「>」プロンプトになります。行の最初に「>」があるのが命令文、その他の行は結果になります。それと「#」の右側部分は説明文になるのでシェルに入力しないようにしてくださいね。
InfluxDB インストール・最低限の設定
まずはInfluxDBのページの「Installation」を見ながらインストールしてみます。
インストール前の確認
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です。
DBあるかQueryの右のフォームに「SHOW DATABASES」と打つと「_internal」(DB作成前の初期時)が出てきた。
↑右上の「Query Templates」にちょっとしたクエリーがあるので選択してリターンを押すだけでクエリーが発行されて文字を打たなくてもいいのが便利です。
ログイン
コチラでアクセス制限した場合には右上の歯車アイコンを押してConnection Settingsでユーザーとパスワードを入力してログインする必要があります。
(アクセス制限していない場合はこの操作は必要ありません。)
ユーザー作成
この画面からでもユーザー作成できます。Create UserやCreate Admin Userを作ることができますが、これを作ってもアクセス制限していない場合はユーザー・パスワード無しでInfluxDBを操作できる。
Create Admin Userの場合はadminが「true」↓になってCreate Userの場合はadminが「false」になる。Create Admin Userでないとこのページにログインすることはできない。
Create Userは?データベースごとのユーザーかと思いましたが?違うかな?詳細不明
クエリー一覧
このWebページでけっこうな数のクエリーを発行できますので説明しておきます。
見たところSelect文が無いので実際にデータを表示させるのは自分でSelect文を発行するしかなさそう。
クエリーには上画像のように右上のほうのDatabaseから該当のデータベースを選択してクエリーを発行するものもあるのでご注意ください。
Show Databases | データベース一覧表示
| name | _internal | sensor | test | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
name | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
_internal | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
sensor | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
test | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Create Database | データベースを作成 SCREATE DATABASE “データベース名” | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Drop Database | データベースを削除 SDROP DATABASE “データベース名” | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Show Measurements | Measurements一覧表示
| name | table1 | table2 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
name | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
table1 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
table2 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Show Tag Keys | MeasurementsにあるTag一覧表示 SHOW TAG KEYS FROM “Measurements名”
| tagKey | host | type | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
tagKey | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
host | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
type | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Show Tag Values | SHOW TAG VALUES FROM “Measurements名” WITH KEY = “Tag名”
| key | value | host | “raspi” | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
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 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
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を作成して格納する。 https://docs.influxdata.com/influxdb/v1.7/query_language/continuous_queries/ | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
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 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
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” | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
build |
| Branch | Build Time | Commit | Version | unknown | “” | “unknown” | “1.0.2” | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Branch | Build Time | Commit | Version | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
unknown | “” | “unknown” | “1.0.2” | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
network |
| hostname | Raspi2Bp | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
hostname | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Raspi2Bp | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
runtime |
| GOARCH | GOMAXPROCS | GOOS | version | arm | 4 | “linux” | “go1.7.3” | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
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” | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
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
エクスポートよりもバックアップのほうがよさそう。
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などのファイル
まずはinfluxdbを終了させる↓
$ sudo systemctl stop influxdb.service
$ 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
Using metastore snapshot: /home/pi/backup/meta.02
続いて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などをインストールしてラズパイの状態を可視化していきましょう。
コメント