前書き#
最近、Juicefs を使用した S3 ベースのオブジェクトストレージを見つけました。これは非常に使いやすい高可用性のあるストレージソリューションを簡単に実現できますので、インストールとデプロイの手順、および遭遇する可能性のある問題を記録しておきます。
この記事の対象読者#
-
Linux サーバーを持っていて、複数のディスク(パーティション)を持っている必要があります。物理ディスクを直接使用することが最適ですが、仮想ディスクやパーティションも使用できます。
-
Docker に一定の知識が必要です。
-
(家庭用の高可用性ストレージ)を構築したい読者
他のソリューションとの比較#
よく知られているように、高可用性ストレージには GlusterFS、Ceph、ZFS などのシングルノード / クラスタソリューションがあります。
GlusterFS、HDFS などのこれらのソリューションは、家庭ユーザーにとってコストが高すぎるため、複数のレプリカとノードを必要とします。また、Ceph クラスタも同様で、多重レプリカとエラー訂正コードのモードを要件に応じて切り替えることができますが、運用コストが非常に高くなります。そのため、最近の数年間で Minio ソリューションを検討しました。Minio はオープンソースの S3 互換オブジェクトストレージで、エラー訂正コードメカニズムを使用し、読み書きのアービトレーションを備えており、デプロイとデータの復元が容易です。
Minio のインストール#
私は 12 ベイのサーバーを 1 台持っており、それを Minio サーバーとして使用しています。
システムのインストール#
Ubuntu/Debian/Centos/Suse など、任意の Linux システムをインストールできます。
Docker のインストール#
インストール方法はこちらを参照してください。
ディスク(パーティション)の準備#
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 279.4G 0 disk
|-sda1 8:1 0 278.4G 0 part /
|-sda2 8:2 0 1K 0 part
`-sda5 8:5 0 976M 0 part [SWAP]
sdb 8:16 0 279.4G 0 disk
sdc 8:32 0 2.7T 0 disk /mnt/disk1
sdd 8:48 0 2.7T 0 disk /mnt/disk2
sde 8:64 0 2.7T 0 disk /mnt/disk3
sdf 8:80 0 2.7T 0 disk /mnt/disk4
sdg 8:96 0 2.7T 0 disk /mnt/disk6
sdh 8:112 0 2.7T 0 disk /mnt/disk5
ここで、6 つのディスクがあり、複数のパーティションも使用できます。次のコマンドを使用してディスクを xfs 形式でフォーマットします。
$ mkfs.xfs /dev/sdc -L DISK1
ディスクに適切なラベルを付けるために、私の場合は DISK1-6 に対応するラベルを付けました。これにより、ディスクをマウントする際に再起動後にディスクの読み取り順序が誤っているため、マウント位置が誤っていることがなくなります。/etc/fstab
は次のようになります。
# 他のシステムディスクのマウントは省略します
LABEL=DISK1 /mnt/disk1 xfs defaults,noatime 0 2
LABEL=DISK2 /mnt/disk2 xfs defaults,noatime 0 2
LABEL=DISK3 /mnt/disk3 xfs defaults,noatime 0 2
LABEL=DISK4 /mnt/disk4 xfs defaults,noatime 0 2
LABEL=DISK5 /mnt/disk5 xfs defaults,noatime 0 2
LABEL=DISK6 /mnt/disk6 xfs defaults,noatime 0 2
/etc/fstab
を変更した後、mount -a
コマンドを使用してマウント設定を更新し、lsblk
コマンドを使用してディスクが正しくマウントされていることを確認できます。
Minio の実行#
$HOME/minio
などのディレクトリを見つけて、Minio を実行するためのdocker-compose.yaml
ファイルを保存します。内容は次のようになります。
version: "3.7"
# すべてのコンテナに共通の設定と構成
x-minio-common: &minio-common
image: quay.io/minio/minio:RELEASE.2022-11-11T03-44-20Z
# ここに対応するディスクの数を入力します
command: server --console-address ":9001" /disk{1...6}
ports:
- 9000:9000
- 9001:9001
expose:
- "9000"
- "9001"
restart: unless-stopped
environment:
# メトリクス指標を公開します(この行を削除することもできます)
MINIO_PROMETHEUS_AUTH_TYPE: public
# デフォルトのユーザー名とパスワードを設定します
# MINIO_ROOT_USER: minioadmin
# MINIO_ROOT_PASSWORD: minioadmin
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
interval: 30s
timeout: 20s
retries: 3
services:
minio1:
<<: *minio-common
volumes:
# 設定ファイルとマッピングディスクをマウントします
- /home/areswang/minio/config:/root/.minio
- /mnt/disk1:/disk1
- /mnt/disk2:/disk2
- /mnt/disk3:/disk3
- /mnt/disk4:/disk4
- /mnt/disk5:/disk5
- /mnt/disk6:/disk6
docker-compose up -d
コマンドを使用すると、Minio が実行されます。
データの復元方法#
ディスクが 1〜2 枚壊れたと仮定し、lsblk
コマンドで次のように表示されることがわかりました。
sdc 8:32 0 2.7T 0 disk /mnt/disk1
sdd 8:48 0 2.7T 0 disk /mnt/disk2
sde 8:64 0 2.7T 0 disk
sdf 8:80 0 2.7T 0 disk /mnt/disk4
sdg 8:96 0 2.7T 0 disk /mnt/disk6
sdh 8:112 0 2.7T 0 disk /mnt/disk5
ここで、ディスク/dev/sde
はマウントできません。この場合、心配しないでください。Minio は、半分(上記を含む)のディスクがまだ存在する場合に動作するためです。
- ディスクが半分残っている場合、例えば 6 つのディスクを持っている場合、4〜6 つのディスクが生き残っている場合、Minio は読み書きが可能です。
- ディスクが 3 つだけ残っている場合、Minio は読み取りは可能ですが、書き込みはできません。
この場合、ディスクを交換してみるか、ディスクを再フォーマットしてみてください(問題がディスク自体にあるかどうかを確認した後)。mkfs.xfs
コマンドを使用して、同じラベルをディスクに付けます。私の場合、失われたのは/disk3
ですので、次のようなコマンドを参考にしてください。
mkfs.xfs /dev/sde -L DISK3 -f
フォーマットが完了したら、mount -a
コマンドを使用してディスクを再度マウントし、Minio を再起動すれば、使用を回復できます。
その他の準備事項#
- JuiceFS に使用するバケットを作成します。ここで作成するバケットの名前は juicefs です。
- Identity - Users で
juicefs
というアカウントを作成し、AccessKey
とSecretKey
を作成します。 - Juicefs がメタデータを保存するために使用するデータベースを準備します。Redis/PostgreSQL/Mysql/Etcd など、どのデータベースでも構いません。Minio サーバー上でも実行できます。
JuiceFS の使用方法#
JuiceFS のインストール#
インストールも簡単です。Windows 以外のシステムでは、ワンクリックスクリプトを使用できます。
curl -sSL https://d.juicefs.com/install | sh -
ファイルシステムの作成#
JuiceFs のメタデータを保存するためのデータベースと、実際のデータを保存するためのオブジェクトストレージが必要です。
juicefs format \
--storage minio \
--bucket http://<minio-server>:9000/<bucket> \
--access-key <your-key> \
--secret-key <your-secret> \
redis://:mypassword@<redis-server>:6379/1 \
myjfs
注意:S3
ストレージとRedis
データベースのアドレスは、ローカルホストの代わりに外部アドレスを使用する必要があります。
そうしないと、メタデータエンジンでは、S3
アドレスがまだlocalhost
になってしまい、他のデバイスからS3
ストレージにアクセスできなくなります。
JuiceFS のマウント#
Unix システム#
詳細はこちらを参照してください。
Windows システム#
TODO