今回はInfluxDB第1話です。まずInfluxDB基本コンセプトを紹介・UbnutuのDockerからInfluxDBをインストール・コマンドラインからのデータベース操作、そしてEPC1522内蔵のInfluxDBとNode-redを試します。よろしくお願いします。
Thanks!
今回の記事で使用するEPC1522エッジPCはフエニックス・コンタクトJapanが貸してくださったものです。誠にありがとうございます。
フエニックス・コンタクトは1923年ドイツで設立、全世界55拠点、20,300名の従業員が働くグローバル企業です。
“All Electric Society”のコンセプトで、すべての産業セクターで包括的に電動化、ネットワーク化、自動化の実現などのソリューションを提供していくことを掲げています。産業用生産設備、インフラ、エネルギー、電子機器の接続など様々な用途にフエニックス・コンタクトの製品が使用されています。
日本のフエニックス・コンタクト株式会社は1987年12月に、アジアで初の現地法人として横浜で設立され、現在は国内10営業拠点で事業を展開しています。
HPはこちらです。
https://www.phoenixcontact.com/ja-jp/
What is InfluxDB?
InfluxDBはOpensourcesの時系列データベースです。従来のRelational データベースではTable Formatでデータベースの中にたくさんのTableがあり、各Tableにも関連するイメージです。一方、InfluxDBは時刻情報をメインキーとしたデータを扱う時系列データベースの一つです。
時系列データベースはITの世界では活用されている場合が多く、例えばシステムのMemory・CPUの Utiliziation・Diskの容量・ネットワークTrackingの監視するによく使われています。他にはIOTシステムでセンサーの情報を時間と共に扱うのは便利で、Grafanaのようなデータ可視化ツールと連携も簡単になります。
Elements
InfluxDBは様々な部品もありますが、今回の記事ではいくつか重要な部品だけを紹介します。では仮にいまこのような時系列のデータをがあるとします。
_time | _measurement | localtion | station | _field | _value |
10:15 | census | TOKYO | T-1 | bees | 15 |
10:15 | census | OSAKA | O-1 | ants | 40 |
10:16 | census | TOKYO | T-1 | bees | 18 |
10:16 | census | OSAKA | O-1 | ants | 31 |
10:17 | census | TOKYO | T-1 | bees | 29 |
10:17 | census | OSAKA | O-1 | ants | 50 |
10:18 | census | TOKYO | T-1 | bees | 26 |
10:18 | census | OSAKA | O-1 | ants | 52 |
_time
Timestampです。InfluxDBは時系列データベースなので、Timestampがあるのは当たり前でしょう。InfluxDBに保存されたデータはすべて_timeがあり、中にデータが書き込まれたときのTimestampが格納されています。
_measurement
String Formatで保存されている_measurementはcensus(個体調査数)です。
_field
FieldにはField Key(_field)/ Field Value(_value)があり、そのField Key x Field Value x Timestmapを組み合わせるとField Setになります。
Field Key
Field Keyは文字列で、この例だとField Key beesとantsになります。
Field Value
Field Valueは該当するField Keyに表現する与え値になります。Field Valueは文字列、Floats、整数、Boolも可能です。この例だとField Key beesは15,18,29,26で、Field Key antsは40,31,50,52になります。
Field Set
field setはField key-Valueの組み合わせで更にTimeStampに紐付けられているものです。
Tags
Exampleデータだとlocaltionとstationは”Tags”です。Tagsは文字列のTag KeysとTag Valueが格納されてます。
Tags Key
先のデータExampleではTags KeyはStationとLocation、2つのTags Keyあります。
Tag Values
次はStation Tag KeysにはT-1とO-1のTag Valueがあり、location Tag KeysはTOKYOとOSAKAのTag Valueです。
Tag sets
Tag setsはTag key-valueの組み合わせになります。先のデータExampleでは以下のTag setsがあります。
location=TOKYO,station=T-1 location=OSAKA,station=O-1 location=TOKYO,station=O-1 location=OSAKA,station=T-1 |
Organization
InfluxDBのOrganizationはUser groupのWorkspaceになります。Organizationが管理するのはBucketだけではなく、dashboard、taskなどもそのOrganizationの下で管理されています。
Buckets
InfluxDBのデータはすべてBucketsの中に保存されています。そのBucketsに貯められたデータは設定されてる期間まではずっと保存します。更にExampleをあげましょう。いまはとある都市の天気データを取っています。
Play with Docker First!
Ubuntu Version
今回使用するのはUbuntu Version 22.04 LTSです。
Docker Installation
下記のLinkからDockerをインストールしてください。
Install InfluxDB Docker
influxdb Dockerをインストールします。
sudo docker pull influxdb |
Start the InfluxDB Server
下記のコマンドでInfluxDB Dockerを起動します。
Portは8086、USERNAME=my-user、PASSWORD=my-passwordです。
sudo docker run -p 8086:8086 \ -v influxdb:/var/lib/influxdb \ -v influxdb2:/var/lib/influxdb2 \ -e DOCKER_INFLUXDB_INIT_MODE=upgrade \ -e DOCKER_INFLUXDB_INIT_USERNAME=my-user \ -e DOCKER_INFLUXDB_INIT_PASSWORD=my-password \ -e DOCKER_INFLUXDB_INIT_ORG=my-org \ -e DOCKER_INFLUXDB_INIT_BUCKET=my-bucket \ influxdb |
Chrome から下記のLINKにアクセスします。
username=my-user,password=my-password
Check the Condition
まずDockerの稼働状態をCheckします。
sudo docker ps |
COTANIER IDとIMAGEはinfluxdbが見えるはずです。
Exectute
InfluxDB コマンドラインを起動します。
sudo docker exec –it 35e2597700b4 /bin/bash |
35e2597700b4 は先ほど確認したCONTAINER IDと同じです。
Check Version
InfluxDBのVersionを確認します。いまInfluxDB Image Versionは2.4.0です。
root@35e2597700b4:/# influx version Influx CLI 2.4.0 (git: 5c7c34f) build_date: 2022-08-18T19:26:48Z |
Check Configuration
InfluxDBのURL、有効しているかをCheckします。
root@35e2597700b4:/# influx config Active Name URL Org * default http://localhost:8086 |
Create Organization
まずOrganizationを作成してみます。
Serverから401のエラーが返答され、認証なしのアクセスはNGだと。
root@35e2597700b4:/# influx org create -n soup01 Error: failed to create org “soup01”: 401 Unauthorized: unauthorized access |
Authentication
まず認証をやります。先程のInfluxDB Server Dashboardにアクセスします。
my-user’s Tokenをクリックします。
Tokenがありますね。”COPY TO CLIPBOARD”ボタンでTokenをCopyします。
次のコマンドでINFLUX_TOKEN変数に定義し先のTokenを貼り付けます。
root@35e2597700b4:/# export INFLUX_TOKEN=Zknskd0l6yGlcu-WlkTfMWBBIdsqR7V7RpznIB3Aal03bs0BIr5Cnnnm-h1_NbzS-EjxsOU-nYcvOgiR801QbQ== |
Create Organization Again
先と同じコマンドでもう一度実行し、一番最後のパラメーターに -t $INFLUX_TOKENを追加すればOrganizationを作成できます。
root@35e2597700b4:/# influx org create -n soup01 -t $INFLUX_TOKEN ID Name 39f953d4a69e707e soup01 |
Dashboardでもう一度確認しましょう。Switch Organizationsをクリックします。
Popupが表示され、soup01の新しいOrganizationが作成されました!
Check Organization List
同じくコマンドラインでも確認できます。
root@35e2597700b4:/# influx org list ID Name 39f953d4a69e707e soup01 64eeccdac1a33dcd my-org |
重複なOrganization名を作成するとエラー422が返答されます。
root@35e2597700b4:/# influx org create -n soup01 Error: failed to create org “soup01”: 422 Unprocessable Entity: organization with name soup01 already exists |
Create the Buckets
新しいBucketsを作成します。
root@35e2597700b4:/# influx bucket create -n soup01 -o my-org -t $INFLUX_TOKEN |
Create Data
データを作成します。
- Organization my-org、Buckets ST2、myHostでtestField=”testData”
- Organization my-org、Buckets ST2、myHostでtestField=”testData2”
- Organization my-org、Buckets ST2、myHostでtempature=30.5
- Organization my-org、Buckets ST2、myHostでtempature=30.7
root@5e024f1d1590:/# influx write -b ST2 -o my-org -p s -t $INFLUX_TOKEN ‘myMeasurement,host=myHost testField=”testData”‘ root@5e024f1d1590:/# influx write -b ST2 -o my-org -p s -t $INFLUX_TOKEN ‘myMeasurement,host=myHost testField=”testData2″‘ root@5e024f1d1590:/# influx write -b ST2 -o my-org -p s -t $INFLUX_TOKEN ‘myMeasurement,host=myHost temperature=30.5’ root@5e024f1d1590:/# influx write -b ST2 -o my-org -p s -t $INFLUX_TOKEN ‘myMeasurement,host=myHost temperature=30.7’ |
Check Query
Queryを作成しデータを取得します。
Organization my-orgのbucket ST2から1時間前のデータを取得します。Serverからデータ返答しました!
root@5e024f1d1590:/# influx query -o my-org ‘from (bucket:”ST2″) |> range(start:-1h)’ Result: _result Table: keys: [_start, _stop, _field, _measurement, host] _start:time _stop:time _field:string _measurement:string host:string _time:time _value:float —————————— —————————— ———————- ———————- ———————- —————————— —————————- 2022-10-02T13:19:46.301108942Z 2022-10-02T14:19:46.301108942Z temperature myMeasurement myHost 2022-10-02T14:07:04.000000000Z 30.5 2022-10-02T13:19:46.301108942Z 2022-10-02T14:19:46.301108942Z temperature myMeasurement myHost 2022-10-02T14:17:18.000000000Z 30.7 Table: keys: [_start, _stop, _field, _measurement, host] _start:time _stop:time _field:string _measurement:string host:string _time:time _value:string —————————— —————————— ———————- ———————- ———————- —————————— ———————- 2022-10-02T13:19:46.301108942Z 2022-10-02T14:19:46.301108942Z testField myMeasurement myHost 2022-10-02T14:00:32.000000000Z testData 2022-10-02T13:19:46.301108942Z 2022-10-02T14:19:46.301108942Z testField myMeasurement myHost 2022-10-02T14:06:08.000000000Z testData2 root@5e024f1d1590:/# |
Check in dashboard
Checkboxからも確認できます。
ST2>myMeasurement>testField>testFieldを選び、Medium last”を選び>SUBMITをクリックしQUERYを発行します。Severから返答ができました。
ST2>myMeasurement>testField>temperatureを選び、Mediumを選び>SUBMITをクリックしQUERYを発行します。Severから返答ができました。
Play with EPC1522!
次はPhoenix Contactに内蔵してるInfluxDBとNodeRedからも試してみましょう。
Check Status
まずEdge>DashboardからInfluxDBがRunningしてるかをCheckします。
Configuration
Chromeからhttps://yourip:8086をアクセスします。
Get Startedで設定が始まります。
初期USER画面が表示されます。
USER情報を入力し、Continueします。
よし、これでOKです。
Quick Startで完了です。
Node-red
下記のLinkでNode-Redにアクセスします。
今回InfluxDBとやりとりするにはそのPlug-inを使用します。
https://flows.nodered.org/node/node-red-contrib-influxdb
Create Data
データをInfluxDB Bucketsに載せてみます。左にあるInflux batch NodeをFlow画面に追加します。
Influx batch Nodeが追加され、ダブルクリックします。
アクセスするSeverを設定します。
Server
ServerのFieldにあるペンICONをクリックします。
NameはNode-Redに表示するNode 名なので入力しなくても大丈夫です。
Version
Version Fieldで該当するServerのVersionを設定します。今回はV2.0にします。
URL
URL FieldはHttps://yourIP:8086を入力してください。
Token
Tokenを入力します。
Token Keyを確認するにはInfluxDBのDashboardにアクセスし、Data>Tokens>User名のところをダブルクリックします。
そのTokenをCopyし、先のToken Fieldに貼り付ければOKです。
Organization
Organizationを確認するにもInfluxDB Dashboardにアクセスする必要があります。
User>User名の下にあるのはOrganizationになります。
Bucket
次はBucketを設定します。
Dashboard>ExplorerでいまOrganizationに管理されているBucketsを一覧できます。
今回使用するのはStation1というBucketsです。
Function
Node-RedでFunction NodeをFlowに追加します。
Function Nodeを開きます。
このCodeを貼り付けます。
msg.payload = [ { measurement: “weather_sensor”, fields: { temp: 5.5, light: 481, humidity: 51 }, tags:{ location:”garden” }, timestamp: new Date() }, { measurement: “alarm_sensor”, fields: { proximity: 1003, temp: 19.5 }, tags:{ location:”home” }, timestamp: new Date() } ]; return msg; |
Concepts
先のMessageは実際このようなメッセージをInfluxDBに送信しています。
Inject
InfluxDB にデータ送信のTriggerを作成するためにinject Nodeを追加します。
Inject once after x secondsに起動のDelayを設定します。
RepeatをIntervalを選び>Cycle時間を1s、つまり1sことにTriggerされます。
3つのNodeを繋がりましょう。
Deploy
右上にあるDeloyボダンでFlowをDownloadします。
Check it
Explore>Data Explorerからデータを確認しましょう。
Queryを作成します。そのQueryというのはデータを取得するリクエストだと思ってください。_fieldと_measureementのすべてを選びます。
SubmitのボタンをクリックしたらDataが上にGraphに表示されるようになりました!
Query Data
次はNode-RedからQuery リクエストを作成します。
influxdb in のNodeをFlowに追加します。
Flow
先ほどとあまり変わらないFlowになります。
Function
FunctionのNodeに以下のCodeを貼り付けてください。
bucket名”Station1”から_measurementのweather_sensorのtemp Fieldのデータ1時間分を取り出します。
msg.query = ` from(bucket: “Station1”) |> range(start: -1h, stop: now()) |> filter(fn: (r) => r._measurement == “weather_sensor”) |> filter(fn: (r) => r._field == “temp”) ` return msg; |
debug
結果がみたいので、Common Nodeからdebug Node追加します。
Test it
最後はInjectをクリックし返答を確認しましょう。
リクエストしたデータがServerから返答しましたね!