#MinIO オブジェクトストレージの構築
アマゾンからの警告が来た。
オブジェクトストレージのお勉強で、パケットキャプチャのデータをガンガンS3に上げていたら2000リクエストに近くなったので「金払えやコラ」と。
という事で、自前でオブジェクトストレージを立てようと決心。
1、MinIOの導入 CentOS編
2、MinIOの導入 Docker編
3、MinIOの導入 erasure-coding編
4、サービス停止
環境
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になっていますが気にしないでください。)
ログインして+マークからBucketの作成やオブジェクトのPut/Get/Deleteができちゃう。
本当に簡単。
また、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
#2、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的なやつ)に直接アクセスしようとすると、ほかの色々な設定が必要になると思います。
#3、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
そして、4つのマウントポイントに対してminio発動!
スペースを開けずに{}の中に1から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になっていますが気にしないでください。)
各ボリュームから80MB程度が消費されているので、2ドライブx2セットに分散されている様子
#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なら一度外してしまったら最後、もう一度戻しても他のドライブも巻き込んで再構築が走るもんね。
4、サービス停止
無事動いたら一旦止めておきます。
$ mc admin service stop minio
MinIOはかなり簡単かつ奥が深そうなので、これからも色々試してみよう。
お疲れさまでした。