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