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 协议,提供远程访问能力