能否实现一个文件级别的 RAID 库?

2022-07-26 23:55:14 +08:00
 ecnelises

众所周知,RAID 有通过芯片实现的硬件 RAID ,也有像 ZFS 这样由文件系统实现的软件 RAID. 不过传统的 RAID 有若干缺点:

所以,在单个软件需要数据冗余和性能的情况下,是否可以实现一个库,以读写多个硬盘上指定文件的方式实现类似 RAID 的功能?不同硬盘文件系统可以不一样,RAID 文件也无需占据整个硬盘或分区,而是像虚拟机硬盘一样慢慢增长就可以。要迁移任意数量的硬盘也很容易,直接把文件复制过去。

这个场景也许比较小众,但看起来还是有意义的。

2497 次点击
所在节点    奇思妙想
8 条回复
ashong
2022-07-27 00:00:54 +08:00
snapraid + mergefs ?
neteroster
2022-07-27 00:02:21 +08:00
SnapRAID 表示你说的很有道理(
hs0000t
2022-07-27 00:07:35 +08:00
snapraid
zagfai
2022-07-27 00:37:10 +08:00
snapraid 的一致性怎么处理?版本冲突怎么处理?
westoy
2022-07-27 00:47:50 +08:00
dd 或者 fallocate 固定大小文件之后 losetup 成 loop 设备再 mdadm 不就行了么
libook
2022-07-27 11:19:30 +08:00
传统 RAID 方案是以磁盘存储单元为单位进行管理的,所以需要整盘进行格式化和使用,只要把这个方案变成以文件系统之上的文件 bit 为单位进行管理,就不需要整盘格式化和使用了,即为题主所描述的特性。

除了 RAID1 以外,常见的冗余方案就是奇偶校验,所以冗余阵列里通常会有两种数据,即真正的数据和校验数据。所以尽管奇偶校验可以以文件 bit 为单位,仍然需要指定哪个文件是真正的数据、哪个文件是校验数据,那么只需要规划好这两种数据的存放位置,就可以实现数据冗余的效果。

以上是冗余的部分,现阶段有个软件叫做 SnapRAID 就是满足这类需求的,它运行于文件系统之上,需要手动进行同步校验数据和灾后恢复,除此之外不干涉用户对文件系统的访问,也就是说你可以用任何文件系统(个别文件系统需要参考官方文档的注意事项),甚至不同盘用不同文件系统,像没有 RAID 一样使用,然后定期手动同步校验数据,也可以设定排除那些目录和文件,一旦出现磁盘问题就可以换新盘将已经生成校验数据的文件恢复。

但要注意,这种冗余是没有 IO 性能的提升的,因为本质上就是将每块硬盘单独挂载使用,性能就是硬盘本身的性能。

如果想提升性能的话,通常就是把读写压力均匀分摊到所有磁盘上,所有磁盘“多核工作”效率成倍提升,如果是磁盘级别的传统 RAID 方案的话,因为用户看不到单盘上具体都写了啥数据,所以用户体验会好一些,但如果在文件级别实现的话,就会出现每个盘都会大量混合存在真正数据和校验数据的情况,会十分杂乱,不知道有没有软件很好解决这个问题。

或者题主只是不想全盘都给 RAID ,那么也可以看看是不是可以用虚拟磁盘的方案,在所有磁盘上创建虚拟磁盘镜像文件,然后用虚拟出来的磁盘做 RAID ,以达到冗余和性能双收,我没试过,题主可以自行研究。
phony2r
2022-07-27 14:46:55 +08:00
cron + rsync
ecnelises
2022-07-28 00:43:58 +08:00
@ashong
多谢,以前还没听说过这俩东西

@libook
无意义文件这个问题确实不好解决,只能放在目录里藏起来作为软件私有的存储

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/868914

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX