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

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

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

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

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


環境

| 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|


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

今回は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

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

# ２、ローカルと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
```
ちゃんと入ってることをブラウザでも確認。
オッケー！

![pidata.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478729/b4b1a3ee-487b-f426-13ff-fbafcb6e2a74.png)


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

```
$crontab -e 
*/1 * * * * ~/upload.sh
```
これでジャンジャンアップロードが可能になったぜ。
容量制限？アクセス回数制限？　関係なし！
オブジェクトストレージ側で容量足りなくなったら、消すも良し、HDD増設するも良し、スケールアウトするも良し。
自分でコントロールできるって健全。

#３、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.
```



#４、同期失敗用に古いファイルを消すツールを仕込む
とは言え、ネットワークの問題等で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 )
```

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