JuiceFS 使用 TiKV 資料庫上手指南

語言: CN / TW / HK

作為雲原生的分散式儲存系統,JuiceFS 在誕生之初就被設計成了外掛式的結構,確保可以持續不斷的將新技術整合到 JuiceFS 生態,像資料儲存引擎和元資料引擎這兩個核心部件,使用者可以根據需要靈活選擇。

JuiceFS 的資料儲存引擎以物件儲存為主,支援幾乎所有公有云物件儲存服務和私有物件儲存系統,另外還支援 KV 儲存、WebDAV 以及本地磁碟。元資料引擎則陸續開放了對 Redis、MySQL、PostgreSQL、SQLite 等資料庫的支援。

最新發布的 JuiceFS v0.16 正式開放了對 TiKV 鍵值資料庫的支援,進一步滿足高效能、大規模資料儲存場景下的彈性擴容需求。

本文就帶領大家一起了解一下 JuiceFS 如何使用 TiKV 作為元資料引擎。

TiKV 簡介

TiKV 是一個分散式事務型的鍵值資料庫,具有高可擴充套件性、低延遲、易於使用的特點,它的效能優異,支援 PB 級萬億行資料規模的大資料處理能力。在設計上,TiKV 支援無限的水平擴充套件,提供了滿足 ACID 約束的分散式事務介面,並且通過 Raft 協議 [1] 保證了多副本資料一致性以及高可用。

TiKV 由 PingCAP 公司開發,是雲原生基金會(CNCF)孵化畢業的專案之一。

安裝 TiKV

PingCAP 提供了 TiUP 包管理器,可以很方便的在 Linux 或 macOS 上安裝 TiKV 等產品。

1. 安裝 TiUP

$ curl --proto '=https' --tlsv1.2 -sSf https://tiup-mirrors.pingcap.com/install.sh | sh

執行命令後,程式會自動檢測當前的系統環境,自動下載並安裝恰當的版本,最後會將 TiUP 的程式路徑新增到終端的可執行路徑中。

為了讓設定生效,可以重啟一個新終端。或者手動執行命令上設定生效,例如使用 bash 可以執行:

$ source .bash_profile

現在嘗試執行命令 tiup -v ,看到類似下面的版本資訊代表安裝成功。

$ tiup -v 
1.5.4 tiup
Go Version: go1.16.6
Git Ref: v1.5.4
GitHash: b629670276269cd1518eb28f362a5180135cc985

2. 部署 TiKV 叢集

為了便於測試,本文采用 TiUP 提供的 playground 元件在本地環境安裝最小化的 TiKV 叢集。

$ tiup playground --mode tikv-slim

部署成功後,終端會顯示類似下面這樣的資訊:

PD client endpoints: [127.0.0.1:2379]
To view the Prometheus: http://127.0.0.1:9090
To view the Grafana: http://127.0.0.1:3000

其中 127.0.0.1:2379 是 TiKV 的 Placement Driver(PD),即 TiKV 叢集的管理節點,JuiceFS 將通過該地址與 TiKV 進行資料互動。另外兩個地址分別是 PrometheusGrafana 服務,用來對 TiKV 叢集進行監控和資料視覺化,這裡不做進一步展開,有興趣可以查閱相關文件瞭解詳情。

注意:TiUP 的 playground 元件主要用於在本地環境快速搭建 TiDB、TiKV 的最小化測試叢集。生產環境部署請參考 TiKV 官方文件 [2]

安裝 JuiceFS

JuiceFS 同時支援 Linux、Windows 和 macOS 系統,只需要下載對應版本的客戶端程式放在系統的可執行路徑中即可。例如,我當前使用的是 Linux 發行版,依次執行以下命令即可安裝最新版本客戶端。

檢測當前系統資訊並設定臨時的環境變數:

$ 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 下載適配當前系統的最新版 JuiceFS 客戶端安裝包:

$ wget "https://github.com/juicedata/juicefs/releases/download/v${JFS_LATEST_TAG}/juicefs-${JFS_LATEST_TAG}-linux-amd64.tar.gz"

解壓安裝包:

