JuiceFS 使用者必備的 6 個技巧

JuiceFS發表於2023-11-22

隨著大資料、AI 技術的發展,越來越多的企業、團隊和個人開始使用 JuiceFS,本文整理了 6 個超實用的 JuiceFS 技巧,幫助大家提升 JuiceFS 的管理效率。

一、檢視已掛載的檔案系統

有時候你可能在一臺機器上掛載了多個 JuiceFS 檔案系統,或是在多臺機器上使用不同的選項掛載了同一個檔案系統,也可能二者兼有的在多臺機器上掛載了多個檔案系統。類似這樣的情況,如何區分哪臺機器上掛載的是哪個檔案系統、設定了哪些調優選項是大家經常會問到的問題。

這裡以 Linux 系統為例,提供幾種簡便的方法。

方法一:使用 ps 命令

ps aux | grep juicefs

執行這個命令會有類似下面的輸出,可以看到前兩條記錄就是在後臺掛載的兩個檔案系統。

herald     36290  0.2  0.1 800108 78848 ?        Sl   11:07   0:24 juicefs mount -d sqlite3:///home/herald/jfs/my.db /home/herald/jfs/mnt
herald     37190  1.3  0.1 3163100 106160 ?      Sl   11:11   2:12 juicefs mount -d badger:///home/herald/jfs/mydb /home/herald/jfs/mnt2
herald     68886  0.0  0.0 221812  2400 pts/0    S+   13:54   0:00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn --exclude-dir=.idea --exclude-dir=.tox juicefs

方法二:使用 pgrep 和 cat 命令

在 Linux 系統中,程式的資訊通常可以在 /proc 檔案系統中找到,以程式的 PID 為目錄名訪問。首先使用 pgrep 找到 juicefs 掛載程式的 PID:

pgrep juicefs

它會有輸出所有的 PID,例如:

36290
37190

然後使用 cat /proc/PID/cmdline 分別列印各個程式的命令,例如:

cat /proc/36290/cmdline

它會有類似下面這樣的輸出:

juicefs mount -d sqlite3:///home/herald/jfs/my.db /home/herald/jfs/mnt

方法三:使用 Bash 指令碼

我把方法二整合成了一個獨立的 Bash 指令碼程式併發布在了 Github Gist,你可以直接下載使用:

# 下載 Bash 指令碼
curl -LO https://gist.githubusercontent.com/yuhr123/4e7a09653e833a083dae87ba76b7d642/raw/d8de5350955aa33a3bfafc7cf3756c5f8f3fa04d/proc

# 賦予指令碼執行許可權
chmod +x proc

# 執行指令碼
./proc juicefs

它會有類似下面的輸出:

PID: 36290, Command Line: juicefs mount -d sqlite3:///home/herald/jfs/my.db /home/herald/jfs/mnt
PID: 37190, Command Line: juicefs mount -d badger:///home/herald/jfs/mydb /home/herald/jfs/mnt2

二、利用 Bash 指令碼簡化管理

JuiceFS 客戶端是命令列程式,雖然使用起來並不難,但是對於剛剛上手或是正在反覆調整掛載選項調優效能的使用者來說,直接在終端上輸入命令勢必會很繁瑣,而且容易輸錯。對於這個問題,可以使用 Bash 指令碼來管理各種命令。

用指令碼建立檔案系統

比如我會建立一個名為 format-myjfs.sh 的指令碼來管理建立檔案系統的命令:

#!/bin/bash

juicefs format --storage s3 \
--bucket xxx \
--access-key xxx \
--secret-key xxx \
redis://xxx.xxx.xxx/1 \
myjfs

執行指令碼:

bash format-myjfs.sh

這個指令碼的好處是方便隨時檢視這個檔案系統是用哪個 bucket 和資料庫組成的,缺點是裡面可能需要寫物件儲存或資料庫的訪問金鑰,所以要這麼管理的話一定要妥善保管這個指令碼,可以透過環境變數傳遞敏感資訊,也可以在使用以後使用 gpg 對這個指令碼做對稱加密。

用指令碼管理檔案系統掛載

掛載檔案系統是一個日常更頻繁的管理動作,比如我會建立一個名為 mount-myjfs.sh 的指令碼:

#!/bin/bash

juicefs mount \
--cache-dir /mnt/juicefs-cache \
--buffer-size 2048 \
--writeback \
--free-space-ratio 0.5 \
redis://xxx.xxx.xxx/1 \
/mnt/myjfs

執行指令碼:

bash mount-juicefs.sh

使用這個指令碼,可以更直觀的調整掛載選項,用起來會方便很多。

三、檢視有幾個客戶端同時掛載

雲檔案系統的一個關鍵特性是可以被位於不同網路的多客戶端同時掛載,比如,將同一個檔案系統在北京的機房和紐約的機房同時掛載,兩地的伺服器可以同時讀寫,JuiceFS 的事務機制會保證寫入資料的一致性。

當你想檢視一個檔案系統當前有多少客戶端在同時掛載時,可以使用 status 命令:

juicefs status redis://192.168.1.80/1

命令會以 JSON 格式輸出類似下面的內容,其中的 Sessions 部分顯示了當前掛載的客戶端,它包括每個客戶端的軟體版本、主機名、IP 地址、掛載點、程式 ID 等。

