SeaweedFS 是一款高效的分散式檔案儲存系統,最早的設計原型參考了 Facebook 的 Haystack,具有快速讀寫小資料塊的能力。本文將通過對比 SeaweedFS 與 JuiceFS 在設計與功能上的差異,以幫助讀者進行更適合自己的選擇。
SeaweedFS 由 3 部分組成,底層儲存檔案的 Volume Server,用於管理叢集的 Master Server,以及一個向上提供更多特性的 Filer 可選元件。
在系統運作上,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 已經包含了計算檔案位置(偏移)的所有資訊,因此可以高效地將檔案的內容讀取出來。
在上述的底層儲存單元之上,SeaweedFS 提供了一個名為 Filer 的元件。通過向下對接 Volume Server 與 Master Server,對外提供豐富的功能與特性(如 POSIX 支援、WebDAV、S3 介面等)。與 JuiceFS 相同,Filer 也需要對接一個外部資料庫以儲存後設資料資訊。
為了方便闡述,下文中所指的 SeaweedFS,皆包含了 Filer 元件。
JuiceFS 採用「資料」與「後設資料」分離儲存的架構,檔案資料本身會被切分儲存在物件儲存(如 Amazon S3)當中,而後設資料則是會被儲存在使用者自行選擇的資料庫裡(如 Redis、MySQL)。通過共用同一個份資料庫與物件儲存,JuiceFS 實現了一個強一致性保證的分散式檔案系統,同時還具有「POSIX 完全相容」、「高效能」等諸多特性。
SeaweedFS 與 JuiceFS 都支援通過外部資料庫以儲存檔案系統的後設資料資訊。在資料庫支援層面,SeaweedFS 支援多達 24 種資料庫。 JuiceFS 對資料庫事務能力要求高(見下文),當前支援了 3 類共 10 種事務型資料庫。
為了保證所有後設資料操作的原子性,JuiceFS 在實現層面需要使用有事務處理能力的資料庫。而 SeaweedFS僅在執行 rename 操作時啟用了部分資料庫(SQL、ArangoDB 和 TiKV)的事務, 對於資料庫的事務能力要求較低。同時,由於Seaweed FS 在 rename 操作中拷貝後設資料時,未對原目錄或檔案進行加鎖,可能會導致過程中更新的資料丟失。
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」進行管理。
JuiceFS 完全相容 POSIX, 而 SeaweedFS 目前只實現了部分的 POSIX 相容(「Issue 1558」 與 Wiki),功能還持續完善中。
JuiceFS 通過 MinIO S3 閘道器實現了 S3 閘道器的功能。它為 JuiceFS 中的檔案提供跟 S3 相容的 RESTful API,在不方便掛載的情況下能夠用 s3cmd、AWS CLI、MinIO Client(mc)等工具管理 JuiceFS 上儲存的檔案。
SeaweedFS 當前支援了約 20 個 S3 API,覆蓋了常用的讀寫查刪等請求,對一些特定的請求(如 Read)還做了功能上的擴充套件,詳細見 Amazon-S3-API。
JuiceFS 與 SeaweedFS 皆支援 WebDAV 協定。
JuiceFS 完整相容 HDFS API。不僅相容 Hadoop 2.x 和 Hadoop 3.x,還相容 Hadoop 生態系統中的各種元件。SeaweedFS 則是提供了對 HDFS API 的基礎相容,對於部分操作(如 turncate、concat、checksum 和擴充套件屬性等)則尚未支援。
JuiceFS 與 SeaweedFS 皆提供了 「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✿)