$ 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.16.1 (2021-08-16 2edcfc0)


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
stats show runtime stats
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 GitHub Releases [3] 頁面選擇其他版本進行手動安裝。

使用

為了便於演示,這裡我參照 JuiceFS 快速上手指南 [4] ,在本地搭建了一個 MinIO 物件儲存,訪問地址是 http://127.0.0.1:9000Access Key IDAccess Key Secret 均為 minioadmin

1. 建立檔案系統

以下命令使用 JuiceFS 客戶端提供的 format 子命令建立了一個名為 mystor 的檔案系統,其中 TiKV 資料庫地址格式 [5] 參照官方文件設定,即使用 TiKV 叢集的 PD 地址:

$ juicefs format \
--storage minio \
--bucket http://127.0.0.1:9000/mystor \
--access-key minioadmin \
--secret-key minioadmin \
tikv://127.0.0.1:2379/mystor \
mystor

引數說明:

--storage :指定資料儲存引擎,這裡使用的是 minio --bucket :指定儲存桶訪問地址,這裡使用的是我在 MinIO 上提前建立的名為 mystor 的儲存桶。 --access-key--secret-key :指定訪問物件儲存 API 的祕鑰。 使用 TiKV 儲存元資料時,設定叢集的 PD 地址,當與其他應用共用同一個 TiKV 時,建議新增 prefix ,這裡在 PD 地址中指定了 mystor 字首。

看到類似下面的輸出,代表檔案系統建立成功:

