淺析 SeaweedFS 與 JuiceFS 架構異同

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 種 [1] 數據庫。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 的概念對隨機寫、順序讀、重複寫等性能進行了優化。(詳情見讀取清求處理流程 [2])

分層存儲

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

數據壓縮

JuiceFS 支持使用 LZ4 或者 ZStandard 來爲所有寫入的數據進行壓縮,而 SeaweedFS 則是根據寫入文件的擴展名、文件類型等信息來選擇是否進行壓縮。

存儲加密

JuiceFS 支持傳輸中加密(encryption in transit)及靜態加密(encryption at rest),在用戶開啓了靜態加密時,需要用戶傳遞一個自行管理的密鑰,所有寫入的數據都會基於此密鑰進行數據的加密。詳情見 《數據加密 [4]》。

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

訪問協議

POSIX 兼容性

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

S3 協議

JuiceFS 通過 MinIO S3 網關實現了 S3 網關 [8] 的功能。它爲 JuiceFS 中的文件提供跟 S3 兼容的 RESTful API,在不方便掛載的情況下能夠用 s3cmd、AWS CLI、MinIO Client(mc)等工具管理 JuiceFS 上存儲的文件。

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

WebDAV 協議

JuiceFS 與 SeaweedFS 皆支持 WebDAV 協議。

HDFS 兼容性

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

CSI 驅動

JuiceFS[12] 與 SeaweedFS[13] 皆提供了 「Kubernetes CSI Driver」 以幫助用戶在 Kubernetes 生態中使用對應的文件系統。

擴展功能

客戶端緩存

JuiceFS 有着多種客戶端緩存策略,涵蓋從元數據到數據緩存的各個部分,允許用戶根據自己的應用場景進行調優(詳情 [14]),而 SeaweedFS 不具備客戶端緩存能力。

集羣數據複製

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

JuiceFS 尚未原生支持集羣之間的數據同步功能,需要依賴元數據引擎和對象存儲自身的數據複製能力。

雲上數據緩存

SeaweedFS 可以作爲雲上對象存儲的緩存來使用,支持通過命令手動預熱數據。對於緩存數據的修改,會異步同步到對象存儲中。JuiceFS 需要將文件分塊存儲到對象存儲中,尚不支持爲對象存儲中已有的數據提供緩存加速。

回收站

JuiceFS 默認開啓回收站 [15] 功能,會自動將用戶刪除的文件移動到 JuiceFS 根目錄下的 .trash 目錄內,保留指定時間後纔將數據真正清理。SeaweedFS 暫不支持此功能。

運維工具

JuiceFS 提供了 juciefs stats 以及 juicefs profile 兩種子命令,允許用戶實時查看當前或回放某一時間段的性能指標。同時,JuiceFS 還對外開發 metrics[16] 接口,用戶能夠方便地將監控數據接入到 Prometheus 與 Grafana 中。

SeaweedFS 則同時實現了 Push 與 Pull[17] 2 種方式對接 Prometheus 與 Grafana ,同時提供了 weed shell[18] 的交互式工具方便使用者進行一系列運維工作(如查看當前集羣狀態、列舉文件列表等)。

其它

對比清單

vKLMJf

關於作者

Ethan

Juicedata 全棧工程師

引用鏈接

[1] 24 種: https://github.com/seaweedfs/seaweedfs/wiki/Filer-Stores
[2] 讀取清求處理流程: https://juicefs.com/docs/zh/community/internals/io_processing
[3] 冷熱數據的分離: https://github.com/seaweedfs/seaweedfs/wiki/Tiered-Storage
[4] 數據加密: https://juicefs.com/docs/zh/community/security/encrypt
[5] 完全兼容 POSIX: https://juicefs.com/docs/zh/community/posix_compatibility
[6] 「Issue 1558」: https://github.com/seaweedfs/seaweedfs/issues/1588
[7] Wiki: https://github.com/seaweedfs/seaweedfs/wiki/FUSE-Mount
[8] S3 網關: https://juicefs.com/docs/zh/community/s3_gateway
[9] Amazon-S3-API: https://github.com/seaweedfs/seaweedfs/wiki/Amazon-S3-API
[10] 完整兼容 HDFS API: https://juicefs.com/docs/zh/community/hadoop_java_sdk
[11] 基礎兼容: https://github.com/seaweedfs/seaweedfs/wiki/Hadoop-Compatible-File-System
[12] JuiceFS: https://github.com/juicedata/juicefs-csi-driver
[13] SeaweedFS: https://github.com/seaweedfs/seaweedfs-csi-driver
[14] 詳情: https://juicefs.com/docs/zh/community/cache_management
[15] 回收站: https://juicefs.com/docs/zh/community/security/trash/
[16] metrics: https://juicefs.com/docs/zh/community/administration/monitoring
[17] Push 與 Pull: https://github.com/seaweedfs/seaweedfs/wiki/System-Metrics
[18] weed shell: https://github.com/seaweedfs/seaweedfs/wiki/weed-shell

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/vOHb4oZ-iSuxn0Uqd2F5XA