前言#
最近發現 Juicefs 基於 S3 的對象存儲,可以簡單的實現比較好用的高可用存儲方案,於是把安裝部署過程和可能會遇到的坑點記錄下來。
這篇文章的目標用戶#
-
需要有 Linux 伺服器,並且需要有多個磁碟 (分區),直通物理磁碟最佳,虛擬磁碟和分區也可以用於構建
-
需要對 Docker 有一定程度的了解
-
想要構建 (家庭高可用存儲) 的讀者
對比其他的方案#
眾所周知,高可用存儲目前有類似,GlusterFS, Ceph, ZFS 等單機 / 集群的存儲方案。
其中,GlusterFS,HDFS 這些方案,由於需要多副本多節點的支撐,對家庭用戶來說開銷太高。而 Ceph 集群也是同理,即使可以根據需求,切換使用多副本和纠删码的模式,但其運維的成本過於高。因此考慮了近幾年的 Minio 方案。 Minio 是一個開源的 S3 兼容的對象存儲,使用纠删码機制,具有讀寫仲裁,而且部署和數據恢復方便。
安裝 Minio#
我有一台 12 碟位的伺服器,用來作為 Minio 的伺服器
安裝系統#
安裝任意的 Linux 系統都可以, Ubuntu/Debian/Centos/Suse 都可。
安裝 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
這裡可以看到我有六個硬碟,有多個分區也是可以的。使用以下命令把磁碟格式化成 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"
# Settings and configurations that are common for all containers
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:
# 開放 metrics 指標,也可以去掉這一條
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 就可以運行起來了。
如何恢復數據#
假設你的磁碟壞了一到兩塊,例如用 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 在仍然有一半 (包括以上) 的硬碟時,仍然是可以運轉的。
- 如果還剩一半的硬碟一樣,例如我有六塊硬碟,目前有 4~6 塊盤存活,那麼整個 Minio 還是可以讀寫的
- 如果只剩三個硬碟了,那麼 Minio 還是可以讀取,但是無法寫入
此時嘗試更換一塊硬碟,或者重新格式化該硬碟 (確實是否是硬碟本身的問題後),使用mkfs.xfs
給硬碟打上同樣的標籤,例如我這裡丟失的是/disk3
, 那麼參考命令就如下
mkfs.xfs /dev/sde -L DISK3 -f
格式化完後,使用mount -a
命令重新掛載一下硬碟,並且重啟一下 Minio 即可,就恢復使用了。
另外需要準備的事情#
- 新建一個 Bucket 給 JuiceFS 使用,這裡創建的 bucket 名字就是 juicefs
- 在 Identity - Users 裡創建一個
juicefs
的賬戶,並且創建一個AccessKey
和SecretKey
- 準備一個數據庫, Redis/PostgreSQL/Mysql/Etcd 等等都可以,用於給 juicefs 存放元數據。可以同樣跑在 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
數據庫的地址,都應該寫外部地址,而非 127.0.0.1/localhost
否則在元數據引擎中,記錄的 S3
地址仍然為 localhost
, 這樣其他設備就無法訪問到 S3
存儲了。
掛載 JuiceFS#
Unix 系統#
具體可以參考啟動時自動掛載 JuiceFS
Windows 系統#
TODO