コモノポリタン

コモノ、デジモノが好きなKomonopolitan住民 (はてなダイアリーからの引っ越しです)

【Home Assistantでホームオートメーション】「汎用」InfluxDBサーバ構築

【Home Assistant(Hass.io)】
汎用InfluxDBサーバーを立ち上げる

「Home Assistant(Hass.io)でホームオートメーション 再起動!」シリーズです。

 Home Assistantに供給する気象データなどの格納先として、独立した時系列データベースサーバを立ち上げましょう。

0. なぜ独立サーバーを?

 最初にHome Assistant用のセンサー情報収集の仕組みを作ったときは、Raspberry Pi Zero Wに「Bluetooth Low Energyでセンサーと接続する仕組み」と「時系列データベース」の二つを一緒に押し込みました。

【Home Assistant(Hass.io)でホームオートメーション】2. 環境センサー(Omron)を接続 ー 中編 - コモノポリタン

 ところが最近、洗面台の裏にあるそのRaspberry Pi Zero Wが良く落ちます。やはりSDカードにDB(InfluxDB)を載せてガリガリ読み書きさせるとダメなのでしょうか?
 本体のHass.ioのサーバも同様の懸念があるらしいので、「Raspberry PiはすべからくSDカードで運用しない」というのが根本的解決のような気がします。が、しかし、

  • 非常に残念なことにHass.ioはまだRaspberry PiのUSBブート(SDカード無し運用)に対応していない
  • 洗面台裏サーバ(Raspberry Pi Zero W)はスペースの都合でSDカード以外は対応できない*1

という事情があるので、次善の策として、ガリガリとデータを読み書きするDBを分離して、独立したDBサーバを作りそこに書き込んで貰おうという作戦です。
 まあ、Raspberry Piが落ちるのは他の原因かもしれませんが、とりあえず可能性を一つ潰したいということです。これがデータベースを分離して独立にする、という今回の理由の一つ。

 さて、さすがに安定運用を目指して分離したDBサーバがSDカードに依存していたりすると、何をしているか分からなくなるので、Raspberry PiをSDカードで運用するのを辞めてUSB HDD(SSDでも良いと思いますが手元に無し)で運用する仕組みを構築したいと思います。

1. Raspberry PiをHDDから起動する

1.1 HDD起動可能かの確認

 Raspberry Pi 3B+は、最初からUSBブート可能に設定されています。Raspberry Pi 3BはゴニョゴニョするとUSBブート可能になります。それ以外のRaspberry Piは、4も含めてUSBブートには対応していません(追記:Pi4は対応したみたいですが、試してません)。

1.2 USB HDDの準備

 安定運用のためにUSB HDDからブートしたいので、USBバスパワーでの運用は避けます。外部電源で稼働するUSB HDDを選びましょう。今回は押し入れから発掘した500GBのUSB HDD(Buffalo HD-CE500U2)*2を使いました。

 「bootエリアはFAT32でないとだめなのでFAT32でフォーマットしておくべし」しかしながら「Windowsでは32GBまでしかフォーマットできないので32GB以上の場合は何らかのツール(例えばFAT32Formatter)つかうべし」などと言われております。

 実はbalenaEtcherでOSイメージを焼くと、bootドライブをFAT32で書き込んでくれるので、単にWindowsの「ディスクの管理」でUSB HDDのパーティションを削除して「未割当」に戻して置くだけで大丈夫でした。

1.3 USB HDDにRaspberry Pi OS(32bit) Liteイメージを焼く

 HDDから起動できるようにするために、色々とやり方がネットにありましたが、balenaEtcherでSDカードにRaspberry Pi OS(32bit) Lite(旧Raspbian Lite)のイメージを焼くのとまったく同じ手順で出来ました。

  1. Raspberry Pi OS(32bit) LiteのイメージをRaspberryのサイトからダウンロード
  2. balenaEtcherを起動して、Raspberry Pi OS(32bit) Liteのイメージを選択して、次にHDDを書き込み先に指定します。Flash!のボタンを押すと「Drive XXXX is unusually large for an SD card or USB stick. Are you sure ....(なんかSDカードに思えないでっかいディスクだけど大丈夫かぁ?)」と言われますが、そこはContinueで。
  3. しばらくすると書き込みが終わります。

 私が今回使ったUSB HDDは容量が500GBでしたが、balenaEtcherでイメージを焼き付けるとディスクのパーティション構成は、

  • 256MB:ブートエリア(FAT32)
  • 1.47GB:プライマリパーティション
  • 464.03GB:未割当

