MemoryFS 存儲(chǔ)系統(tǒng)的一些構(gòu)想
1. 使用內(nèi)存作為存儲(chǔ)介質(zhì)
圖片
如上圖是存儲(chǔ)金字塔,展示了存儲(chǔ)介質(zhì)價(jià)格與速度的關(guān)系。
目前,企業(yè)之所以廣泛采用磁帶和磁盤作為存儲(chǔ)介質(zhì),主要是因?yàn)樗鼈兊膬r(jià)格優(yōu)勢(shì)。市場(chǎng)價(jià)格受市場(chǎng)供需影響,即便是價(jià)格較高的存儲(chǔ)介質(zhì),如果生產(chǎn)成本低廉,具有足夠大的市場(chǎng),生產(chǎn)過(guò)程中的良品率高,那么其市場(chǎng)價(jià)格也會(huì)降下來(lái)。
市場(chǎng)的平衡點(diǎn)在于,存儲(chǔ)介質(zhì)能夠滿足消費(fèi)者的需求,同時(shí)消費(fèi)者愿意支付的價(jià)格能夠覆蓋生產(chǎn)成本。然而,這種平衡并非一蹴而就,產(chǎn)能的投入需要較長(zhǎng)周期,而價(jià)格競(jìng)爭(zhēng)卻是瞬息萬(wàn)變,這種長(zhǎng)短周期的不匹配導(dǎo)致了市場(chǎng)價(jià)格的波動(dòng)。
我們對(duì)存儲(chǔ)介質(zhì)的速度和容量的需求在不斷增長(zhǎng),總是追求更快、更經(jīng)濟(jì)、更大容量的存儲(chǔ)解決方案。這種需求的增長(zhǎng)將推動(dòng)市場(chǎng)平衡點(diǎn)的移動(dòng),催生新的需求,同時(shí)也促進(jìn)了存儲(chǔ)技術(shù)的創(chuàng)新與發(fā)展。
將內(nèi)存作為存儲(chǔ)介質(zhì)存在兩大挑戰(zhàn):成本高昂和斷電后數(shù)據(jù)丟失。
價(jià)格的問(wèn)題,要交給需求,如果需求端大爆發(fā),內(nèi)存作為存儲(chǔ)介質(zhì)的價(jià)格就會(huì)降下來(lái)。掉電易失,可以從軟硬件層面解決。軟件層面,可以通過(guò)冗余、糾刪碼重建等方式提高數(shù)據(jù)的可靠性;硬件層面有英特爾的傲騰作為先烈可以借鑒。當(dāng)然,也可以不解決掉電易失的問(wèn)題,掉電易失只是在傳統(tǒng)場(chǎng)景下是缺點(diǎn),如果在一個(gè)需要保密的場(chǎng)景下呢?掉電易失,可能成為一個(gè)很好的解決方案。尋找新的場(chǎng)景、高附加值的需求,也是一個(gè)不錯(cuò)的思路。
基于以上考慮,我認(rèn)為直接使用內(nèi)存作為存儲(chǔ)介質(zhì),在未來(lái)是一個(gè)可選的方案。但這不意味著,會(huì)成為主流方案,而只是在某些場(chǎng)景下,會(huì)帶來(lái)很大的便利或收益。
2. 分布式的內(nèi)存存儲(chǔ)
如果僅僅只是在一臺(tái)設(shè)備上創(chuàng)建一個(gè)存儲(chǔ)區(qū)域,那么使用 tmpfs 就可以做到。
因此,分布式、支持橫向擴(kuò)展是 MemoryFS 的一個(gè)必要的特性。
圖片
如上圖是 MemoryFS 的元數(shù)據(jù)與數(shù)據(jù)分離的存儲(chǔ)架構(gòu)。
直接使用 Redis 存儲(chǔ)元數(shù)據(jù),其實(shí)是一個(gè)非常不錯(cuò)的選擇。在使用 JuiceFS 社區(qū)版時(shí),我首選也是使用 Redis 作為元數(shù)據(jù)存儲(chǔ),Redis 只需要 1GB 的內(nèi)存就能夠支持約 2TB 的數(shù)據(jù)存儲(chǔ)。
另外一種方案是,使用 RocksDB 和 Raft 實(shí)現(xiàn)一個(gè)分布式的元數(shù)據(jù)存儲(chǔ),這樣會(huì)帶來(lái)更加便捷的部署、更加可定制的存儲(chǔ)方案。
3. 支持 POSIX 協(xié)議
在 Linux 系統(tǒng)上,支持 POSIX 協(xié)議的存儲(chǔ)能夠掛載到文件系統(tǒng)中,提供遠(yuǎn)程訪問(wèn)能力,能夠擴(kuò)展應(yīng)用場(chǎng)景。
而常見的支持 POSIX 協(xié)議的方式是使用 Fuse,JuiceFS、SeaweedFS 也都是基于 Fuse 提供的 POSIX 協(xié)議。
在 https://github.com/torvalds/linux/tree/master/fs 中可以看到一般的文件系統(tǒng) ext4、btrfs 等都是內(nèi)核中實(shí)現(xiàn)的。而 Fuse 提供了一種不用修改內(nèi)核,就能實(shí)現(xiàn)自定義文件系統(tǒng)的方法。
圖片
如上圖,使用 Fuse 主要分為如下步驟:
- 掛載到文件系統(tǒng)中。執(zhí)行 ./hello /tmp/fuse, 將文件系統(tǒng)掛載到 /tmp/fuse 中。圖中使用的是 libfuse 庫(kù),但其實(shí)也有其他語(yǔ)言庫(kù),比如 golang 的 https://github.com/hanwen/go-fuse。在 ./hello 程序中需要實(shí)現(xiàn)指定的接口,對(duì)接到外部的存儲(chǔ)介質(zhì)中。
- 使用文件系統(tǒng)。執(zhí)行 ls /tmp/fuse,可以看到文件系統(tǒng)中的文件列表。在執(zhí)行命令時(shí),通過(guò) libc 進(jìn)行系統(tǒng)調(diào)用,經(jīng)過(guò)內(nèi)核中的 Fuse 模塊轉(zhuǎn)發(fā)給 hello 程序,然后 hello 程序響應(yīng) ls 命令對(duì)應(yīng)的文件系統(tǒng) API。
圖片
如上圖,需要?jiǎng)?chuàng)建 MemoryFS Workers 組成的 Cluster 提供存儲(chǔ)服務(wù),使用時(shí),通過(guò)一個(gè)本地 Fuse 程序掛載到當(dāng)前目錄即可。
4. 總結(jié)
本篇主要是記錄一些構(gòu)想,將內(nèi)存作為存儲(chǔ)介質(zhì)對(duì)外提供存儲(chǔ)能力,主要內(nèi)容如下:
- 內(nèi)存介質(zhì)作為存儲(chǔ)介質(zhì),在未來(lái)是一個(gè)可選的存儲(chǔ)方案
- 分布式、支持橫向擴(kuò)展是 MemoryFS 的一個(gè)必要的特性
- MemoryFS 需要支持 POSIX 協(xié)議,提供遠(yuǎn)程訪問(wèn)能力