SeaweedFS 是一款高效的分布式文件存儲系統(tǒng),最早的設(shè)計(jì)原型參考了 Facebook 的 Haystack,具有快速讀寫小數(shù)據(jù)塊的能力。本文將通過對比 SeaweedFS 與 JuiceFS 在設(shè)計(jì)與功能上的差異,以幫助讀者進(jìn)行更適合自己的選擇。
SeaweedFS 系統(tǒng)結(jié)構(gòu)
SeaweedFS 由 3 部分組成,底層存儲文件的 Volume Server,用于管理集群的 Master Server,以及一個向上提供更多特性的 Filer 可選組件。
Volume Server 與 Master Server
在系統(tǒng)運(yùn)作上,Volume Server 與 Master Server 一并服務(wù)于文件的存儲。Volume Server 專注于數(shù)據(jù)的寫入與讀取,而 Master Server 則偏向是一個集群與 Volumes 的管理服務(wù)。
在讀寫數(shù)據(jù)時,SeaweedFS 的實(shí)現(xiàn)與 Haystack 相似,用戶創(chuàng)建的一個 Volume 即是一個大磁盤文件(下圖的 Superblock)。在此 Volume 中,用戶寫入的所有文件(下圖的 Needle)都會被合并到該大磁盤文件中。
在開始寫入數(shù)據(jù)之前,調(diào)用者需要向 SeaweedFS(Master Server)進(jìn)行寫入申請,隨后 SeaweedFS 會根據(jù)當(dāng)前的數(shù)據(jù)量返回一個 File ID(由 Volume ID 與 offset 組成),在寫入的過程中,一并被寫入的還有基礎(chǔ)的元數(shù)據(jù)信息(文件長度與 Chunk 等信息);
當(dāng)寫入完成之后,調(diào)用者需要在一個外部系統(tǒng)(例如 MySQL)中對該文件與返回的 File ID 進(jìn)行關(guān)聯(lián)保存。在讀取數(shù)據(jù)時,由于 File ID 已經(jīng)包含了計(jì)算文件位置(偏移)的所有信息,因此可以高效地將文件的內(nèi)容讀取出來。
Filer
在上述的底層存儲單元之上,SeaweedFS 提供了一個名為 Filer 的組件。通過向下對接 Volume Server 與 Master Server,對外提供豐富的功能與特性(如 POSIX 支持、WebDAV、S3 接口等)。與 JuiceFS 相同,F(xiàn)iler 也需要對接一個外部數(shù)據(jù)庫以保存元數(shù)據(jù)信息。
為了方便闡述,下文中所指的 SeaweedFS,皆包含了 Filer 組件。
JuiceFS 系統(tǒng)結(jié)構(gòu)
JuiceFS 采用「數(shù)據(jù)」與「元數(shù)據(jù)」分離存儲的架構(gòu),文件數(shù)據(jù)本身會被切分保存在對象存儲(如 Amazon S3)當(dāng)中,而元數(shù)據(jù)則是會被保存在用戶自行選擇的數(shù)據(jù)庫里(如 Redis、MySQL)。通過共享同一個份數(shù)據(jù)庫與對象存儲,JuiceFS 實(shí)現(xiàn)了一個強(qiáng)一致性保證的分布式文件系統(tǒng),同時還具有「POSIX 完全兼容」、「高性能」等諸多特性。
元數(shù)據(jù)對比
SeaweedFS 與 JuiceFS 都支持通過外部數(shù)據(jù)庫以存儲文件系統(tǒng)的元數(shù)據(jù)信息。在數(shù)據(jù)庫支持層面,SeaweedFS 支持多達(dá)24 種[1]數(shù)據(jù)庫。JuiceFS 對數(shù)據(jù)庫事務(wù)能力要求高(見下文),當(dāng)前支持了 3 類共 10 種事務(wù)型數(shù)據(jù)庫。
原子性操作
為了保證所有元數(shù)據(jù)操作的原子性,JuiceFS 在實(shí)現(xiàn)層面需要使用有事務(wù)處理能力的數(shù)據(jù)庫。而 SeaweedFS僅在執(zhí)行 rename 操作時啟用了部分?jǐn)?shù)據(jù)庫(SQL、ArangoDB 和 TiKV)的事務(wù), 對于數(shù)據(jù)庫的事務(wù)能力要求較低。同時,由于Seaweed FS 在 rename 操作中拷貝元數(shù)據(jù)時,未對原目錄或文件進(jìn)行加鎖,可能會導(dǎo)致過程中更新的數(shù)據(jù)丟失。
變更日志(changelog)
SeaweedFS 會為所有的元數(shù)據(jù)操作生成變更日志,此日志可被進(jìn)一步用于數(shù)據(jù)復(fù)制(見下文)、操作審計(jì)等功能,而 JuiceFS 則暫未實(shí)現(xiàn)此特性。
存儲對比
如前文所述,SeaweedFS 的數(shù)據(jù)存儲由 Volume Server + Master Server 實(shí)現(xiàn),支持小數(shù)據(jù)塊的「合并存儲」、「糾刪碼」等特性。而 JuiceFS 的數(shù)據(jù)存儲則是依托于對象存儲服務(wù)服務(wù),相關(guān)的特性也都由用戶選擇的對象存儲提供。
文件拆分
在存儲數(shù)據(jù)時,SeaweedFS 與 JuiceFS 都會將文件拆分成若干個小塊再持久化到底層的數(shù)據(jù)系統(tǒng)中。
SeaweedFS 將文件拆分成 8MB 的塊,對于超大文件(超過 8GB),它會將 Chunk 索引也保存到底層的數(shù)據(jù)系統(tǒng)中。
JuiceFS 則是先拆成 64MB 的 Chunk,再拆成 4MB 的 Object,通過內(nèi)部一個 Slice 的概念對隨機(jī)寫、順序讀、重復(fù)寫等性能進(jìn)行了優(yōu)化。(詳情見讀取清求處理流程[2])
分層存儲
對于新創(chuàng)建的 Volume,SeaweedFS 會把數(shù)據(jù)存儲在本地,而對于較舊的 Volume,SeaweedFS 支持將他們上傳至云端以達(dá)到冷熱數(shù)據(jù)的分離[3]。在此方面,JuiceFS 則需要依賴外部的服務(wù)。
數(shù)據(jù)壓縮
JuiceFS 支持使用 LZ4 或者 ZStandard 來為所有寫入的數(shù)據(jù)進(jìn)行壓縮,而 SeaweedFS 則是根據(jù)寫入文件的擴(kuò)展名、文件類型等信息來選擇是否進(jìn)行壓縮。
存儲加密
JuiceFS 支持傳輸中加密(encryption in transit)及靜態(tài)加密(encryption at rest),在用戶開啟了靜態(tài)加密時,需要用戶傳遞一個自行管理的密鑰,所有寫入的數(shù)據(jù)都會基于此密鑰進(jìn)行數(shù)據(jù)的加密。詳情見 《數(shù)據(jù)加密[4]》。
SeaweedFS 同樣支持傳輸中加密與靜態(tài)加密。在開啟了數(shù)據(jù)加密后,所有寫入 Volume Server 的數(shù)據(jù)都會使用隨機(jī)的密鑰進(jìn)行加密,而這些對應(yīng)的隨機(jī)密鑰信息則由維護(hù)「metadata」的「Filer」進(jìn)行管理。
訪問協(xié)議
POSIX 兼容性
JuiceFS完全兼容 POSIX[5], 而 SeaweedFS 目前只實(shí)現(xiàn)了部分的 POSIX 兼容(「Issue 1558」[6]與Wiki[7]),功能還持續(xù)完善中。
S3 協(xié)議
JuiceFS 通過 MinIO S3 網(wǎng)關(guān)實(shí)現(xiàn)了S3 網(wǎng)關(guān)[8]的功能。它為 JuiceFS 中的文件提供跟 S3 兼容的 RESTful API,在不方便掛載的情況下能夠用 s3cmd、AWS CLI、MinIO Client(mc)等工具管理 JuiceFS 上存儲的文件。
SeaweedFS 當(dāng)前支持了約 20 個 S3 API,覆蓋了常用的讀寫查刪等請求,對一些特定的請求(如 Read)還做了功能上的擴(kuò)展,詳細(xì)見Amazon-S3-API[9]。
WebDAV 協(xié)議
JuiceFS 與 SeaweedFS 皆支持 WebDAV 協(xié)議。
HDFS 兼容性
JuiceFS完整兼容 HDFS API[10]。不僅兼容 Hadoop 2.x 和 Hadoop 3.x,還兼容 Hadoop 生態(tài)系統(tǒng)中的各種組件。SeaweedFS 則是提供了對 HDFS API 的基礎(chǔ)兼容[11],對于部分操作(如 turncate、concat、checksum 和擴(kuò)展屬性等)則尚未支持。
CSI 驅(qū)動
JuiceFS[12]與SeaweedFS[13]皆提供了 「Kubernetes CSI Driver」 以幫助用戶在 Kubernetes 生態(tài)中使用對應(yīng)的文件系統(tǒng)。
擴(kuò)展功能
客戶端緩存
JuiceFS 有著多種客戶端緩存策略,涵蓋從元數(shù)據(jù)到數(shù)據(jù)緩存的各個部分,允許用戶根據(jù)自己的應(yīng)用場景進(jìn)行調(diào)優(yōu)(詳情[14]),而 SeaweedFS 不具備客戶端緩存能力。
集群數(shù)據(jù)復(fù)制
對于多個集群之間的數(shù)據(jù)復(fù)制,SeaweedFS 支持「Active-Active」與「Active-Passive」兩種異步的復(fù)制模式,2 種模式都是通過傳遞 changelog 再應(yīng)用的機(jī)制實(shí)現(xiàn)了不同集群數(shù)據(jù)間的一致性,對于每一條 changelog,其中會有一個簽名信息以保證同一個修改不會被循環(huán)多次。在集群節(jié)點(diǎn)數(shù)量超過 2 個節(jié)點(diǎn)的 Active-Active 模式下,SeaweedFS 的一些操作(如重命名目錄)會受到一些限制。
JuiceFS 尚未原生支持集群之間的數(shù)據(jù)同步功能,需要依賴元數(shù)據(jù)引擎和對象存儲自身的數(shù)據(jù)復(fù)制能力。
云上數(shù)據(jù)緩存
SeaweedFS 可以作為云上對象存儲的緩存來使用,支持通過命令手動預(yù)熱數(shù)據(jù)。對于緩存數(shù)據(jù)的修改,會異步同步到對象存儲中。JuiceFS 需要將文件分塊存儲到對象存儲中,尚不支持為對象存儲中已有的數(shù)據(jù)提供緩存加速。
回收站
JuiceFS 默認(rèn)開啟回收站[15]功能,會自動將用戶刪除的文件移動到 JuiceFS 根目錄下的 .trash 目錄內(nèi),保留指定時間后才將數(shù)據(jù)真正清理。SeaweedFS 暫不支持此功能。
運(yùn)維工具
JuiceFS 提供了 juciefs stats 以及 juicefs profile 兩種子命令,允許用戶實(shí)時查看當(dāng)前或回放某一時間段的性能指標(biāo)。同時,JuiceFS 還對外開發(fā)metrics[16]接口,用戶能夠方便地將監(jiān)控?cái)?shù)據(jù)接入到 Prometheus 與 Grafana 中。
SeaweedFS 則同時實(shí)現(xiàn)了Push 與 Pull[17]2種方式對接 Prometheus 與Grafana ,同時提供了weed shell[18]的交互式工具方便使用者進(jìn)行一系列運(yùn)維工作(如查看當(dāng)前集群狀態(tài)、列舉文件列表等)。
其它
?在發(fā)布時間上,SeaweedFS 于 2015 年 4 月發(fā)布,目前累計(jì) stars 為 16.4K,而 JuiceFS 于 2021 年 1 月發(fā)布,截止目前累計(jì) 7.3K stars。
?在項(xiàng)目上,JuiceFS 與 SeaweedFS 皆采用了對商用更友好的 Apache License 2.0,SeaweedFS 主要由 Chris Lu 個人進(jìn)行維護(hù),而 JuiceFS 則主要由 Juicedata 公司進(jìn)行維護(hù)。
? JuiceFS 與 SeaweedFS 皆采用 Go 語言進(jìn)行編寫。
對比清單
SeaweedFS | JuiceFS | |
元數(shù)據(jù) | 多引擎 | 多引擎 |
元數(shù)據(jù)操作原子性 | 未保證 | 通過數(shù)據(jù)庫事務(wù)保證 |
變更日志 | 有 | 無 |
數(shù)據(jù)存儲 | 包含 | 外部服務(wù) |
糾刪碼 | 支持 | 依賴外部服務(wù) |
數(shù)據(jù)合并 | 支持 | 依賴外部服務(wù) |
文件拆分 | 8MB | 64MB + 4MB |
分層存儲 | 支持 | 依賴外部服務(wù) |
數(shù)據(jù)壓縮 | 支持(基于擴(kuò)展名) | 支持(全局設(shè)置) |
存儲加密 | 支持 | 支持 |
POSIX 兼容性 | 基本 | 完整 |
S3 協(xié)議 | 基本 | 基本 |
WebDAV 協(xié)議 | 支持 | 支持 |
HDFS 兼容性 | 基本 | 完整 |
CSI 驅(qū)動 | 支持 | 支持 |
客戶端緩存 | 不支持 | 支持 |
集群數(shù)據(jù)復(fù)制 | 雙向異步、多模式 | 不支持 |
云上數(shù)據(jù)緩存 | 支持(手動同步) | 不支持 |
回收站 | 不支持 | 支持 |
運(yùn)維工具 | 提供 | 提供 |
發(fā)布時間 | 2015.4 | 2021.1 |
主要維護(hù)者 | 個人(Chris Lu) | 公司(Juicedata Inc) |
語言 | Go | Go |
開源協(xié)議 | Apache License 2.0 | Apache License 2.0 |
審核編輯:劉清
-
存儲系統(tǒng)
+關(guān)注
關(guān)注
2文章
400瀏覽量
40808 -
volume
+關(guān)注
關(guān)注
0文章
5瀏覽量
7828 -
MySQL
+關(guān)注
關(guān)注
1文章
793瀏覽量
26353 -
Posix
+關(guān)注
關(guān)注
0文章
36瀏覽量
9476
原文標(biāo)題:淺析SeaweedFS與JuiceFS架構(gòu)異同
文章出處:【微信號:OSC開源社區(qū),微信公眾號:OSC開源社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論