IoTにちょっと興味あって(全く未経験)、Rasberry Piを買ってみようかと思ったけど昨今の情勢もあってか値段が高騰している。
そのうち買ってみるつもりだが、安くなるのを待ちつつIoT関連の技術にちょっと触れてみたい。
IoTのプロダクトだと時系列データベースを使っているものが多いらしい。
センサーデータみたいなものをどんどん格納していくのだと思うが、時系列データベースというものが全く想像つかないので、代表格と思われるInfluxDBをちょっと触ってみる。
https://hub.docker.com/_/influxdb のAutomated Setupの部分を参考に、とりあえずDockerでInfluxDBのセットアップ込みですぐに使える状態のものを使う。
docker run -d -p 8086:8086 --name influxdb \
-v $PWD/data:/var/lib/influxdb2 \
-v $PWD/config:/etc/influxdb2 \
-e DOCKER_INFLUXDB_INIT_MODE=setup \
-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 \
-e DOCKER_INFLUXDB_INIT_RETENTION=1w \
-e DOCKER_INFLUXDB_INIT_ADMIN_TOKEN=my-super-secret-auth-token \
influxdb:latest
BUCKETというものがRDBでいうところのdatabaseっぽい。
コンテナの中に入ってみる。
docker container exec -it influxdb sh
BUCKETのリスト出力。
Docker起動時にDOCKER_INFLUXDB_INIT_BUCKETで指定したmy-bucketが確認できる。
ID Name Retention Shard group duration Organization ID Schema Type
07c17e53661ef6bf _monitoring 168h0m0s 24h0m0s b1326f6776364a21 implicit
bad1a9eb45b1fcb0 _tasks 72h0m0s 24h0m0s b1326f6776364a21 implicit
213640f9d9ad6b19 my-bucket 168h0m0s 24h0m0s b1326f6776364a21 implicit
InfluxDBが起動していると、ブラウザで http://localhost:8086/signin にアクセスできるようになっている。
以下のようなログイン画面になっている。

Docker起動時に指定したUSERNAMEとPASSWORDを入力してログインすると、以下のような画面に

とりあえずデータを入れてみる。
CLIからも入れられるみたいだが、せっかくGUIの画面を見ているので、Exampleでも紹介されているCSVをちょっといじった以下のようなCSVをアップロードする。
(後にデータ参照のためダッシュボードを作るときにデータが少なくて面白くなかったので、同じようなデータを適当に追加した)
#datatype,string,long,dateTime:RFC3339,dateTime:RFC3339,dateTime:RFC3339,string,string,double,string,string
#group,false,false,true,true,false,true,false,false,true,true
#default,,,,,,,,,,
,result,table,_start,_stop,_time,region,host,_value,_measurement,_field
,,0,2023-02-22T20:50:00Z,2023-02-22T20:51:00Z,2023-02-22T20:50:00Z,east,A,15.43,cpu,usage_system
,,0,2023-02-23T20:50:00Z,2023-02-23T20:51:00Z,2023-02-23T20:50:20Z,east,B,42.25,cpu,usage_system
,,0,2023-02-24T20:50:00Z,2023-02-24T20:51:00Z,2023-02-24T20:50:40Z,east,C,39.62,cpu,usage_system
,,1,2023-02-25T20:50:00Z,2023-02-25T20:51:00Z,2023-02-25T20:50:00Z,west,A,62.73,cpu,usage_system
,,1,2023-02-26T20:50:00Z,2023-02-26T20:51:00Z,2023-02-26T20:50:20Z,west,B,3.83,cpu,usage_system
,,1,2023-02-27T20:50:00Z,2023-02-27T20:51:00Z,2023-02-27T20:50:40Z,west,C,83.62,cpu,usage_system
#datetypeは文字通りデータ型を指す。
#groupはIndicates the column is part of the group key.とのこと。グループキーのメンバーかどうかということだが、どういうことかよくわからない。
RDSでいうところのGROUP BYでキーになるような項目的な感じ?
#defaultはデフォルト値
トップ画面から「LOAD YOUR DATA」を選ぶと、データロード方法を選ぶ画面に。
「Flux Annotated CSV」をクリックすると、ファイルアップロード画面に遷移するので上記のCSVをアップロードする。

アップロードできた

データを入れられたので、入れたデータを参照してみる。
トップページに戻り、「BUILD A DASHBOARD」からダッシュボード作成画面を開く。

「ADD CELL」より要素を追加。
GraphやGaugeなど図のタイプを選べるが、デフォルトではGraphになっている。
画面左下でBucketを選択し、GUIでmeasurement(測定データ)、その他項目を絞り込めるようになっている。
右側のSUBMITを押すと、グラフが表示される。

ちなみに、「SCRIPT EDITOR」を押すと、GUIで選んだ条件をクエリとして表すとどうなるのか確認できた。
from(bucket: "my-bucket")
|> range(start: v.timeRangeStart, stop: v.timeRangeStop)
|> filter(fn: (r) => r["_measurement"] == "cpu")
|> filter(fn: (r) => r["_field"] == "usage_system")
|> filter(fn: (r) => r["host"] == "A" or r["host"] == "B" or r["host"] == "C")
|> filter(fn: (r) => r["region"] == "east" or r["region"] == "west")
|> aggregateWindow(every: 1h, fn: mean, createEmpty: false)
|> yield(name: "mean")
ごくシンプルだがInfluxDBがどのようなものか何となくのイメージはできた。
センサーデータなどを取得して異常検知などをするIoTとの相性が良いことはわかった。