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