MinIO オブジェクトストレージの構築

#MinIO オブジェクトストレージの構築
アマゾンからの警告が来た。
オブジェクトストレージのお勉強で、パケットキャプチャのデータをガンガンS3に上げていたら2000リクエストに近くなったので「金払えやコラ」と。

![AWS.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478729/346c78f5-36fc-8bce-6ac9-3e069b889204.png)

という事で、自前でオブジェクトストレージを立てようと決心。


１、MinIOの導入　CentOS編　
２、MinIOの導入　Docker編
３、MinIOの導入　erasure-coding編
４、サービス停止

環境

| H/W | OS | IPアドレス |ソフトウェア
|:-:|:-:|:-:|:-:|
| Supermicro E300-9D |CentOS7.8  |192.168.3.18 |MinIO Server/MinIO Client(mc)|
| ノートPC |Win10  |192.168.3.100 |Firefoxブラウザ|

基本的にMinIOのドキュメントが素晴らしいので、これだけで最低限の構築は可能。
https://docs.min.io/docs/

# 1、MinIOの導入　CentOS編

Webに書いてある通りなのでその通り実行するだけ。
https://docs.min.io/docs/

```
#　wget https://dl.min.io/server/minio/release/linux-amd64/minio
#　chmod +x minio
# ./minio server /data
```
うまく動くと下記のメッセージが出る。
アクセス方法やコマンド、APIのドキュメント先、さらに「パスワード変えとけよ」と至れり尽くせり。

```
Endpoint:  http://192.168.3.18:9000  http://192.168.122.1:9000  http://127.0.0.1:9000
AccessKey: minioadmin
SecretKey: minioadmin

Browser Access:
   http://192.168.3.18:9000  http://192.168.122.1:9000  http://127.0.0.1:9000

Command-line Access: https://docs.min.io/docs/minio-client-quickstart-guide
   $ mc config host add myminio http://192.168.3.18:9000 minioadmin minioadmin

Object API (Amazon S3 compatible):
   Go:         https://docs.min.io/docs/golang-client-quickstart-guide
   Java:       https://docs.min.io/docs/java-client-quickstart-guide
   Python:     https://docs.min.io/docs/python-client-quickstart-guide
   JavaScript: https://docs.min.io/docs/javascript-client-quickstart-guide
   .NET:       https://docs.min.io/docs/dotnet-client-quickstart-guide
Detected default credentials 'minioadmin:minioadmin', please change the credentials immediately using 'MINIO_ACCESS_KEY' and 'MINIO_SECRET_KEY'
```

で、ブラウザでhttp\://192.168.3.18:9000にアクセスするとログイン画面が出る。
鳥がかわいい。（右下のアドレスは14になっていますが気にしないでください。）
![miniologin.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478729/ab204a4b-285f-ff21-0582-e981c5583544.png)


ログインして＋マークからBucketの作成やオブジェクトのPut/Get/Deleteができちゃう。
本当に簡単。
![button.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478729/8796bb3d-fedc-8106-849c-935bcab88e2f.png)

また、MinIOではS3互換のコマンドライン"mc"も作っているのでそれも試す。
https://docs.min.io/docs/minio-client-complete-guide.html
インストールと　**minio = サーバーIPとパスワード**　のエイリアスの設定。


```
# wget https://dl.min.io/client/mc/release/linux-amd64/mc
# chmod +x mc
# cp mc /usr/bin
# mc alias set minio http://192.168.3.18:9000 minioadmin minioadmin
```
状態確認

```
# mc admin info minio
●  192.168.3.18:9000
   Uptime: 1 hour
   Version: 2020-08-27T05:16:20Z
   Network: 1/1 OK

1.3 GiB Used, 4 Buckets, 109 Objects
```

test01というバケットを作成し、test.txtをアップロード

```
# touch test.txt
# mc mb minio/test01
    Bucket created successfully `minio/test01`.
# mc cp test.txt minio/test01
    0 B / ? ┃░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▓┃
# mc ls minio/test01
    [2020-09-01 03:31:26 EDT]      0B test.txt
```

#２、MinIOの導入　Docker編

これもマニュアル通り
https://docs.min.io/docs/

もしDockerが入っていない場合は下記。

```
# yum update
# yum upgrade
# yum install -y yum-utils device-mapper-persistent-data lvm2
# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# yum install -y docker-ce docker-ce-cli containerd.io
# systemctl start docker
# systemctl enable docker
```

MinIOの展開は下記

```
データ保存しないでいい場合
# docker run -p 9000:9000 -e "MINIO_ACCESS_KEY=minioadmin" -e "MINIO_SECRET_KEY=minioadmin" minio/minio server /data
永続的ボリュームが必要な場合
# docker run -p 9000:9000 --name minio1 -v /mnt/data:/data -e "MINIO_ACCESS_KEY=minioadmin" -e "MINIO_SECRET_KEY=minioadmin" minio/minio server /data

```

後は同じですが、Dockerネットワーク外からブラウザでアクセスさせたいので、-p 9000:9000オプションを付けてDocker外（例えばノートPCとか）からはhttp\://192.168.3.18:9000（CentOSのIP:port）のようにしてアクセス可能にします。
Dockerのネットワーク(127.17.0.x的なやつ)に直接アクセスしようとすると、ほかの色々な設定が必要になると思います。

#３、MinIOの導入　erasure-coding編

