神奇的联合文件系统(UnionFileSystem)

关于联合文件系统(这里简称UnionFS)最早是从一段香的OMV介绍文中看到的,实际用上它的契机倒是因为近几年被老莱炒火的unRAID。

unRAID号称可以在允许磁盘休眠的同时实现跨盘卷与数据冗余,想了一想这不就是一段香提到的UFS+Snapraid吗。

本着试用结束后就回去折腾OMV的想法试了2个月的unRAID,在试用期过后系统再起不能的时候我的大脑已被真香支配,便情不自禁地冲了钱成为了正儿八经的unRAID用户。当然这并不是一篇unRAID的安利文,这里主要还是想介绍一下unRAID所使用的核心之一——UnionFS。

UnionFS的分支很多,现在应该都用mergerfs了吧,unRAID与mergerfs相似度较高,兴许只是将mergerfs整合了一下,但这些分支版本本身也大同小异,是不是mergerfs也不太重要。

实施部分我想放到后面来写,在此之前,我们先来看看最常见的存储形式——静态卷。

静态卷类似Windows中的C盘、D盘、E盘,磁盘与磁盘之间数据独立,互不影响。缺点是多盘管理十分不便。

我们往往会根据数据类型而对这些静态卷进行分类,比如视频存放在Vol1,工作文档存放在Vol2,久而久之,可能在Vol1爆满的时候Vol2还是空闲。

你也可以把Vol3挂载到Vol1的同级目录中,让它们看起来像是同一块磁盘的2个目录,但往往很多时候你想要的是往Vol1里塞更多东西而不是骗自己说Vol3也一样。

那么有没有办法把这3块盘串在一起呢?

你好,有的!逻辑卷就是为此而生。

我们平时所看到的文件其实是通过文件系统(filesytem)将一堆二进制数据“模拟”出来的产物。既然文件系统可以从一块盘中的茫茫多的数据里找出对应的数据块构成文件,那么自然也可以在多块盘的数据中找出对应的数据组合成相应的文件。

把一块连续的数据分散成几个小部分分别存储到各磁盘中去,这种存储方式我们称之为条带化存储,而存放这些数据的磁盘组我们称之为”存储池”。

对整个存储池建立文件系统形成的卷便成了逻辑卷。

常见的存储池有LVM、RAID、ZPool、StoragePool(Windows)等。

有了存储池便不用再担心磁盘分类及空间利用率的问题,因为你的所有硬盘都“合并”成了一块,于此同时,数据分散也有利于减轻单个磁盘的IO负担,变相提高了系统的整体IO性能。

凡事有利也有弊,现在来说说坏处。

数据条带化带来的一个显著影响就是盘与盘之间风险共享,当一块磁盘发生故障时,上层文件系统中涉及此盘数据的文件将被一并波及。

在企业级的应用里往往会通过数据冗余来解决这个问题,冗余使得数据在损毁后有了重建的可能。人们常提到的raid5在如今动辄10T一块硬盘的环境下可靠性已经远远达不到能充分信赖的程度,而可靠性更佳的raid6/1则需要庞大的冗余成本。

通常我们建议普通家庭用户尽量采用备份而非冗余的方式保护数据,毕竟对家庭用户来说硬盘中的大部分数据都是网络上随处可见的文件,在小部分的重要数据有多个备份的前提下,即便发生磁盘故障,你也不会永远失去那些未备份的数据。

但你整理硬盘倾注的心血可能就打水漂了。

在充分认识存储池的利弊后,很多人选择了JBOD这种首尾相连的垂直条带化存储,再辅予一定的备份措施后不失为一种相对合理且成本低廉的存储方式。

而另一种方案则是这里要重点介绍的对象,它有静态卷的一切优点,又具备存储池逻辑卷的大部分优势,它就是UnionFS。

UnionFS本质上只是把现有静态卷映射到一个统一的目录里假装自己是一个逻辑卷(如下图)。我们这里就称它为虚拟卷好了。

 

当Disk1损坏时并被拔出时,机智的你应该已经猜到它会是下面的样子了

这样静态卷不易管理文件的问题解决了,数据条带化的隐患也不用过于担心了。UFS自身也可通过一定的存储调度机制来自动分配数据存放位置,虽然无法跟条带化存储相提并论,但依然在一定程度上改善了静态卷空间利用率。利多而弊极少(弊:相传UnionFS的IO性能会有所降低,最好配合SSD做缓存使用,但我其实不太能感受得出来)

那么怎么实现呢?

推荐使用mergerfs,项目地址

《神奇的联合文件系统(UnionFileSystem)》有一个想法

发表评论

电子邮件地址不会被公开。 必填项已用*标注