V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
这是一个专门讨论 idea 的地方。

每个人的时间,资源是有限的,有的时候你或许能够想到很多 idea,但是由于现实的限制,却并不是所有的 idea 都能够成为现实。

那这个时候,不妨可以把那些 idea 分享出来,启发别人。
ecnelises
V2EX  ›  奇思妙想

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

  •  
  •   ecnelises · 2022-07-26 23:55:14 +08:00 · 2487 次点击
    这是一个创建于 846 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    • 两块或多块硬盘大小不同的时候,大的那块剩余空间没法利用
    • 迁移不方便,要么一块一块换盘重建,要么整体搬移
    • 需要绑定某个文件系统,而 macOS/Linux/Windows 原生支持的文件系统都没这么多 RAID 选项(除了简单的 0 和 1 )
    • 需要提前占据整个硬盘或分区

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

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

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

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

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

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

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

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

    @libook
    无意义文件这个问题确实不好解决,只能放在目录里藏起来作为软件私有的存储
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1057 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 19:39 · PVG 03:39 · LAX 11:39 · JFK 14:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.