という感じになりました。
(USB HDDをWindows PCに繋ぎなおして、ディスク管理で確認。raspios buster lite 2020-05-27)

 一旦PCにUSB HDDを繋いで、bootエリアにsshという空ファイルを作っておきます。これがないとsshで接続できませんからね。

1.4 Rasbperry Piに接続して起動

 SDカードを挿さずに、USB HDDをRaspberry Pi 3B/3B+に挿し(とUSB HDDの電源を忘れずにコンセントに挿し)、LANを繋いでRaspberry Piの電源を入れます。何度か(4度ほど?)USB HDDの電源が切れる音がして、都度立ち上がり直して、LANの所がピカピカしだします。落ち着いたところでsshで接続(pi/raspberry)します。

 ログインしたらRaspberry Pi OSの初期設定をしておく。

$ sudo raspi-config

 設定は次の通り。

1. Change User Password:
新しいパスワードを入力
4. Localization Option:
"I1 Change Locale"で、en_US.UTF-8 と ja_JP.UTF-8 を選択(en_GB.UTF-8は外しておきましょう)。選択はスペースバーで。Default localeには、jp_JP.UTF-8を指定
4 Localization Option:
"I2 Change Timezone"で Asia/Tokyoを選択。
4 Localization Option:
"I4 Change WLAN Country"で"JP Japan"を選択。無線LANを使わないなら不要ですが。
5 Interfacing Options:
“P2 SSH” でonにする

 ちなみにfdiskでどんなパーティション構造になっているか確認すると、こんな感じでした。

 Device     Boot  Start       End   Sectors   Size Id Type
/dev/sda1         8192    532479    524288   256M  c W95 FAT32 (LBA)
/dev/sda2       532480 976773167 976240688 465.5G 83 Linux

/dev/sda2が / (root)にマウントされます。広々ですね。

 balenaEtcherで焼いたイメージでは、bootエリア256MB、それ以外のRaspberry Pi OSの領域が1.47GBとなっていましたが、しらないうちにHDDのほぼ全領域が/(root)になっています。実は今のRaspberry Pi OSは、未割当領域が後ろに余っていると初回立ち上げ時にOSの領域を自動的に最大サイズまで拡大する設定になっている、とのこと。便利ですね。らくちん、広々。

2. InfluxDBを導入する

 時系列データを簡単に扱えるデータベースとしてInfluxDBがあります。 InfluxDB: Open Source Time Series Database | InfluxData

 今回は今後の拡張も考えて、時系列データベースのInfluxDB、情報収集用のTelegraf、可視化用のGrafanaをセットで導入します。

2.1. InfluxDB v1.8インストール

 InfluxDBの安定最新版はv1.8なのですが何故か辿りにくいところにインストールガイドがあります。基本的には下記の通りすすめます。 Install InfluxDB OSS | InfluxDB OSS 1.8 Documentation

InfluxDB v1.8をインストールする前に、まずOSのアップデートをしておきます。

$ sudo apt-get update
$ sudo apt-get upgrade

 2020-05-27のRasPiOSはDebian Busterベースなので、下記のInfluxDataのリポジトリを設定しておく。

$ wget -qO- https://repos.influxdata.com/influxdb.key | sudo apt-key add -
$ echo "deb https://repos.influxdata.com/debian buster stable" | sudo tee /etc/apt/sources.list.d/influxdb.list

追記(2021/12/13):一回壊れたので再インストールしてみた。RaspiOSがBullseyeになってkeyの管理が変わったりしたので下記でリポジトリ設定。ちょっと長い…。

$ sudo su
# wget -qO- https://repos.influxdata.com/influxdb.key | gpg --dearmor > /etc/apt/trusted.gpg.d/influxdb.gpg
# echo "deb [signed-by=/etc/apt/trusted.gpg.d/influxdb.gpg] https://repos.influxdata.com/debian bullseye stable" > /etc/apt/sources.list.d/influxdb.list

influxDBを導入。

$ sudo apt-get update && sudo apt-get install influxdb

influxDBをサービス登録して自動起動できるようにしておく。

$ sudo systemctl unmask influxdb.service
$ sudo systemctl start influxdb
$ sudo systemctl enable influxdb.service

systemctl status influxdbでinfluxdbの起動状況を確認して、active (running)となっていたらOKです。

2.2. Telegraf v1.14インストール

  データ収集用エージェントのtelegrafは今回は使いませんが入れておきます。 https://docs.influxdata.com/telegraf/v1.14/introduction/installation/:embed: title

