V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要把任何和邀请码有关的内容发到 NAS 节点。

邀请码相关的内容请使用 /go/in 节点。

如果没有发送到 /go/in,那么会被移动到 /go/pointless 同时账号会被降权。如果持续触发这样的移动,会导致账号被禁用。
ZGeek
V2EX  ›  NAS

NAS 磁盘文件系统如何设计

  •  
  •   ZGeek · 11 天前 · 2996 次点击

    现状

    1. 4 块 4TB HDD 硬盘
    2. 1 块 512GB SSD 硬盘
    3. 64GB 内存(没有 ECC )

    目的

    1. 能够实现快照
    2. 能够自动检测文件错误并修复
    3. 能够使用 SSD 作为缓存,加速读写

    前两条为强需求

    场景

    1. 家庭用户,资料数据、照片数据不期望损坏,期望不丢失
    2. 电影随意,可以随时丢失
    3. 读写频次并不高
    4. 可以接收因为缓存损坏导致的 1-3 天数据丢失(近期数据或照片都在电脑或手机上有备份,不怕丢失近期数据)

    方案

    方案 1

    raid1->bcache->btrfs

    1. 2 块 HDD 组 raid1(使用 mdadm) -> md0
    2. 1 块 SSD 和 md0 结合使用 bacache 创建缓存后的块设备 -> bcache0
    3. 把 bcache0 格式化为 btrfs

    缺点:

    1. 数据损坏的时候不知道哪一块上的数据是好的,而且因为 raid1 处于底层,brtfs 也无法进行数据修复

    2. bcache 设备损坏不清楚会不会导致整个 btrfs 磁盘损坏

    方案 2

    bcache->btrfs+raid1

    1. 1 块 HDD 和 1/2 块 SSD 组缓存后的块设备 -> bcache0
    2. 1 块 HDD 和 1/2 块 SSD 组缓存后的块设备 -> bcache1
    3. bcache0 和 bcache1 使用 brtfs 组成 raid1

    缺点:

    1. bcache 设备损坏不清楚会不会导致整个 btrfs 磁盘损坏
    2. 缓存盘浪费,写入的是一样的数据,但是却缓存了两份

    方案 3

    raid5(mdadm) -> bcache -> btrfs

    大家经常说 raid5 重建很痛苦,而且不一定成功,有些害怕

    方案 4

    ZFS

    缺点:资源消耗大,磁盘性能下降严重(听说的,不清楚实际情况)

    方案 5

    LVM ,因为其缓存也是工作在块设备这一层的,和方案 1 和 2 类似,就不考虑了

    问题:

    各位朋友什么建议?大家一般怎么规划自己的文件系统?

    第 1 条附言  ·  9 天前
    补充一些资料:
    之前我用的白群晖,白群晖的官方方案就是 btrfs over lvm+cache over mdadm(raid1),已知的发生过一次一张照片损坏的情况,深入研究后发现,raid1 并不能修复文件错的问题(因为只有两份数据,完全不知道哪个数据是正确的(操作系统层面的不知道)),所以才有这么一次。

    今天学了有关 ZFS 的知识,发现 ZFS 会把部分重要信息放在内存中,如果出现内存反转(这就是为何 ZFS 强调 ECC 的原因),影响是比较大的,所以目前自己的方案变成了:brtfs(raid1) over bcache(可以拆掉),群晖中用 btrfs 大概用了 5 年,也就出现了那一次这样的问题,所以目前对 brtfs 相对还是比较信任的。ZFS 主要是担心其长时间运行的稳定性( 5 年+),目前没有看到 v 友们有这么长时间的。且观望吧。
    50 条回复    2025-01-19 21:39:52 +08:00
    kiracyan
        1
    kiracyan  
       11 天前
    SSD 缓存 2 块 HDD 做普通数据盘 2 块 HDD 做 raid 1 普通盘可以定期备份到 raid1 里
    waifu2x
        2
    waifu2x  
       11 天前
    目前手持 zfs-raidz1 4X8T, 性能下降还行, 快照很爽, 数据损坏暂时未遇到
    其他硬盘也基本 all in zfs 了, zfs 性能下降是大文件会被切成块, 然后碎片又无法整理, 不在乎大文件高速顺序写, 问题不大
    dalaoshu25
        3
    dalaoshu25  
       11 天前
    4 块 4T 硬盘,重建一次 raid5 ,我用时从 12 小时到 22 小时。重点是要用功率余量大性能可靠的电源。很多山寨和自己组装存储服务器的玩家都不舍得在电源上多花点儿钱。
    stort
        4
    stort  
       11 天前
    既然考虑了 raid5 不如试试 zfs 的 raidz ,用着很舒服,不开 dedup 消耗也没那么大,快照和擦洗很方便,也可以添加 vdev 当缓存(虽然单 ssd 做缓存加速读写可能不稳
    yulgang
        5
    yulgang  
       11 天前
    没带缓存的阵列卡就别用 raid5 了,性能会很差

    u 盘里塞个 freenas ,zfs 就可以
    Paulownia
        6
    Paulownia  
       11 天前
    我是 3 块 2t 盘做的 zfs raidz1 ,外加一 480 的 ssd 走了缓存,所有都是默认配置,然后发现一个奇怪的现象就是通过 dd 测试但块硬盘的速率大概是 200M 左右,然后 zfs 只有 100M 以下,甚至偶尔 50-60M ,结果运行了一段时间之后,发现 zfs 的 dd 测试速率达到了 200M 。。。也不知道是为啥。。。反正用做挂 pt ,smb 共享电影,倒也没啥特别影响体验的,就再也没怎么关注速率了。
    yolyzhu
        7
    yolyzhu  
       11 天前
    ZFS 组镜像条带就完事了,SSD 缓存都不需要。
    msg7086
        8
    msg7086  
       11 天前
    zfs 就完事了,资源消耗?磁盘性能?没听说过。
    YsHaNg
        9
    YsHaNg  
       11 天前
    群晖的 btrfs+md+lvm 倒是可以互相引用冗余和 checksum 修复错误
    ashong
        10
    ashong  
       11 天前
    A 日常存储
    B+C+D snapraid, 定时同步
    yolyzhu
        11
    yolyzhu  
       11 天前
    @msg7086 搞个 ZFS 用用,听说有个屁用。
    ntedshen
        12
    ntedshen  
       11 天前
    哥们,你这强需求基本就把范围锁死了,还能怎么选。。。

    你在 v2 上问这个问题那就在 v2 搜
    site:v2ex.com/t btrfs
    前五行两个丢数据一个建议观望,这你真敢用?

    虽然我不用 zfs 而且我对 zfs 的刻板印象停留在某些知名油管主被搞炸自己主存储的阶段。。。
    但是你没得选了。。。
    MoonLin
        13
    MoonLin  
       11 天前
    都用 bcache 了为什么不直接用 bcachefs 直接组建?
    kaedeair
        14
    kaedeair  
       11 天前 via Android
    snapraid+云盘同步?
    ZGeek
        15
    ZGeek  
    OP
       11 天前
    @YsHaNg #9 并不行,我的数据最初是放在群晖里的,raid1+brtfs ,结果有张照片坏了
    shihira
        16
    shihira  
       11 天前
    我已经实现好并正在用的方案,可参考一下:

    nvme0: SSD ext4
    zpool: 4xHDD zfs
    mergerfs: 2xHDD mergerfs over ext4

    tier0: (nvme0) 临时文件,通常是 Cache 、BT 下载途中的文件
    tier1: (nvme0/zpool) 需要经常快速读写的重要文件,比如代码和配置文件,定期备份到 zpool
    tier2: (zpool) 收集起来不太容易的资源文件、比较喜欢的音乐电影、日剧录像
    tier3: (zpool/mergerfs) 重要但不太需要经常读写的大文件,比如照片录像,定期备份到 mergerfs
    tier4: (mergerfs) 非常容易重新下载的东西,大热门电影电视剧

    - zpool 每个季度要做 scrub
    - 大热门影视真的没必要做冗余,留个种放在 tier1 就好了
    - 存在 mergerfs 里,任何一个盘坏了都不会损失全部数据,只会损失坏掉哪个盘的数据。
    mapleincode
        17
    mapleincode  
       11 天前
    我发现你们都研究的好深....
    先说明我认为,一旦数据损坏,大概率可能无法被发现,这里前提,损坏是指文件被修改。也就是你在复制或者移动文件时,文件本身已经被损坏了,这个我认为是软级别(系统)的问题而不是硬级别(盘格式)的问题。

    我有两个常用的 nas ,一个是基于 raid5 。一个则全部是 basic ,对,也就是啥也不干,裸奔。basic 常年开机,用于日常数据,而 raid5 的 nas 单纯用于备份,备份之后关机。
    我定期会对同步的照片进行备份,随我心情,可能是几周或者半年。而为了解决,在备份过程中,文件已经损坏的情况,无论是在 copy 前还是 copy 后的损坏。于是我买了几百块钱的光盘,打好压缩包,定期把图片备份到光盘。
    对,我认为解决文件损坏的办法,只有备份,而且还不能是基于文件变动检测的实时备份,因为你被污染的源数据也会同步污染备份数据。

    当然我的方案也可能存在我一起床,发现数据都没了的惨状,所以还得辅佐其他类型的实时备份或者数据校验什么的。
    多备份到多个介质才是最安全的做法。
    ragnaroks
        19
    ragnaroks  
       11 天前
    各种 raid 、fs 都使用过最少半年,最终直接挂上去,比如下载就挂 /dev/sda => /volume/downloads ,然后用 timeshift 定时备份重要数据到网盘(大部分数据都可以重建或重新下载),目前除了一次地震的时候坏了 1 块盘暂未出现其它问题
    ladypxy
        20
    ladypxy  
       10 天前
    首先,肯定要可以支持快照
    其次,要软 Raid 而不是硬件 Raid

    那么,剩下的选择就只有 ZFS 和 btrfs
    个人的话会选择 ZFS
    mayli
        21
    mayli  
       10 天前
    没有 ecc 大概率不需要考虑 2 ) 能够自动检测文件错误并修复
    因为理论上你写的,或者其他情况造成内存位反转就 gg 了。

    我看了下场景,其实你完全可以 (类似群晖的玩法) 做俩 zfs: z1+z0
    硬盘分区,
    每个盘分 1T 出来,组 raidz10, 2T 的空间,重要资料和数据放这里
    剩下 3T 组 raidz0 (12T raw), 放电影,盘坏了,丢了就丢了。

    对于资料和照片等,cache 没啥必要,因为你大部分 io 都是媒体文件顺序 io ,而且也不会反复读写,命中率不高,ssd cache 加速不如你 64G ram 给 zfs 做 arc 。

    ssd 单盘单独用吧,做系统,或者临时缓存。
    mayli
        22
    mayli  
       10 天前
    ps: 只有 btrfs 和 zfs 有快照

    小白的话,无脑群晖+btrfs+raid10 完事。
    喜欢折腾可以玩多分区 zfs.
    infinet
        23
    infinet  
       10 天前
    @mapleincode 全用 ZFS 的话,这些问题都能解决。首先个人电脑上单盘的 ZFS 可以校验文件是否损坏,而且 ZFS 快照很容易,所以即使中勒索病毒之类文件被加密,找回之前版本的文件也是举手之劳。NAS 上 ZFS 组成 raidz 更不用说,一个盘有物理坏道导致校验错误,ZFS 会自动从好盘恢复相关数据。
    totoro625
        24
    totoro625  
       10 天前
    我是方案 4 ZFS /t/979429
    4 块 16T HDD 3 块 SSD 64G 内存无 ECC

    如果只有一块 SSD ,建议 512G SSD 分 32G 给 PVE ,32G 给 ZFS 写缓存,256G 给 ZFS 读缓存,剩下空间给 PVE 的 swap 和虚拟机的 swap
    4 块机械硬盘 RaidZ1 / RaidZ2
    yuxian
        25
    yuxian  
       10 天前
    ZFS 用了快十年了,随时增减硬盘,感觉良好。但重要数据,还是建议使用可靠云厂商,直接 OSS 备份。
    lerry
        26
    lerry  
       10 天前
    zfs 就可以,
    1. 我是自己写的脚本快照,如果你需要更简便的管理,可以用 TrueNas Scale
    2. 文件被系统读取的时候才会发现错误,所以一般都会设置定期扫描,有冗余就会修复错误

    经过我的研究,对于 zfs ,ECC 不是那么有必要,但是大内存有很多好处。
    性能没感觉有多少下降,确实需要更多内存,但是是用于读取缓存了,会有加速

    一块 ssd 可以分成两个盘,一个给系统,一个 zfs 加速,不过你已经有 64g 内存了,ssd 加速可能不明显,都给系统,用于跑应用比较好
    newaccount
        27
    newaccount  
       10 天前
    4 块 4T 的,两个拿出来做 raid1
    剩下两块,一个用来做 raid1 的冷备,另一个做冷备的冷备
    “自动检测文件错误并修复”别想了,多备份更重要
    vmebeh
        28
    vmebeh  
       10 天前
    raidz 的话写缓存要高可靠,最好用双盘/分区 mirror ,读缓存没所谓单盘/分区即可
    yayoi
        29
    yayoi  
       10 天前 via Android
    有一个基本相同的硬件配置,弄了个 raid10 ,原来也想要能够自动检测文件错误并修复的功能,但是研究了下 btrfs ,发现稳定性和性能都不佳,妥协了下还是用了传统的 xfs ,重要数据另外加备份。另外一定要分区了再 raid 。
    heimoshuiyu
        30
    heimoshuiyu  
       10 天前
    首先 btrfs 就有点灵车属性,把 btrfs 放在任何方案之上都是灵上加灵,灵车漂移。数据损坏不是丢几天数据这么简单的问题,如果硬件或其他故障,缓存里的数据不一定能写回 btrfs ,可能破坏 btrfs 元数据,导致整个文件系统出问题。

    zfs 资源消耗大是事实,但 op 有 64G 内存我认为是资源充裕。我在树莓派和系统盘上使用 btrfs ,在 32G 内存的 nas 上使用 zfs 。

    我的 nas 曾经是 4x4T 的 btrfs raid1 ,小文件比较多,ls 一个 10000+文件的目录需要 5 秒以上,sqlite3 数据库经常需要 30s 写一个 transaction 。迁移到 zfs 后这些问题都不存在。要说性能下降,btrfs 比 zfs 更严重。

    没有 ECC 使用任何文件系统的风险是一样的,zfs 没有什么特殊的地方。

    op 有 4 个盘,考虑到 btrfs raid5/6 是灵车,只能用 raid1 。btrfs raid1 的意思是吧数据块放在任意两个设备上,那么 4 块盘坏任意两块就会导致 **全部** 数据丢失。而且目前 btrfs raid1 没有实现读取的加速,读取是根据 pid 数字选择设备,除非你有多进程,否则读取就是单盘的速度。

    综上,简单需求 / 资源受限 / 设备大小不一致或者未来会经常增减设备 的情况下才考虑使用 btrfs
    lovelylain
        31
    lovelylain  
       10 天前 via Android
    btrfs 要对 sqlite 文件关闭 cow ,不然性能太狗屎了
    msg7086
        32
    msg7086  
       10 天前
    @ntedshen #12 老莱炸 zfs 是因为他自己的 zfs 是纯手动搭建配置的环境,没有像现代 zfs 环境那样有全自动的磁盘检查计划任务和告警之类的东西,所以就等于是数据放在那里腐烂了好久,才突然想起来去看看怎么回事。

    正常人配 zfs ,装好以后默认就有 zfs scrub 了,就算你什么都不做也没法复刻老莱炸盘事件。
    msg7086
        33
    msg7086  
       10 天前
    @ntedshen 然后 btrfs 已经在大规模企业级商用了,但是这个使用是有条件的,就是服务器硬件环境(即假设内存不会出现 bitrot ,硬盘不会物理损坏,系统不会经常断电),在这个条件下,单盘和 RAID1 是非常可用的。
    家用级硬件环境没法保证内存全部 ECC 保护,也没法保证底层硬件不会突然暴毙,所以可靠性存疑,但反过来说的话,也不是那么不堪就是。
    ntedshen
        34
    ntedshen  
       10 天前
    @msg7086 不是哥们你不用和我讲,我又不用 zfs 。。。
    只是这 op 兄弟俩需求一合计那就是有且只有 zfs 。。。
    不管他有没有问题他都只能选 zfs ,除非他自己捣鼓一套 fs 以外的方案。。。
    msg7086
        35
    msg7086  
       10 天前
    @ntedshen 我只是在你的基础上补充说明一下。
    mapleincode
        36
    mapleincode  
       10 天前
    @infinet #23 别的问题不大,快照本身也得占用不少的硬盘容量吧。而且不清楚他快照的逻辑,如果仅仅以文件作为快照还好,如果是类似虚拟机的快照,频繁修改文件目录会造成海量的硬盘容量使用?当然不可否认的是,快照本身可以解决文件被修改的问题。
    YsHaNg
        37
    YsHaNg  
       10 天前 via iPhone
    @mapleincode cow 文件系统增量快照只占用很少空间
    mylovesaber
        38
    mylovesaber  
       10 天前
    bcache 我两年前在几百台服务器上尝试过,几乎都有崩掉的情况出现,然后做过不少尝试,没能平安修复,数据也拿不出来,只能 ssd 和 hdd 都格盘重新组建...不知道现在稳定性如何了
    aloxaf
        39
    aloxaf  
       9 天前
    @heimoshuiyu

    你说的「缓存因为意外无法写入」,任何文件系统都存在这个问题,对缓存利用越激进(如 ZFS )就越容易有这个问题。但 btrfs 和 zfs 一样是抗断电的,它和 ZFS 一样有校验、有 CoW ,元数据默认存两份,虽然会炸,但也不是这个原因炸。

    zfs 通常性能确实比 btrfs 好,这类 CoW 文件系统都无可避免地存在碎片化问题,zfs 靠缓存来弥补。btrfs 在这方面只能根据负载来手动优化。

    比如你说 ls 一个 10000+ 文件的目录要 5s+,我猜是你没有启用 noatime 挂载,导致每次访问都会修改 atime ,在 HDD+小文件+CoW 的组合下,这简直就是灾难。
    又比如你说 sqlite3 很慢,这也是碎片的锅,btrfs 确实不适合数据库这种负载。如果要用,建议使用 chattr +C 对数据库关闭 CoW ,可以有效提升性能。

    btrfs raid1 没有读取加速是真的,但是 4 坏 2 就会导致数据全部丢失没听说过,那 2 块盘 raid1 岂不是一坏就炸 。btrfs 在降级状态默认会拒绝挂载,是不是和这个搞混了?

    最终结论我没什么意见,我自己也是 nas zfs + PC btrfs 。
    alex8
        40
    alex8  
       9 天前 via iPhone
    Linux 下 Lvm 你要的功能它都有,性能不错最稳定,为什么要排除呢
    heimoshuiyu
        41
    heimoshuiyu  
       9 天前 via Android
    @aloxaf 缓存问题你说的对,但我指的是在有写缓存的方案之上创建 btrfs 或 zfs ,上层的文件系统调用 fsync()写入数据时,下层的写缓存设备在数据实际写入磁盘之前就向文件系统报告已经写入完成,并且可能改变实际的写入顺序。这相当于破坏了日志文件系统的一致性

    noatime 我开了,数据库目录我也 +C 了,btrfs defrag 有一些改善,但不多,现在想也可能是因为我元数据用 raid1c3 的原因(

    在 btrfs raid1 模式下,文件被分成多个片段,每个片段写入到任意两个设备中,不管池里有多少设备,如果写入分布均匀,同时坏两块盘,那么几乎可以肯定会有数据和它的副本位于这两块坏盘上,这些数据就损坏了。也就是说,btrfs raid1 只能容忍坏两块盘,坏两块盘必丢数据,数据很有可能分布在各个文件中,盘越多风险越高
    aloxaf
        42
    aloxaf  
       9 天前
    @heimoshuiyu #41 这是 raid10 吧,那确实坏两块盘有大概率炸。
    laminux29
        43
    laminux29  
       9 天前
    你需要的就是 OpenZFS ,说资源消耗大的,是因为开启了实时去重与实时压缩这两个企业级功能。家用的话,把这两个功能关闭,资源消耗就正常了。我 8GB 虚拟机带 5 个 12 TB 的硬盘,稳定跑了 1 年多了。
    ZGeek
        44
    ZGeek  
    OP
       9 天前
    @shihira #16 很不错的方案,你做的比较精细,我的数据量不大,很多年了,4T 没用到一半,以后估计也不会有很多数据了,主要是能够数据纠错就够了。
    ZGeek
        45
    ZGeek  
    OP
       9 天前
    @mapleincode #17 多备份只能解决不丢,若是备份前数据已经坏了,而你又不自知,问题就大了,我用 ZFS 和 brtfs ,核心看重的就是能够透明侦测到错误并恢复
    ZGeek
        46
    ZGeek  
    OP
       9 天前
    补充一些资料:
    之前我用的白群晖,白群晖的官方方案就是 btrfs over lvm+cache over mdadm(raid1),已知的发生过一次一张照片损坏的情况,深入研究后发现,raid1 并不能修复文件错的问题(因为只有两份数据,完全不知道哪个数据是正确的(操作系统层面的不知道)),所以才有这么一次。

    今天学了有关 ZFS 的知识,发现 ZFS 会把部分重要信息放在内存中,如果出现内存反转(这就是为何 ZFS 强调 ECC 的原因),影响是比较大的,所以目前自己的方案变成了:brtfs(raid1) over bcache(可以拆掉),群晖中用 btrfs 大概用了 5 年,也就出现了那一次这样的问题,所以目前对 brtfs 相对还是比较信任的。ZFS 主要是担心其长时间运行的稳定性( 5 年+),目前没有看到 v 友们有这么长时间的。且观望吧。
    ZGeek
        47
    ZGeek  
    OP
       9 天前
    @alex8 #40 LVM 没法做到数据的自动修复吧
    ZGeek
        48
    ZGeek  
    OP
       9 天前
    @mylovesaber #38 非常感谢生产级别的经验分享
    cpstar
        49
    cpstar  
       8 天前
    四块盘,折腾那么多干啥,RAID-5 或者软 RAID ,性能也是个差到姥姥家,上 RAID-10 那肯定心疼到姥姥家。所以四块盘就是个很尴尬的。当然现在低端 SSD 也很便宜了,上分级存储不是问题,但是就是怎么设计分级的逻辑解决一致性问题。或者再加两块盘,上个 RAID6/Z2 。

    然后就是 zfs 和 brtfs 的对比,一个能管磁盘,一个就是比较高层次的磁盘系统,所以。然后别歧视 zfs ,有过很多性能测试,RAID-Z1 比 RAID-5 (软,或者非企业卡)还是能高不少的,当然了就是吃内存吃性能。当初我是研究了一圈,自攒的 8HDD+4SSD+2NVME 系统,上了 quts hero ,然后前一段 zfs 也下放到了 qts 上。
    alex8
        50
    alex8  
       8 天前
    @ZGeek
    所有的文件系统都不会自动发现修复,只有读取或自检时才会校验纠错,并在 dmsg 里记录日志.
    破坏性测试'dd if=/dev/random of=/dev/sda2 bs=512 count=10 seek=$((2**29/512))'
    无论那种方案,都要定期 scrub
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   726 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 20:54 · PVG 04:54 · LAX 12:54 · JFK 15:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.