淺析 SeaweedFS 與 JuiceFS 架構異同

2023-02-10 15:00:46

SeaweedFS 是一款高效的分散式檔案儲存系統,最早的設計原型參考了 Facebook 的 Haystack,具有快速讀寫小資料塊的能力。本文將通過對比 SeaweedFS 與 JuiceFS 在設計與功能上的差異,以幫助讀者進行更適合自己的選擇。

SeaweedFS 系統結構

SeaweedFS 由 3 部分組成,底層儲存檔案的 Volume Server,用於管理叢集的 Master Server,以及一個向上提供更多特性的 Filer 可選元件。

Volume Server 與 Master Server

在系統運作上,Volume Server 與 Master Server 一併服務於檔案的儲存。Volume Server 專注於資料的寫入與讀取,而 Master Server 則偏向是一個叢集與 Volumes 的管理服務。

在讀寫資料時,SeaweedFS 的實現與 Haystack 相似,使用者建立的一個 Volume 即是一個大磁碟檔案(下圖的 Superblock)。在此 Volume 中,使用者寫入的所有檔案(下圖的 Needle)都會被合併到該大磁碟檔案中。

在開始寫入資料之前,呼叫者需要向 SeaweedFS(Master Server)進行寫入申請,隨後 SeaweedFS 會根據當前的資料量返回一個 File ID(由 Volume ID 與 offset 組成),在寫入的過程中,一併被寫入的還有基礎的後設資料資訊(檔案長度與 Chunk 等資訊);當寫入完成之後,呼叫者需要在一個外部系統(例如 MySQL)中對該檔案與返回的 File ID 進行關聯儲存。在讀取資料時,由於 File ID 已經包含了計算檔案位置(偏移)的所有資訊,因此可以高效地將檔案的內容讀取出來。

Filer

在上述的底層儲存單元之上,SeaweedFS 提供了一個名為 Filer 的元件。通過向下對接 Volume Server 與 Master Server,對外提供豐富的功能與特性(如 POSIX 支援、WebDAV、S3 介面等)。與 JuiceFS 相同,Filer 也需要對接一個外部資料庫以儲存後設資料資訊。

為了方便闡述,下文中所指的 SeaweedFS,皆包含了 Filer 元件。

JuiceFS 系統結構

JuiceFS 採用「資料」與「後設資料」分離儲存的架構,檔案資料本身會被切分儲存在物件儲存(如 Amazon S3)當中,而後設資料則是會被儲存在使用者自行選擇的資料庫裡(如 Redis、MySQL)。通過共用同一個份資料庫與物件儲存,JuiceFS 實現了一個強一致性保證的分散式檔案系統,同時還具有「POSIX 完全相容」、「高效能」等諸多特性。

後設資料對比

SeaweedFS 與 JuiceFS 都支援通過外部資料庫以儲存檔案系統的後設資料資訊。在資料庫支援層面,SeaweedFS 支援多達 24 種資料庫。 JuiceFS 對資料庫事務能力要求高(見下文),當前支援了 3 類共 10 種事務型資料庫。

原子性操作

為了保證所有後設資料操作的原子性,JuiceFS 在實現層面需要使用有事務處理能力的資料庫。而 SeaweedFS僅在執行 rename 操作時啟用了部分資料庫(SQL、ArangoDB 和 TiKV)的事務, 對於資料庫的事務能力要求較低。同時,由於Seaweed FS 在 rename 操作中拷貝後設資料時,未對原目錄或檔案進行加鎖,可能會導致過程中更新的資料丟失。

變更紀錄檔(changelog)

SeaweedFS 會為所有的後設資料操作生成變更紀錄檔,此紀錄檔可被進一步用於資料複製(見下文)、操作審計等功能,而 JuiceFS 則暫未實現此特性。

儲存對比

如前文所述,SeaweedFS 的資料儲存由 Volume Server + Master Server 實現,支援小資料塊的「合併儲存」、「糾刪碼」等特性。而 JuiceFS 的資料儲存則是依託於物件儲存服務服務,相關的特性也都由使用者選擇的物件儲存提供。

檔案拆分

