MinIOでイレイジャーコーディングを試す

web

オブジェクトストレージの一種であるMinIOでは、イレイジャーコーディングという技術を使って冗長性を高めることができる。具体的には4台のサーバーのうち2台が同時に壊れても無停止でサービスが続けられる。

RAIDとの違いについて

データを失いにくくする試みとしてよく知られているのがRAID1,10,5,6などがあるが、似ているのはRAID5と6だ。これらは誤り訂正符号を複数のディスクに分割保存することで耐障害性を高めており、その点はイレイジャーコーディングと同じと言える。ただし、RAID6では回復できる損害が2本までなのに対して、MinIOのイレイジャーコーディングでは任意の数にすることができる。(25%から50%まで可変)つまり大規模な記憶装置を組む際により冗長性が高まる。

minIOのerasure-code-calculator より
https://note.cman.jp/server/raid/

手順

proxmox7.3-3で試してみる。本来は別々のマシンでノードとなるサーバーを動かすべきだが、今回は1台の中に4つサーバーを立てて動作を確認してみる。HDDは
前提条件として、proxmoxを導入したマシンにHDD4台以上がつながっている必要がある(試すだけなら一つのHDDのパーティションを分けるだけでもできる)

環境

私の手元のマシンは以下のような構成になっている

Dell ST330 PowerEdge
CPU  :  Xeon E3 1230 v5
MEM  :  24GB ECC DDR4

ストレージ :sda 4TB HDD minioのノード0に接続
              sdb 4TB HDD minioのノード0に接続
              sdc 4TB HDD minioのノード1に接続
              sdd 4TB HDD minioのノード1に接続
              sde 4TB HDD minioのノード2に接続
              sdf 4TB HDD minioのノード2に接続
              sdg 4TB HDD minioのノード3に接続
              sdh 4TB HDD minioのノード3に接続
              sdi 1TB SSD OSが入っている
              
*電源(!?)とLANとストレージがホットスワップ対応

ノードの作成

ubuntu server にminioをインストールするので、ubuntuを入れる。
Create VMから仮想マシンの作成を行う。私は以下のようになった。

ほとんどデフォルトで設定を終える。ipを固定するオプションもあるが、あとでこのマシンをクローンするため行わない。

ディスクのマウント

ゲストOSにminioがデータを保管するためのHDDをつなぐ。

ホストOS(proxmoxのコンソール)で以下を実行する
#qm set VMID -scsi1 /dev/disk/by-id/scsi-xxxxxxxxxx
例:qm set 102 -scsi1 /dev/disk/by-id/ata-xxxxxxxxxx

scsi-xxxxxxxxxxxの値は、ls -l /dev/disk/by-id/ を実行して適切なものを選ぶ

実行後、(ゲストOSの再起動が必要かもしれない)/dev/sdb が追加されていたらOK

ここからはゲストOSでの作業になる。

XFS

minioではXFSファイルシステムが推奨されている。

sudo gdisk /dev/sdb
o
n
w
ボリュームを1個作成し,sdb1とする
sudo mkfs -t xfs /dev/sdb1   #format
#マウントする
sudo mount /dev/sdb1 /mnt/data/disk1   #あらかじめ/mnt/data/disk1を作っておく

MinIOのインストール

https://min.io/docs/minio/linux/index.html にあるように、インストールをする

wget https://dl.min.io/server/minio/release/linux-amd64/archive/minio_20230102094009.0.0_amd64.deb -O minio.deb
sudo dpkg -i minio.deb

初期設定

minio-user が/mnt/data/disk1にアクセスできるように設定する。

sudo groupadd -r minio-user
sudo useradd -M -r -g minio-user minio-user
sudo chown minio-user:minio-user /mnt/data/disk1

/mnt/data/disk1の所有者が変わっていればOK

minioの設定ファイルを作成する。設定する項目としてはユーザー名、パスワード、HDDへのパスだ。

sudo nano /etc/default/minio
**passwordは8文字以上無いと起動しない

ブラウザでアクセスできた。

MinIOの起動

MinIOをサービスとして起動する。

sudo systemctl start minio
sudo systemctl status minio

自動起動するように設定する

マウントしたHDDが毎回読み込まれるように、fstabを編集し、サービスが自動起動するようにコマンドを実行する

sudo nano /etc/fstab
#最後の行に下の画像のように追記
sudo systemctl enable minio

確認

ブラウザで<IPアドレス>:9000にアクセスして、バケットを作ってファイルをアップロードしたみたところ、正常に動作した。再起動を行ったあとも同じようにアクセスできることを確認した。

イレイジャーコーディングを試す

自動的にイレイジャーコーディングが有効になっているので、本当に効果があるのか試してみる。

先ほどまでは1台サーバーでのテストであったので、4台使うように設定をしていく。以下画像の設定は構成をサーバー4個、ディスク8台にしたときのものだが、MINIO_STORAGE_CLASS=”EC:2″とすることで8台中2台が冗長性のために使用されることになる。この場合ディスク6台分の容量のストレージを作成でき、8台中の2台のHDDが壊れてもデータが保たれる。

作業

 まず先ほどの構成のサーバーをproxmoxのクローン機能を用いて複製して4台にする、4台の通信にはネットワークを使用するため、IPアドレスの固定をしておき、連番のホスト名でアクセスできるようにするためにすべてのサーバーにhootsファイルの設定をする。私はminionode0,minionode1,minionode2,minionode3というようにした。次に、/etc/default/minio のdiskの部分を上の設定を参考に設定する(この場合サーバーが0-3の4台で、それぞれのサーバーがdisk1とdisk2の2台のHDD接続されている)。そしてすべてのサーバーを起動すると完成だ。
試しに4台あるうちの1台シャットダウンをすると以下のように変化した。

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

なお、2台まで失っても動作するためこの状態でアップロード及びダウンロードはできた。
次に、シャットダウンしたノードを復旧するともとに戻った。

ディスクの全消去

1ノードのディスクの全消去を行い、再接続した。数分立つと自動で修復を開始した。
なおこの実験の構成はサーバー4台ディスク4台で行った.修復速度を見たい場合はmc admin heal <your minio name> というコマンドを使う

grafanaで可視化、回復中の動作

およそ6分で100%(7GBほど)修復した。修復にかかる時間は修復する容量が多いほどかかる。なお、修復中にも問題なくアップロード及びダウンロードが出来た。動作を眺めていると、ボトルネックはディスクIOである事がわかった。

コメント

タイトルとURLをコピーしました