JuiceFS 用户必备的 6 个技巧
隨著大數據、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 命令進行元數據恢復。恢復元數據有兩個注意事項:
-
只能恢復到全新的數據庫;
-
需要重新設置對象存儲的 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
總結
以上是生活随笔為你收集整理的JuiceFS 用户必备的 6 个技巧的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 算法学习笔记(40): 具体数学
- 下一篇: 火山引擎ByteHouse:如何优化Cl