{
  "Setting": {
    "Name": "myjfs",
    "UUID": "520ae432-f355-43d2-a445-020787f325f4",
    "Storage": "minio",
    "Bucket": "http://192.168.1.80:9123/myjfs",
    "AccessKey": "admin",
    "SecretKey": "removed",
    "BlockSize": 4096,
    "Compression": "none",
    "EncryptAlgo": "aes256gcm-rsa",
    "KeyEncrypted": true,
    "TrashDays": 1,
    "MetaVersion": 1,
    "MinClientVersion": "1.1.0-A",
    "DirStats": true
  },
  "Sessions": [
    {
      "Sid": 2,
      "Expire": "2023-10-27T09:08:09+08:00",
      "Version": "1.1.0+2023-09-04.08c4ae6",
      "HostName": "homelab",
      "IPAddrs": [
        "192.168.1.80",
      ],
      "MountPoint": "/home/herald/jfs/mnt3",
      "ProcessID": 173507
    },
    {
      "Sid": 4,
      "Expire": "2023-10-27T09:08:11+08:00",
      "Version": "1.1.0+2023-09-04.08c4ae6",
      "HostName": "HeralddeMacBook-Air.local",
      "IPAddrs": [
        "192.168.3.102",
      ],
      "MountPoint": "webdav",
      "ProcessID": 20746
    }
  ],
  "Statistic": {
    "UsedSpace": 4347064320,
    "AvailableSpace": 1125895559778304,
    "UsedInodes": 11,
    "AvailableInodes": 10485760
  }
}

四、開啟或關閉回收站

顧名思義,回收站是一種資料安全機制,可以防止資料被誤刪。JuiceFS 檔案系統預設開啟回收站,刪除的檔案會在回收站保留 1 天,超過保留時間後,檔案會從 .trash 目錄中被徹底刪除。

在對檔案系統進行調優測試時,需要頻繁寫入和刪除大量的臨時檔案,此時就有必要關閉回收站,讓儲存空間可以被及時釋放。

應該使用 config 命令調整 --trash-days 的數值控制回收站,設定的數字代表回收站保留檔案的天數,設定為 0 時表示關閉回收站,例如:

# 將回收站設定為保留 7 天  
juicefs config META-URL --trash-days=7  
  
# 關閉回收站  
juicefs config META-URL --trash-days=0

五、徹底銷燬一個檔案系統

對於剛接觸一種技術產品的人來說,除了會關注如何建立和使用,也會關注如何清理和刪除。JuiceFS 檔案系統的銷燬與建立一樣都是清清爽爽的,它包含一些必要的確認過程,然後就可以被幹幹靜靜地刪除。首先,使用 status 命令找到要刪除的檔案系統的 UUID。

# juicefs status redis://192.168.1.80/1

{
  "Setting": {
    "Name": "myjfs",
    "UUID": "520ae432-f355-43d2-a445-020787f325f4",
    "Storage": "minio",
    "Bucket": "http://192.168.1.80:9123/myjfs",

然後,需要確認所有客戶端已經停止使用該檔案系統,正在掛載使用的檔案系統是無法被銷燬的。最後,使用 destroy 命令執行銷燬。

juicefs destroy redis://192.168.1.80/1 520ae432-f355-43d2-a445-020787f325f4

六、後設資料備份和還原

JuiceFS 檔案系統是一種資料與後設資料分離儲存的架構,資料會被分塊儲存在物件儲存,相關的後設資料會儲存在獨立的資料庫中。後設資料記錄了檔案的名稱、大小、位置、許可權等資訊,訪問檔案時必須先檢索到後設資料才能拿到實際的資料,可以說後設資料對任何檔案系統來說都是至關重要的。

為了保證後設資料的安全,JuiceFS 預設啟用後設資料自動備份機制,每小時都會備份一次後設資料並儲存到物件儲存 Bucket 的 meta 目錄中。

當後設資料引擎發生了故障,就可以下載一份最新的備份,透過 load 命令進行後設資料恢復。恢復後設資料有兩個注意事項:

  1. 只能恢復到全新的資料庫;

  2. 需要重新設定物件儲存的 Secret Key。

比如,我的檔案系統是用 Redis 1 號資料庫建立的,現在假設它損壞了,我要在2 號庫上重建後設資料。只要去物件儲存的 meta 目錄下載最新的備份,然後按照下面的步驟進行恢復即可。


# 將後設資料備份匯入全新的資料庫
juicefs load redis://192.168.1.80/2 dump-2023-10-27-025129.json.gz

# 更新物件儲存 secret key
juicefs config --secret-key xxx redis://192.168.1.80/2

需要注意的是,自動備份與故障發生難免存在時間差,最近的一次備份後與故障發生前的期間產生的新資料是無法被恢復的。

極端狀況畢竟是少數,平時更常見的需求是在不同的資料庫之間遷移後設資料。

這個操作也同樣很簡單,首先停掉檔案系統的讀寫業務,然後使用 dump 命令匯出後設資料,最後在目標資料庫上使用 load 命令匯入即可。

# 匯出後設資料到 meta-dump.json 檔案
juicefs dump redis://192.168.1.80/1 meta-dump.json

# 將後設資料匯入到一個全新的 sqlite 資料庫
juicefs load sqlite3://myjfs.db meta-dump.json

# 更新物件儲存 secret key
juicefs config --secret-key xxx sqlite3://myjfs.db

相關文章