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]的交互式工具方便使用者進行一系列運維工作(如查看當前集群狀態、列舉文件列表等)。
其它
?在發布時間上,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 |
審核編輯:劉清
-
存儲系統
+關注
關注
2文章
405瀏覽量
40842 -
volume
+關注
關注
0文章
5瀏覽量
7835 -
MySQL
+關注
關注
1文章
802瀏覽量
26452 -
Posix
+關注
關注
0文章
36瀏覽量
9488
原文標題:淺析SeaweedFS與JuiceFS架構異同
文章出處:【微信號:OSC開源社區,微信公眾號:OSC開源社區】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論