LoginSignup
2
1

More than 1 year has passed since last update.

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

Posted at

ラズパイと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

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

pidata.PNG

定期的に同期するために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 )

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

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1