在儲存資料時,SeaweedFS 與 JuiceFS 都會將檔案拆分成若干個小塊再持久化到底層的資料系統中。SeaweedFS 將檔案拆分成 8MB 的塊,對於超大檔案(超過 8GB),它會將 Chunk 索引也儲存到底層的資料系統中。而 JuiceFS 則是先拆成 64MB 的 Chunk,再拆成 4MB 的 Object,通過內部一個 Slice 的概念對隨機寫、順序讀、重複寫等效能進行了優化。(詳情見讀取清求處理流程

分層儲存

對於新建立的 Volume,SeaweedFS 會把資料儲存在本地,而對於較舊的 Volume,SeaweedFS 支援將他們上傳至雲端以達到冷熱資料的分離。在此方面,JuiceFS 則需要依賴外部的服務。

資料壓縮

JuiceFS 支援使用 LZ4 或者 ZStandard 來為所有寫入的資料進行壓縮,而 SeaweedFS 則是根據寫入檔案的擴充套件名、檔案型別等資訊來選擇是否進行壓縮。

儲存加密

JuiceFS 支援傳輸中加密(encryption in transit)及靜態加密(encryption at rest),在使用者開啟了靜態加密時,需要使用者傳遞一個自行管理的金鑰,所有寫入的資料都會基於此金鑰進行資料的加密。詳情見 《資料加密》。

SeaweedFS 同樣支援傳輸中加密與靜態加密。在開啟了資料加密後,所有寫入 Volume Server 的資料都會使用隨機的金鑰進行加密,而這些對應的隨機金鑰資訊則由維護「metadata」的「Filer」進行管理。

存取協定

POSIX 相容性

JuiceFS 完全相容 POSIX, 而 SeaweedFS 目前只實現了部分的 POSIX 相容(「Issue 1558」Wiki),功能還持續完善中。

S3 協定

JuiceFS 通過 MinIO S3 閘道器實現了 S3 閘道器的功能。它為 JuiceFS 中的檔案提供跟 S3 相容的 RESTful API,在不方便掛載的情況下能夠用 s3cmd、AWS CLI、MinIO Client(mc)等工具管理 JuiceFS 上儲存的檔案。

SeaweedFS 當前支援了約 20 個 S3 API,覆蓋了常用的讀寫查刪等請求,對一些特定的請求(如 Read)還做了功能上的擴充套件,詳細見 Amazon-S3-API

WebDAV 協定

JuiceFS 與 SeaweedFS 皆支援 WebDAV 協定。

HDFS 相容性

JuiceFS 完整相容 HDFS API。不僅相容 Hadoop 2.x 和 Hadoop 3.x,還相容 Hadoop 生態系統中的各種元件。SeaweedFS 則是提供了對 HDFS API 的基礎相容,對於部分操作(如 turncate、concat、checksum 和擴充套件屬性等)則尚未支援。

CSI 驅動

JuiceFSSeaweedFS 皆提供了 「Kubernetes CSI Driver」 以幫助使用者在 Kubernetes 生態中使用對應的檔案系統。

擴充套件功能

使用者端快取

JuiceFS 有著多種使用者端快取策略,涵蓋從後設資料到資料快取的各個部分,允許使用者根據自己的應用場景進行調優(詳情),而 SeaweedFS 不具備使用者端快取能力。

叢集資料複製

對於多個叢集之間的資料複製,SeaweedFS 支援「Active-Active」與「Active-Passive」兩種非同步的複製模式,2 種模式都是通過傳遞 changelog 再應用的機制實現了不同叢集資料間的一致性,對於每一條 changelog,其中會有一個簽名資訊以保證同一個修改不會被迴圈多次。在叢集節點數量超過 2 個節點的 Active-Active 模式下,SeaweedFS 的一些操作(如重新命名目錄)會受到一些限制。

JuiceFS 尚未原生支援叢集之間的資料同步功能,需要依賴後設資料引擎和物件儲存自身的資料複製能力。

雲上資料快取

SeaweedFS 可以作為雲上物件儲存的快取來使用,支援通過命令手動預熱資料。對於快取資料的修改,會非同步同步到物件儲存中。JuiceFS 需要將檔案分塊儲存到物件儲存中,尚不支援為物件儲存中已有的資料提供快取加速。

回收站

JuiceFS 預設開啟回收站功能,會自動將使用者刪除的檔案移動到 JuiceFS 根目錄下的 .trash 目錄內,保留指定時間後才將資料真正清理。 SeaweedFS 暫不支援此功能。

運維工具

JuiceFS 提供了 juciefs stats 以及 juicefs profile 兩種子命令,允許使用者實時檢視當前或回放某一時間段的效能指標。同時,JuiceFS 還對外開發 metrics 介面,使用者能夠方便地將監控資料接入到 Prometheus 與 Grafana 中。

SeaweedFS 則同時實現了 Push 與 Pull 2種方式對接 Prometheus 與Grafana ,同時提供了 weed shell 的互動式工具方便使用者進行一系列運維工作(如檢視當前叢集狀態、列舉檔案列表等)。

其它

  • 在釋出時間上,SeaweedFS 於 2015 年 4 月釋出,目前累計 stars 為 16.4K,而 JuiceFS 於 2021 年 1 月釋出,截止目前累計 7.3K stars。

  • 在專案上,JuiceFS 與 SeaweedFS 皆採用了對商用更友好的 Apache License 2.0,SeaweedFS 主要由 Chris Lu 個人進行維護,而 JuiceFS 則主要由 Juicedata 公司進行維護。

  • JuiceFS 與 SeaweedFS 皆採用 Go 語言進行編寫。

對比清單

SeaweedFS JuiceFS
後設資料 多引擎 多引擎
後設資料操作原子性 未保證 通過資料庫事務保證
變更紀錄檔
資料儲存 包含 外部服務
糾刪碼 支援 依賴外部服務
資料合併 支援 依賴外部服務
檔案拆分 8MB 64MB + 4MB
分層儲存 支援 依賴外部服務
資料壓縮 支援(基於擴充套件名) 支援(全域性設定)
儲存加密 支援 支援
POSIX 相容性 基本 完整
S3 協定 基本 基本
WebDAV 協定 支援 支援
HDFS 相容性 基本 完整
CSI 驅動 支援 支援
使用者端快取 不支援 支援
叢集資料複製 雙向非同步、多模式 不支援
雲上資料快取 支援(手動同步) 不支援
回收站 不支援 支援
運維工具 提供 提供
釋出時間 2015.4 2021.1
主要維護者 個人(Chris Lu) 公司(Juicedata Inc)
語言 Go Go
開源協定 Apache License 2.0 Apache License 2.0

如有幫助的話歡迎關注我們專案 Juicedata/JuiceFS 喲! (0ᴗ0✿)