Incubator4

Incubator4

github
steam
nintendo switch

使用 Juicefs 和 Minio 建立簡單上手的高可用存儲

前言#

最近發現 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 即可,就恢復使用了。

另外需要準備的事情#

  1. 新建一個 Bucket 給 JuiceFS 使用,這裡創建的 bucket 名字就是 juicefs
  2. 在 Identity - Users 裡創建一個juicefs的賬戶,並且創建一個AccessKeySecretKey
  3. 準備一個數據庫, 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

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。