ラズパイとMinIOでデータを同期する。


ラズパイとMinIOでデータを同期する。

前回までにMinIOのインストールが完了。
https://qiita.com/qiitaroi/items/7139ae983b5db2404cdb

今回はラズパイでパケットキャプチャをして、そのデータをオブジェクトストレージと同期させます。
正直、オブジェクトストレージの勉強用なので、キャプチャデータには何の意味もなく、何なら写真でも動画でも、データならなんでも良いけど、たまたま仕事でパケットキャプチャシステムの話が出たので、Wiresharkを使いました。

1、ラズパイでパケットキャプチャしてデータをローカルに保存
2、ローカルとMinIOサーバーで同期して、ローカルファイルを消す
3、MinIOサーバー側のライフサイクルを設定する
4、同期失敗用に古いファイルを消すツールを仕込む

環境

H/W OS IPアドレス ソフトウェア
ラズパイ Pi3b+ Pi4.19.118-v7+ 192.168.3.15 Wireshark/Tshark
Supermicro E300-9D CentOS7.8 192.168.3.18 MinIO server
ノートPC Win10 192.168.3.100 Win10/Firefox

1 ラズパイでパケットキャプチャしてデータをローカルに保存

今回はWiresharkとそのコマンド版のtsharkを使用する。
以下でGUIからWiresharkが使えるようになる。使い方はよくわからない。

$ sudo apt-get update
$ sudo apt-get install wireshark
$ sudo dpkg-reconfigure wireshark-common
$ sudo usermod -a -G wireshark pi

次にローカルでデータを蓄積させるディレクトリの作成とtsharkのインストール

$ sudo mkdir /pidata
$ sudo chown -R pi /pidata && sudo chmod u+rxw /pidata
$ sudo apt-get install tshark

下記でラズパイのWIFIネットワークのwlan0を60秒毎のファイルにして/pidata/以下にaugxxxというファイル名で出力。

$ tshark -i wlan0 -w /pidata/aug -b duration:60

これでこんな感じのファイルがひたすら量産されます。
15680 Aug 28 14:55 aug_00001_20200828145442
19196 Aug 28 15:01 aug_00001_20200828150030
31620 Aug 28 15:02 aug_00002_20200828150130
31632 Aug 28 15:03 aug_00003_20200828150230
25608 Aug 28 15:04 aug_00004_20200828150330

データを溜める為にデータを作成するという行為。
「穴を埋めるために穴を掘る」に似ている。

2、ローカルとMinIOサーバーで同期して、ローカルファイルを消す

まずは、ラズパイにMinIO オブジェクトストレージと会話するためのコマンドラインツール"mc"をインストールしてエイリアスを設定。
(すでにサーバー側にはminioがインストール済みで"minio server /data"コマンドで待機状態にあることが前提。)

$ sudo wget https://dl.minio.io/client/mc/release/linux-arm/mc
$ chmod +x mc
$ cp mc /usr/bin
$ mc alias set minio http://192.168.3.18:9000 minioadmin minioadmin

lsコマンドのテスト。
エラーにならなければOK。

$ mc ls minio

MinIOサーバー側にもローカルと同じ名前(pidata)の専用Bucketを作成。
ここにローカルのデータ流し込む。

$ mc mb minio/pidata

ローカルフォルダとMinio Serverの同期と、同期後のローカルのデータを消すというシンプルなスクリプトを作成。
mc mirror ローカルフォルダ MinIOターゲット名/Bucket名 という使い方。
mcコマンドの使用方法は下記参照。
https://docs.min.io/docs/minio-client-complete-guide.html


$ vi upload.sh
#/bin/sh
if mc mirror /pidata/ minio/pidata; then
    echo "Upload success,Delete local files."
    rm /pidata/*
else
    echo "Minio file upload failed."
fi

実行権を与えて実行

$ chmod +x upload.sh
$ ./upload.sh

ちゃんと入ってることをブラウザでも確認。
オッケー!

定期的に同期するためにcrontabで下記を追記。
毎分ローカルとオブジェクトストレージを同期する。

$crontab -e 
*/1 * * * * ~/upload.sh