$ sudo apt-get update && sudo apt-get install telegraf
$ sudo systemctl start telegraf
$ sudo systemctl enable telegraf.service

 これもsystemctl status telegrafでtelegrafの起動状況を確認して、active (running)となっていたらOKです。

2.3. Grafana v7.0.1インストール

 追記(2021/12/13):Home AssistantのGrafanaアドオンを使うときは入れなくてもよし。
 時系列データ可視化ツールのGrafanaも入れておきます。 Grafana® Features | Grafana Labs

Raspberry Pi(ARM)へのインストールは基本下記のとおりです。 Install on Debian/Ubuntu | Grafana Labs

$ wget -qO - https://packages.grafana.com/gpg.key | sudo apt-key add -
$ echo "deb https://packages.grafana.com/oss/deb stable main" | sudo tee -a /etc/apt/sources.list.d/grafana.list
$ sudo apt update && sudo apt-get install grafana

$ sudo systemctl start grafana-server
$ sudo systemctl enable grafana-server.service

http://localhost:3000/でアクセスできればGrafanaはインストールできています。

3. データベースの設定

3.1. ユーザ設定

 InfluxDBへのhttpおよびCLIアクセスを制限するために、まずアクセスするユーザ(今回はroot)を作成する。

$ influx
> create user root with password 'xxxxxx' with all privileges
(管理ユーザ作成。パスワードをシングルクォーテーション(')で囲うことを忘れずに)
> set password for "root"='xxxxxxxx'
(パスワード変更)
> drop user "root"
(ないと思うけど、rootユーザを削除したいとき)

3.2 アクセス制御

 デフォルトではInfluxDBはアクセス制御が効いていない(=だれでもアクセスできる、ま、便利ではありますが)ので、アクセス制御を有効にする。InfluxDBの設定ファイル(/etc/influxdb/influxdb.conf)をエディタ(nanoなど)で編集する。

$ sudo nano /etc/influxdb/influxdb.conf

後ろの方にある[http]セクションのauth-enabledをtrueにする。

(略)
[http]
  auth-enabled = true
(略)

confファイルを編集したら、influxdbサービスを再起動する。

$ sudo systemctl restart influxdb

CLI (Command Line Interface)でInfluxにアクセスするときは、user/passwordが必須になる。

$ influx -precision rfc3339 -username root -password 'xxxxxxxxx'

パスワード間違っていても入れるが、操作できない。 ERR: authorization failed なんて言われる。

4. InfluxDB覚書

 CLI (Command Line Interface)でInfluxにアクセスする。-precision rfc3339は、タイムスタンプの可読性を上げるおまじない。

$ influx -precision rfc3339 -username root -password 'xxxxxxxxx'

データ操作以外の操作。

> show databases
   (データベースの一覧)
> use <database>
   (データベースの指定。これをやらないと以下のコマンドは使えません)
> show measurements
   (measurement(リレーショナルDBの「表(table)」みたいなもの)の一覧)
> show tag keys [from <measurements]
   (tag(リレーショナルDBの「キー」みたいなもの)の名前の一覧)
> show tag values [from <measurements] with key=<tab>
   (あるtagに格納されている値(キー値)の一覧)
> show field keys [from <measurements]
   (fieldの名前の一覧)
> select count(<field key>) from <measurement>
   (格納されているデータ総数を表示)
> select first(<field key<) from <measurement>
   (最初のデータの日付の確認)
> create database home_assistant
 (データベースの作成)
 (influxdbインテグレーションを使うときは上記データベースが必要)

 データのバックアップとリストア。本来的にはデータの保管だが、今回はデータの引っ越しに使用。 今、wxbeacon2のデータを格納しているinfluxdbが稼働しているRaspberry PiのInfluxDBの設定ファイル(/etc/influxdb/influxdb.conf)のbind-addressのコメントを外して、汎用InfluxDBサーバーからリモート(かつライブ)でバックアップが取れるようにする。

bind-address = "192.168.xx.xx:8080"

引っ越し先のRaspberry Pi(汎用InfluxDBサーバー)から今までのInfluxDBに接続してバックアップし、書き戻す。

$ influxd backup -database weather -portable -host 192.168.xx.xx:8080 ./backup
$ influxd restore -db weather -portable -newdb sensors ./backup

1年弱分(3台)のデータでどちらも1分以内に終了。

5. おわりに

センサーデータの格納場所を作り直したので、次は、Omronのセンサーサーバのアップデートかな。

maky-ba.hatenablog.com

*1:USB HDDどころかSSDですら置けない。常に化粧品のボトルと置き場を争っています…

*2:本来であれば、常時稼働に適したHDDを使いたいのでそのうち切り替えましょう