せっかくなので4つ繋いでイレジャーコーディングを試す。
とはいえ、4つもHDD/SSDは無いので、自宅のSynology NASからiSCSIデバイスを/dev/sdbから/dev/sdeまで10GBずつ4個割り当て。
どうでもいいけど、Synologyは本当に便利。

```
# lsblk
NAME            MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda               8:0    0 745.2G  0 disk
├─sda1            8:1    0     1G  0 part /boot
└─sda2            8:2    0 744.2G  0 part
  ├─centos-root 253:0    0    50G  0 lvm  /
  ├─centos-swap 253:1    0   7.7G  0 lvm  [SWAP]
  └─centos-home 253:2    0 686.5G  0 lvm  /home
sdb               8:16   0    10G  0 disk
sdc               8:32   0    10G  0 disk
sdd               8:48   0    10G  0 disk
sde               8:64   0    10G  0 disk
```

/dev/sdbから/dev/sdeまでをパーティション作成してフォーマット、そしてマウント

```
fdisk/dev/sdb　>>(1パーティションで作成)
mkfs -t ext4 /dev/sdb1
mount -t ext4 /dev/sdb1 /data1
``` 

何もしていなくても36MBくらいは使っているらしい。

```
# df
Filesystem              1K-blocks    Used Available Use% Mounted on

/dev/sdb1                10189076   36888   9611568   1% /data1  #<<36MBくらい何かで使っている
/dev/sdc1                10189076   36888   9611568   1% /data2
/dev/sdd1                10189076   36888   9611568   1% /data3
/dev/sde1                10189076   36888   9611568   1% /data4
```

そして、４つのマウントポイントに対してminio発動！
スペースを開けずに{}の中に１から4までを書くのがルールで、その際間のピリオドは必ず3つ必要。
ドライブ数が12台でも/data{1...12}とするのがルールとの事。

```
# ./minio server /data{1...4}

Formatting 1st zone, 1 set(s), 4 drives per set.
WARNING: Host local has more than 2 drives of set. A host failure will result in data becoming unavailable.
Status:         4 Online, 0 Offline.
Endpoint:  http://192.168.3.18:9000  http://192.168.122.1:9000  http://127.0.0.1:9000
AccessKey: minioadmin
SecretKey: minioadmin

Browser Access:
   http://192.168.3.18:9000  http://192.168.122.1:9000  http://127.0.0.1:9000

Command-line Access: https://docs.min.io/docs/minio-client-quickstart-guide
   $ mc config host add myminio http://192.168.3.18:9000 minioadmin minioadmin

Object API (Amazon S3 compatible):
   Go:         https://docs.min.io/docs/golang-client-quickstart-guide
   Java:       https://docs.min.io/docs/java-client-quickstart-guide
   Python:     https://docs.min.io/docs/python-client-quickstart-guide
   JavaScript: https://docs.min.io/docs/javascript-client-quickstart-guide
   .NET:       https://docs.min.io/docs/dotnet-client-quickstart-guide
Detected default credentials 'minioadmin:minioadmin', please change the credentials immediately using 'MINIO_ACCESS_KEY' and 'MINIO_SECRET_KEY'
```
ちゃんと4drivesがオンラインになっている。

作成したtestbktに約180MBのOSイメージをアップロード。
右下に進捗が出る。
(左下のアドレスは14になっていますが気にしないでください。)
![copy.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478729/95932c53-9dba-d037-6cef-56516256846c.png)


各ボリュームから80MB程度が消費されているので、2ドライブｘ2セットに分散されている様子

```
#df
Filesystem              1K-blocks    Used Available Use% Mounted on

/dev/sdb1                10189076  118876   9529580   2% /data1  #<<118MBくらいになった。（82MBくらい増えた）
/dev/sdc1                10189076  118876   9529580   2% /data2
/dev/sdd1                10189076  118876   9529580   2% /data3
/dev/sde1                10189076  118876   9529580   2% /data4
```

この状態でiscsiボリュームをunmountしてみる。
グッバイ/disk4..

```
# umount /disk4
```

エラーメッセージが出た。

```
API: WebStorageInfo()
Time: 21:56:00 JST 08/12/2020
DeploymentID: 2d2ca653-ca60-4de7-aaca-7fbdf3ac3e09
RemoteHost: 127.0.0.1
Host: 127.0.0.1:9000
UserAgent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0
Error: unformatted disk found
       disk=/data4
       2: github.com/minio/minio@/cmd/erasure-metadata-utils.go:133:cmd.readAllFileInfo.func1()
       1: github.com/minio/minio@/pkg/sync/errgroup/errgroup.go:55:errgroup.(*Group).Go.func1()
Found drives to heal 1, proceeding to heal content...
Disk `/data4` is a root disk. Please ensure the disk is mounted properly, refusing to use root disk.
```
この状態のままファイルをアップロードすると、ほかの3個のHDDにはデータが入っている。
当然、外したドライブのマウントポイントにはアップロードしたデータはない。

さらに/disk4をmountしなおしてからファイルをアップロードすると、何事もなかったかのようにデータが入っている。

これがオブジェクトストレージの恩恵か。
普通のRAIDなら一度外してしまったら最後、もう一度戻しても他のドライブも巻き込んで再構築が走るもんね。

# ４、サービス停止
無事動いたら一旦止めておきます。

```
$ mc admin service stop minio
```
MinIOはかなり簡単かつ奥が深そうなので、これからも色々試してみよう。
お疲れさまでした。