これでジャンジャンアップロードが可能になったぜ。
容量制限?アクセス回数制限? 関係なし!
オブジェクトストレージ側で容量足りなくなったら、消すも良し、HDD増設するも良し、スケールアウトするも良し。
自分でコントロールできるって健全。

3、MinIOサーバーのライフサイクルを設定する。

オブジェクトストレージというとデータの長期保存が主な用途になると思うけど、無限に溜めれるわけもなく、
一定期間を過ぎたら別の場所に移動させるか、削除するかを考えなくてはいけない。
MinIOのmcコマンドは、オブジェクトを一定期間保存した後、消したり移動させたりが可能らしい。
今回はちゃんと消えるかを、mc ilmコマンドを使用して検証。

IDとPrefixは任意の文字、TransitionはさらにAWSのGracierとかに送る場合に使う、Tagは別につけなくてもOK。
日付指定の場合
--expiry-date "yyyy-mm-dd"

# mc ilm add --id "testilm01" --prefix "test1" --expiry-date "2020-09-04" --tags "object=ISOs" minio/iso
    Lifecycle configuration rule added with ID `testilm01` to minio/iso.
# mc ilm list minio/iso
       ID       |     Prefix     |  Enabled   | Expiry |  Date/Days   |  Transition  |    Date/Days     |  Storage-Class   |       Tags
----------------|----------------|------------|--------|--------------|--------------|------------------|------------------|------------------
 testilm01      |     test1      |    ✓       |  ✓     |  4 Sep 2020  |     ✗        |                  |                  | object:ISOs
----------------|----------------|------------|--------|--------------|--------------|------------------|------------------|------------------

日数指定の場合
--expiry-days "日数"

# mc ilm add --id "testilm02" --prefix "test2" --expiry-days "1" --tags "object=Docs" minio/test01
    Lifecycle configuration rule added with ID `testilm02` to minio/test01.
# mc ilm list minio/test01
       ID       |     Prefix     |  Enabled   | Expiry |  Date/Days   |  Transition  |    Date/Days     |  Storage-Class   |       Tags
----------------|----------------|------------|--------|--------------|--------------|------------------|------------------|------------------
 testilm02      |     test2      |    ✓       |  ✓     |   1 day(s)   |     ✗        |                  |                  | object:Docs
----------------|----------------|------------|--------|--------------|--------------|------------------|------------------|------------------

ただし、バケットを指定しないと行けないので、全体のルールを確認することは難しそう。
どのバケットにどのルールを適用したかはちゃんと把握しておかないと。

# mc ilm list minio/
    mc: <ERROR> Unable to get lifecycle. Bucket name cannot be empty.

4、同期失敗用に古いファイルを消すツールを仕込む

とは言え、ネットワークの問題等でMinIOにうまくアップロードできていないと
ローカルにどんどん溜まってしまうので、1日以上経ったデータは消す。
ツールとしてはtmpreaperというのを使ってみる。(初めて。)
本来はOSの/tmpを定期的に消すのが目的らしいけど、まあいいでしょ。

ラズパイでapt-getでインストールし、/etc/tmpreaper.confを編集

$sudo apt-get install tmpreaper

編集

$ sudo vi /etc/tmpreaper.conf

#SHOWWARNING=true         <コメントアウト
TMPREAPER_TIME=1d         <コメント外して1日に設定(Defaultは7d)
TMPREAPER_PROTECT_EXTRA=''
TMPREAPER_DIRS='/pidata/.' <ファイルパスを指定(defaultは/tmp/.)
TMPREAPER_DELAY=256

これで何があってもローカルには1日分だけしか保存されませんよ。
このプログラムは/etc/cron.daily で動くようになっているけど、cron.dailyがいつ動くかは下記で確認可能。
なんで6:25なんだろう。 まあいいや。

$ grep run-parts /etc/crontab
17 *    * * *   root    cd / && run-parts --report /etc/cron.hourly
25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )

翌朝ちゃんと消えていたので良しとする。