JuiceFS 是一個雲原生的企業級分佈式文件系統,廣泛應用於大數據、企業級數據共享、Kubernetes 容器編排、AI 機器學習、Web 服務和內容管理、數據容災備份等場景。它將對象存儲作為大容量本地磁盤使用,為雲上應用提供近乎無限的存儲空間。與此同時,得益於其獨特的技術架構,在存儲和處理大規模數據時,性能通常高於本地存儲。
另外,JuiceFS 具備跨雲共享能力,如果你需要在多臺位於不同雲服務商的雲服務器之間共享數據,只需在每一臺雲服務器上掛載同一個 JuiceFS 存儲,它的數據強一致性設計,可以確保每臺主機都能實時同步數據的變化。
本文將分享如何在阿里雲平臺上安裝和使用 JuiceFS 存儲。
架構
如下圖所示,JuiceFS 存儲由數據庫和對象存儲共同驅動。存入 JuiceFS 的文件會按照一定的規則被拆分成固定大小的數據塊存儲在對象存儲中,數據對應的元數據則會存儲在數據庫中。
元數據完全獨立存儲,對文件的檢索和處理並不會直接操作對象存儲中的數據,而是先在數據庫中操作元數據,只有當數據發生變化的時候,才會與對象存儲交互。
這樣的設計可以有效縮減對象存儲在請求數量上的費用,同時也能讓我們顯著感受到 JuiceFS 帶來的性能提升。
準備
通過前面的架構描述,可以知道 JuiceFS 需要搭配數據庫和對象存儲一起使用。這裡我們直接使用阿里雲的 ECS 雲服務器,結合雲數據庫和 OSS 對象存儲。
在創建雲計算資源時,儘量選擇在相同的區域,這樣可以讓資源之間通過內網線路相互訪問,避免使用公網線路產生額外的流量費用。
一、雲服務器 ECS
JuiceFS 對服務器硬件沒有特殊要求,一般來說,雲平臺上最低配的雲服務器也能穩定使用 JuiceFS,通常你只需要選擇能夠滿足自身業務的配置即可。
需要特別說明的是,你不需要為使用 JuiceFS 重新購買服務器或是重裝系統,JuiceFS 沒有業務入侵性,不會對你現有的系統和程序造成任何的干擾,你完全可以在正在運行的服務器上安裝和使用 JuiceFS。
JuiceFS 默認會佔用不超過 1GB 的硬盤空間作為緩存,可以根據需要調整緩存空間的大小。該緩存是客戶端與對象存儲之間的一個數據緩衝層,選擇性能更好的雲盤,可以獲得更好的性能表現。
在操作系統方面,阿里雲 ECS 提供的所有操作系統都可以安裝 JuiceFS。
本文使用的 ECS 配置如下:
實例規格 | ecs.t5-lc1m1.small |
---|---|
CPU | 1 核 |
內存 | 1 GB |
存儲 | 40 GB |
操作系統 | Ubuntu Server 20.04 64位 |
地域及可用區 | 華東 2(上海) |
二、雲數據庫
JuiceFS 會將數據對應的元數據全部存儲在獨立的數據庫中,目前已開放支持的數據庫有 Redis、MySQL、PostgreSQL 和 SQLite。
根據數據庫類型的不同,帶來的元數據性能和可靠性表現也各不相同。比如 Redis 是完全運行在內存上的,它能提供極致的性能,但運維難度較高,可靠性相對低。而 MySQL、PostgreSQL 是關係型數據庫,性能不如 Redis,但運維難度不高,可靠性也有一定的保障。SQLite 是單機單文件關係型數據庫,性能較低,也不適合用於大規模數據存儲,但它免配置,適合單機少量數據存儲的場景。
如果只是為了評估 JuiceFS 的功能,你可以在 ECS 雲服務器手動搭建數據庫使用。當你要在生產環境使用 JucieFS 時,如果沒有專業的數據庫運維團隊,阿里雲的雲數據庫服務通常是更好的選擇。
當然,如果你願意,也可以使用其他雲平臺上提供的雲數據庫服務。但在這種情況下,你只能通過公網訪問雲數據庫,也就是說,你必須向公網暴露數據庫的端口,這存在極大的安全風險,最好不要這樣使用。
如果必須通過公網訪問數據庫,可以通過雲數據庫控臺提供的白名單功能,嚴格限制允許訪問數據庫的 IP 地址,從而提升數據的安全性。從另一個角度說,如果你通過公網無法成功連接雲數據庫,那麼可以檢查數據庫的白名單,檢查是不是該設置限制了你的訪問。
數據庫 | Redis | MySQL、PostgreSQL | SQLite |
---|---|---|---|
性能 | 強 | 適中 | 弱 |
運維門檻 | 高 | 適中 | 低 |
可靠性 | 低 | 適中 | 低 |
應用場景 | 海量數據、分佈式高頻讀寫 | 海量數據、分佈式中低頻讀寫 | 少量數據單機中低頻讀寫 |
注意:如果使用 JuiceFS 的託管服務,則無需單獨準備數據庫。
本文使用了雲數據 Redis 版,以下連接地址只是為了演示目的編制的偽地址:
Redis 版本 | 5.0 社區版 |
---|---|
實例規格 | 256M 主從版 |
連接地址 | herald-sh-abc.redis.rds.aliyuncs.com |
可用區 | 上海 |
三、對象存儲 OSS
JuiceFS 會將所有的數據都存儲到對象存儲中,它支持幾乎所有的對象存儲服務。但為了獲得最佳的性能,當使用阿里雲 ECS 時,搭配阿里雲 OSS 對象存儲通常是最優選擇。不過請注意,將 ECS 和 OSS Bucket 選擇在相同的地區,這樣才能通過阿里雲的內網線路進行訪問,不但延時低,而且不需要額外的流量費用。
當然,如果你願意,也可以使用其他雲平臺提供的對象存儲服務,但不推薦這樣做。首先,通過阿里雲 ECS 訪問其他雲平臺的對象存儲要走公網線路,對象存儲會產生流量費用,而且這樣的訪問延時相比也會更高,可能會影響 JuiceFS 的性能發揮。
阿里雲 OSS 有不同的存儲級別,由於 JuiceFS 需要與對象存儲頻繁交互,建議使用標準存儲。你可以搭配 OSS 資源包使用,降低對象存儲的使用成本。
API 訪問祕鑰
阿里雲 OSS 需要通過 API 進行訪問,你需要準備訪問祕鑰,包括 Access Key ID
和 Access Key Secret
,點此查看獲取方式。
安全建議:顯式使用 API 訪問祕鑰可能導致密鑰洩露,推薦為雲服務器分配 RAM 服務角色。當一臺 ECS 被授予 OSS 操作權限以後,無需使用 API 訪問祕鑰即可訪問 OSS。
安裝
我當前使用的是 Ubuntu Server 20.04 64 位系統,依次執行以下命令可以下載最新版本客戶端。你也可以訪問 JuiceFS GitHub Releases 頁面選擇其他版本。
在編寫本文時,JuiceFS 的最新版本是 v0.15.2。
$ JFS_LATEST_TAG=$(curl -s https://api.github.com/repos/juicedata/juicefs/releases/latest | grep 'tag_name' | cut -d '"' -f 4 | tr -d 'v')
$ wget "https://github.com/juicedata/juicefs/releases/download/v${JFS_LATEST_TAG}/juicefs-${JFS_LATEST_TAG}-linux-amd64.tar.gz"
下載完成以後,解壓程序到 juice
文件夾:
$ mkdir juice && tar -zxvf "juicefs-${JFS_LATEST_TAG}-linux-amd64.tar.gz" -C juice
將 JuiceFS 客戶端安裝到 /usr/local/bin
:
$ sudo install juice/juicefs /usr/local/bin
執行命令,看到返回 juicefs
的命令幫助信息,代表客戶端安裝成功。
$ juicefs
NAME:
juicefs - A POSIX file system built on Redis and object storage.
USAGE:
juicefs [global options] command [command options] [arguments...]
VERSION:
0.15.2 (2021-07-07T05:51:36Z 4c16847)
COMMANDS:
format format a volume
mount mount a volume
umount unmount a volume
gateway S3-compatible gateway
sync sync between two storage
rmr remove directories recursively
info show internal information for paths or inodes
bench run benchmark to read/write/stat big/small files
gc collect any leaked objects
fsck Check consistency of file system
profile analyze access log
status show status of JuiceFS
warmup build cache for target directories/files
dump dump metadata into a JSON file
load load metadata from a previously dumped JSON file
help, h Shows a list of commands or help for one command
GLOBAL OPTIONS:
--verbose, --debug, -v enable debug log (default: false)
--quiet, -q only warning and errors (default: false)
--trace enable trace log (default: false)
--no-agent Disable pprof (:6060) and gops (:6070) agent (default: false)
--help, -h show help (default: false)
--version, -V print only the version (default: false)
COPYRIGHT:
AGPLv3
JuiceFS 具有良好的跨平臺兼容性,同時支持在 Linux、Windows 和 macOS 上使用。本文著重介紹 JuiceFS 在 Linux 系統上的安裝和使用,如果你需要了解其他系統上的安裝方法,請查閱文檔。
創建 JuiceFS 存儲
JuiceFS 客戶端安裝好以後,現在就可以使用前面準備好的 Redis 數據庫和 OSS 對象存儲來創建 JuiceFS 存儲了。
嚴格意義上說,這一步操作應該叫做 “Format a volume”,即格式化一個卷。但考慮到有很多用戶可能不瞭解或者不關心文件系統的標準術語,所以簡單起見,我們就直白的把這個過程叫做“創建 JuiceFS 存儲”。
以下命令使用 JuiceFS 客戶端提供的 format
子命令創建了一個名為 mystor
的存儲,即文件系統:
$ juicefs format \
--storage oss \
--bucket https://<your-bucket-name> \
--access-key <your-access-key-id> \
--secret-key <your-access-key-secret> \
redis://:[email protected]:6379/1 \
mystor
選項說明:
--storage
:指定對象存儲類型,點此查看 JuiceFS 支持的對象存儲。--bucket
:對象存儲的 Bucket 域名。當使用阿里雲 OSS 時,只需填寫 bucket 名稱即可,無需填寫完整的域名,JuiceFS 會自動識別並補全地址。--access-key
和--secret-key
:訪問對象存儲 API 的祕鑰對,點此查看獲取方式。
Redis 6.0 身份認證需要用戶名和密碼兩個參數,地址格式為
redis://username:password@redis-server-url:6379/1
。目前阿里雲數據庫 Redis 版只提供 Reids 4.0 和 5.0 兩個版本,認證身份只需要密碼,在設置 Redis 服務器地址時留空用戶名即可,例如:redis://:password@redis-server-url:6379/1
使用 RAM 角色綁定 ECS 時,創建 JucieFS 存儲只需指定 --storage
和 --bucket
兩個選項,無需提供 API 訪問祕鑰。命令可以改寫成:
$ juicefs format \
--storage oss \
--bucket https://mytest.oss-cn-shanghai.aliyuncs.com \
redis://:[email protected]:6379/1 \
mystor
看到類似下面的輸出,代表文件系統創建成功了。
2021/07/13 16:37:14.264445 juicefs[22290] <INFO>: Meta address: redis://@herald-sh-abc.redis.rds.aliyuncs.com:6379/1
2021/07/13 16:37:14.277632 juicefs[22290] <WARNING>: maxmemory_policy is "volatile-lru", please set it to 'noeviction'.
2021/07/13 16:37:14.281432 juicefs[22290] <INFO>: Ping redis: 3.609453ms
2021/07/13 16:37:14.527879 juicefs[22290] <INFO>: Data uses oss://mytest/mystor/
2021/07/13 16:37:14.593450 juicefs[22290] <INFO>: Volume is formatted as {Name:mystor UUID:4ad0bb86-6ef5-4861-9ce2-a16ac5dea81b Storage:oss Bucket:https://mytest340 AccessKey:LTAI4G4v6ioGzQXy56m3XDkG SecretKey:removed BlockSize:4096 Compression:none Shards:0 Partitions:0 Capacity:0 Inodes:0 EncryptKey:}
掛載 JuiceFS 存儲
文件系統創建完成,對象存儲相關的信息會被存入數據庫,掛載時無需再輸入對象存儲的 Bucket 和祕鑰等信息。
使用 mount
子命令,將文件系統掛載到 /mnt/jfs
目錄:
$ sudo juicefs mount -d redis://:[email protected]:6379/1 /mnt/jfs
注意:掛載文件系統時,只需填寫 Redis 數據庫地址,不需要文件系統名稱。如果使用 root 身份掛載文件系統,默認的緩存路徑為
/var/jfsCache
,如果使用普通用戶身份在家目錄上掛載,則默認的緩存路徑在~/.juicefs/cache
。
看到類似下面的輸出,代表文件系統掛載成功。
2021/07/13 16:40:37.088847 juicefs[22307] <INFO>: Meta address: redis://@herald-sh-abc.redis.rds.aliyuncs.com/1
2021/07/13 16:40:37.101279 juicefs[22307] <WARNING>: maxmemory_policy is "volatile-lru", please set it to 'noeviction'.
2021/07/13 16:40:37.104870 juicefs[22307] <INFO>: Ping redis: 3.408807ms
2021/07/13 16:40:37.384977 juicefs[22307] <INFO>: Data use oss://mytest/mystor/
2021/07/13 16:40:37.387412 juicefs[22307] <INFO>: Disk cache (/var/jfsCache/4ad0bb86-6ef5-4861-9ce2-a16ac5dea81b/): capacity (1024 MB), free ratio (10%), max pending pages (15)
.2021/07/13 16:40:38.410742 juicefs[22307] <INFO>: OK, mystor is ready at /mnt/jfs
使用 df
命令,可以看到文件系統的掛載情況:
$ df -Th
文件系統 類型 容量 已用 可用 已用% 掛載點
JuiceFS:mystor fuse.juicefs 1.0P 64K 1.0P 1% /mnt/jfs
文件系統掛載成功以後,現在就可以像使用本地硬盤那樣,在 /mnt/jfs
目錄中存儲數據了。
多主機共享:JuiceFS 存儲支持被多臺雲服務器同時掛載使用,你可以在其他 ECS 上安裝 JuiceFS 客戶端,然後使用
redis://:[email protected]:6379/1
數據庫地址掛載文件系統到每一臺主機上。注意,不要重複執行創建文件系統命令,文件系統只需創建一次,在其他主機上直接掛載使用即可。
查看文件系統狀態
使用 JuiceFS 客戶端的 status
子命令可以查看一個文件系統的基本信息和連接狀態。
$ juicefs status redis://:[email protected]:6379/1
2021/07/13 16:56:17.143503 juicefs[22415] <INFO>: Meta address: redis://@herald-sh-abc.redis.rds.aliyuncs.com:6379/1
2021/07/13 16:56:17.157972 juicefs[22415] <WARNING>: maxmemory_policy is "volatile-lru", please set it to 'noeviction'.
2021/07/13 16:56:17.161533 juicefs[22415] <INFO>: Ping redis: 3.392906ms
{
"Setting": {
"Name": "mystor",
"UUID": "4ad0bb86-6ef5-4861-9ce2-a16ac5dea81b",
"Storage": "oss",
"Bucket": "https://mytest",
"AccessKey": "<your-access-key-id>",
"BlockSize": 4096,
"Compression": "none",
"Shards": 0,
"Partitions": 0,
"Capacity": 0,
"Inodes": 0
},
"Sessions": [
{
"Sid": 3,
"Heartbeat": "2021-07-13T16:55:38+08:00",
"Version": "0.15.2 (2021-07-07T05:51:36Z 4c16847)",
"Hostname": "demo-test-sh",
"MountPoint": "/mnt/jfs",
"ProcessID": 22330
}
]
}
卸載 JuiceFS 存儲
使用 JuiceFS 客戶端提供的 umount
命令即可卸載文件系統,比如:
$ sudo juicefs umount /mnt/jfs
注意:強制卸載使用中的文件系統可能導致數據損壞或丟失,請務必謹慎操作。更多內容請參考官方文檔。
開機自動掛載
如果你不想每次重啟系統都要重新手動掛載 JuiceFS 存儲,可以設置自動掛載文件系統。
首先,需要將 juicefs
客戶端重命名為 mount.juicefs
並複製到 /sbin/
目錄:
$ sudo cp juice/juicefs /sbin/mount.juicefs
編輯 /etc/fstab
配置文件,新增一條記錄:
redis://:[email protected]:6379/1 /mnt/jfs juicefs _netdev,cache-size=20480 0 0
掛載選項中 cache-size=20480
代表分配 20GB 本地磁盤空間作為 JuiceFS 的緩存使用,請根據你實際的 ECS 硬盤容量去決定分配的緩存大小。一般來說,為 JuiceFS 分配更大的緩存空間,可以獲得更好的性能表現。
你可以根據需要調整上述配置中的 FUSE 掛載選項,更多內容請查閱文檔。
注意:請將上述配置文件中的 Redis 地址、掛載點以及掛載選項,替換成你實際的信息。
總結
JucieFS 是一個面向雲的高性能企業級分佈式文件系統,目前多被用在大數據分析、企業級數據共享、Kubernetes 容器編排、數據容災備份等業務場景。受限於主題和篇幅,本文旨在拋磚引玉,概略的介紹在阿里雲 ECS 上結合雲數據庫 Redis 版和 OSS 對象存儲創建 JuiceFS 文件系統的基本方法。
你可以訪問 JuiceFS GitHub 倉庫,瞭解更多 JuiceFS 的高級主題。