2021/08/12 23:28:36.932241 juicefs[101222] <INFO>: Meta address: tikv://127.0.0.1:2379/mystor
[2021/08/12 23:28:36.932 +08:00] [INFO] [client.go:214] ["[pd] create pd client with endpoints"] [pd-address="[127.0.0.1:2379]"]
[2021/08/12 23:28:36.935 +08:00] [INFO] [base_client.go:346] ["[pd] switch leader"] [new-leader=http://127.0.0.1:2379] [old-leader=]
[2021/08/12 23:28:36.935 +08:00] [INFO] [base_client.go:126] ["[pd] init cluster id"] [cluster-id=6995548759432331426]
[2021/08/12 23:28:36.935 +08:00] [INFO] [client.go:238] ["[pd] create tso dispatcher"] [dc-location=global]
2021/08/12 23:28:36.936892 juicefs[101222] <INFO>: Data uses minio://127.0.0.1:9000/mystor/mystor/
2021/08/12 23:28:36.976722 juicefs[101222] <INFO>: Volume is formatted as {Name:mystor UUID:0c9594a8-fe2c-463c-a4b6-eb815f38c843 Storage:minio Bucket:http://127.0.0.1:9000/mystor AccessKey:minioadmin SecretKey:removed BlockSize:4096 Compression:none Shards:0 Partitions:0 Capacity:0 Inodes:0 EncryptKey:}

2. 掛載檔案系統

使用 mount 子命令,將檔案系統掛載到當前使用者家目錄下的 jfs 目錄:

$ sudo juicefs mount -d tikv://127.0.0.1:2379/mystor ~/jfs

這裡使用了 sudo 命令,以超級使用者許可權執行檔案系統掛載操作,目的是為了讓 JuiceFS 能夠正常建立並使用 /var/jfsCache 目錄快取資料。

看到類似下面的輸出,代表檔案系統掛載成功:

2021/08/12 23:34:44.288136 juicefs[101873] <INFO>: Meta address: tikv://127.0.0.1:2379/mystor
[2021/08/12 23:34:44.288 +08:00] [INFO] [client.go:214] ["[pd] create pd client with endpoints"] [pd-address="[127.0.0.1:2379]"]
[2021/08/12 23:34:44.291 +08:00] [INFO] [base_client.go:346] ["[pd] switch leader"] [new-leader=http://127.0.0.1:2379] [old-leader=]
[2021/08/12 23:34:44.291 +08:00] [INFO] [base_client.go:126] ["[pd] init cluster id"] [cluster-id=6995548759432331426]
[2021/08/12 23:34:44.291 +08:00] [INFO] [client.go:238] ["[pd] create tso dispatcher"] [dc-location=global]
2021/08/12 23:34:44.296270 juicefs[101873] <INFO>: Data use minio://127.0.0.1:9000/mystor/mystor/
2021/08/12 23:34:44.296768 juicefs[101873] <INFO>: Disk cache (/var/jfsCache/0c9594a8-fe2c-463c-a4b6-eb815f38c843/): capacity (1024 MB), free ratio (10%), max pending pages (15)
2021/08/12 23:34:44.800551 juicefs[101873] <INFO>: OK, mystor is ready at /home/herald/jfs

使用 df 命令,可以看到檔案系統的掛載情況:

$ df -Th
檔案系統 型別 容量 已用 可用 已用% 掛載點
JuiceFS:mystor fuse.juicefs 1.0P 64K 1.0P 1% /home/herald/jfs

檔案系統掛載成功以後,現在就可以像使用本地硬碟那樣,在 ~/jfs 目錄中儲存資料了。

3. 檢視檔案系統資訊

JuiceFS 客戶端的 status 子命令可以檢視一個檔案系統的基本資訊和連線狀態。

$ juicefs status tikv://127.0.0.1:2379/mystor
{
"Setting": {
"Name": "mystor",
"UUID": "9f50f373-a7ec-4d5b-b790-3defbf6d0509",
"Storage": "minio",
"Bucket": "http://127.0.0.1:9000/mystor",
"AccessKey": "minioadmin",
"SecretKey": "removed",
"BlockSize": 4096,
"Compression": "none",
"Shards": 0,
"Partitions": 0,
"Capacity": 0,
"Inodes": 0
},
"Sessions": [
{
"Sid": 2,
"Heartbeat": "2021-08-13T10:43:35+08:00",
"Version": "0.16-dev (2021-08-12 a871c3d)",
"Hostname": "herald-manjaro",
"MountPoint": "/home/herald/jfs",
"ProcessID": 6309
}
]
}

在返回的資訊中可以詳細的瞭解到一個檔案系統使用的資料儲存引擎資訊,以及當前掛載了該檔案系統的主機情況。

另外,v0.16 以後的客戶端還可以通過檢視掛載點根目錄下的 .config 虛擬檔案瞭解檔案系統的詳細配置資訊:

$ sudo cat ~/jfs/.config
{
"Meta": {
"Strict": true,
"Retries": 10,
"CaseInsensi": false,
"ReadOnly": false,
"OpenCache": 0,
"MountPoint": "jfs",
"Subdir": ""
},
"Format": {
"Name": "myabc",
"UUID": "e9d8373c-7ced-49d9-a033-75f6abb44854",
"Storage": "minio",
"Bucket": "http://127.0.0.1:9000/mystor",
"AccessKey": "minioadmin",
"SecretKey": "removed",
"BlockSize": 4096,
"Compression": "none",
"Shards": 0,
"Partitions": 0,
"Capacity": 0,
"Inodes": 0
},
"Chunk": {
"CacheDir": "/var/jfsCache/e9d8373c-7ced-49d9-a033-75f6abb44854",
"CacheMode": 384,
"CacheSize": 1024,
"FreeSpace": 0.1,
"AutoCreate": true,
"Compress": "none",
"MaxUpload": 20,
"Writeback": false,
"Partitions": 0,
"BlockSize": 4194304,
"GetTimeout": 60000000000,
"PutTimeout": 60000000000,
"CacheFullBlock": true,
"BufferSize": 314572800,
"Readahead": 0,
"Prefetch": 1
},
"Version": "0.16.1 (2021-08-16 2edcfc0)",
"Mountpoint": "jfs"
}

提示:需要特別注意的是,本文使用的是本地的演示環境。如果需要在多臺主機共享掛載同一個 JuiceFS 檔案系統時,你需要確保部署的物件儲存和 TiKV 叢集能夠被所有的主機正常訪問。

4. 解除安裝檔案系統

你可以使用 JuiceFS 客戶端提供的 umount 子命令解除安裝檔案系統,比如:

$ sudo juicefs umount ~/jfs

注意: 強制解除安裝使用中的檔案系統 [6] 可能導致資料損壞或丟失,請務必謹慎操作。更多內容請參考官方文件。

5. 開機自動掛載

如果你不想每次重啟系統都要重新手動掛載 JuiceFS,可以設定自動掛載。

首先,需要將 juicefs 客戶端重新命名為 mount.juicefs 並複製到 /sbin/ 目錄:

sudo cp /usr/local/bin/juicefs /sbin/mount.juicefs

編輯 /etc/fstab 配置檔案,新增一條記錄:

tikv://127.0.0.1:2379/mystor    /home/herald/jfs       juicefs     _netdev,cache-size=20480     0  0

掛載選項中 cache-size=20480 代表分配 20GB 本地磁碟空間作為 JuiceFS 的快取使用,請根據實際的硬體配置決定分配的快取大小。一般來說,為 JuiceFS 分配更大的快取空間,可以獲得更好的效能表現。

你可以根據需要調整上述配置中的 FUSE 掛載選項 [7] ,更多內容請查閱文件。

總結

對於 JuiceFS 而言,開放對 TiKV 的支援具有里程碑意義。它填補了 Redis 做元資料引擎時橫向擴容困難的問題,同時又填補了 MySQL、PostgreSQL 等 SQL 資料庫的效能短板,為使用者在元資料引擎選型時多提供了一個新選擇。

開源軟體的發展離不開每一個人的支援,一篇文章、一頁文件、一個想法建議、報告或修復一個 Bug,這些貢獻不論大小都是推動開源專案不斷髮展的動力。目前,JuiceFS 團隊正在開發對 FoundationDB 等更多元資料引擎的支援,有興趣的小夥伴可以在 JuiceFS GitHub [8] 上關注專案的開發進度。

開源社群貢獻指南

JuiceFS 是在 AGPLv3 協議下開源的專案,開源軟體的發展離不開每一個人的支援,一篇文章、一頁文件、一個想法、一個建議、報告或修復一個 Bug,這些貢獻不論大小都是推動開源專案不斷髮展的動力。

你可以為開源社群做的事情:

加星關注專案 https://github.com/juicedata/juicefs 論壇 [9] 發表你的看法 Issues [10] 認領開發任務 完善 JuiceFS 開源文件 [11] 在你自己的部落格、微博、微信、Vlog 等自媒體分享有關 JuiceFS 的一切 加入 JuiceFS 的微信群或 Slack 頻道 [12] 把 JuiceFS 告訴更多人,讓更多人使用由你我共同維護的產品!

我們誠摯的邀請每一個熱愛開源的人加入到我們的社群,讓我們一起把 JuiceFS 做的更好!

引用連結

[1] Raft 協議: https://raft.github.io/raft.pdf

[2] TiKV 官方文件: https://tikv.org/docs/5.1/deploy/install/install/

[3] JuiceFS GitHub Releases: https://github.com/juicedata/juicefs/releases

[4] JuiceFS 快速上手指南: https://github.com/juicedata/juicefs/blob/main/docs/zh_cn/quick_start_guide.md#%E4%BA%8C%E5%87%86%E5%A4%87%E5%AF%B9%E8%B1%A1%E5%AD%98%E5%82%A8

[5] TiKV 資料庫地址格式: https://github.com/juicedata/juicefs/blob/main/docs/zh_cn/databases_for_metadata.md#tikv

[6] 強制解除安裝使用中的檔案系統: https://github.com/juicedata/juicefs/blob/main/docs/zh_cn/quick_start_guide.md#%E4%B8%83%E5%8D%B8%E8%BD%BD%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F

[7] FUSE 掛載選項: https://github.com/juicedata/juicefs/blob/main/docs/zh_cn/fuse_mount_options.md

[8] JuiceFS GitHub: https://github.com/juicedata/juicefs

[9] 論壇: https://github.com/juicedata/juicefs/discussions

[10] Issues: https://github.com/juicedata/juicefs/issues

[11] JuiceFS 開源文件: https://github.com/juicedata/juicefs/tree/main/docs

[12] Slack 頻道: https://juicefs.slack.com

:point_down: 掃碼進群 :point_down: