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

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

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

NAS 磁盘文件系统如何设计

  •  
  •   ZGeek · 1 天前 · 2358 次点击

    现状

    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 类似,就不考虑了

    问题:

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

    40 条回复    2025-01-18 09:46:24 +08:00
    kiracyan
        1
    kiracyan  
       1 天前
    SSD 缓存 2 块 HDD 做普通数据盘 2 块 HDD 做 raid 1 普通盘可以定期备份到 raid1 里
    waifu2x
        2
    waifu2x  
       1 天前
    目前手持 zfs-raidz1 4X8T, 性能下降还行, 快照很爽, 数据损坏暂时未遇到
    其他硬盘也基本 all in zfs 了, zfs 性能下降是大文件会被切成块, 然后碎片又无法整理, 不在乎大文件高速顺序写, 问题不大
    dalaoshu25
        3
    dalaoshu25  
       1 天前
    4 块 4T 硬盘,重建一次 raid5 ,我用时从 12 小时到 22 小时。重点是要用功率余量大性能可靠的电源。很多山寨和自己组装存储服务器的玩家都不舍得在电源上多花点儿钱。
    stort
        4
    stort  
       1 天前
    既然考虑了 raid5 不如试试 zfs 的 raidz ,用着很舒服,不开 dedup 消耗也没那么大,快照和擦洗很方便,也可以添加 vdev 当缓存(虽然单 ssd 做缓存加速读写可能不稳
    yulgang
        5
    yulgang  
       1 天前
    没带缓存的阵列卡就别用 raid5 了,性能会很差

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

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

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

    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  
       1 天前
    我发现你们都研究的好深....
    先说明我认为,一旦数据损坏,大概率可能无法被发现,这里前提,损坏是指文件被修改。也就是你在复制或者移动文件时,文件本身已经被损坏了,这个我认为是软级别(系统)的问题而不是硬级别(盘格式)的问题。

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

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

    那么,剩下的选择就只有 ZFS 和 btrfs
    个人的话会选择 ZFS
    mayli
        21
    mayli  
       1 天前
    没有 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  
       1 天前
    ps: 只有 btrfs 和 zfs 有快照

    小白的话,无脑群晖+btrfs+raid10 完事。
    喜欢折腾可以玩多分区 zfs.
    infinet
        23
    infinet  
       1 天前
    @mapleincode 全用 ZFS 的话,这些问题都能解决。首先个人电脑上单盘的 ZFS 可以校验文件是否损坏,而且 ZFS 快照很容易,所以即使中勒索病毒之类文件被加密,找回之前版本的文件也是举手之劳。NAS 上 ZFS 组成 raidz 更不用说,一个盘有物理坏道导致校验错误,ZFS 会自动从好盘恢复相关数据。
    totoro625
        24
    totoro625  
       1 天前
    我是方案 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  
       1 天前
    ZFS 用了快十年了,随时增减硬盘,感觉良好。但重要数据,还是建议使用可靠云厂商,直接 OSS 备份。
    lerry
        26
    lerry  
       1 天前
    zfs 就可以,
    1. 我是自己写的脚本快照,如果你需要更简便的管理,可以用 TrueNas Scale
    2. 文件被系统读取的时候才会发现错误,所以一般都会设置定期扫描,有冗余就会修复错误

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

    一块 ssd 可以分成两个盘,一个给系统,一个 zfs 加速,不过你已经有 64g 内存了,ssd 加速可能不明显,都给系统,用于跑应用比较好
    newaccount
        27
    newaccount  
       22 小时 49 分钟前
    4 块 4T 的,两个拿出来做 raid1
    剩下两块,一个用来做 raid1 的冷备,另一个做冷备的冷备
    “自动检测文件错误并修复”别想了,多备份更重要
    vmebeh
        28
    vmebeh  
       22 小时 45 分钟前
    raidz 的话写缓存要高可靠,最好用双盘/分区 mirror ,读缓存没所谓单盘/分区即可
    yayoi
        29
    yayoi  
       22 小时 29 分钟前 via Android
    有一个基本相同的硬件配置,弄了个 raid10 ,原来也想要能够自动检测文件错误并修复的功能,但是研究了下 btrfs ,发现稳定性和性能都不佳,妥协了下还是用了传统的 xfs ,重要数据另外加备份。另外一定要分区了再 raid 。
    heimoshuiyu
        30
    heimoshuiyu  
       21 小时 51 分钟前
    首先 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  
       21 小时 20 分钟前 via Android
    btrfs 要对 sqlite 文件关闭 cow ,不然性能太狗屎了
    msg7086
        32
    msg7086  
       19 小时 56 分钟前
    @ntedshen #12 老莱炸 zfs 是因为他自己的 zfs 是纯手动搭建配置的环境,没有像现代 zfs 环境那样有全自动的磁盘检查计划任务和告警之类的东西,所以就等于是数据放在那里腐烂了好久,才突然想起来去看看怎么回事。

    正常人配 zfs ,装好以后默认就有 zfs scrub 了,就算你什么都不做也没法复刻老莱炸盘事件。
    msg7086
        33
    msg7086  
       19 小时 52 分钟前
    @ntedshen 然后 btrfs 已经在大规模企业级商用了,但是这个使用是有条件的,就是服务器硬件环境(即假设内存不会出现 bitrot ,硬盘不会物理损坏,系统不会经常断电),在这个条件下,单盘和 RAID1 是非常可用的。
    家用级硬件环境没法保证内存全部 ECC 保护,也没法保证底层硬件不会突然暴毙,所以可靠性存疑,但反过来说的话,也不是那么不堪就是。
    ntedshen
        34
    ntedshen  
       19 小时 52 分钟前
    @msg7086 不是哥们你不用和我讲,我又不用 zfs 。。。
    只是这 op 兄弟俩需求一合计那就是有且只有 zfs 。。。
    不管他有没有问题他都只能选 zfs ,除非他自己捣鼓一套 fs 以外的方案。。。
    msg7086
        35
    msg7086  
       19 小时 47 分钟前
    @ntedshen 我只是在你的基础上补充说明一下。
    mapleincode
        36
    mapleincode  
       17 小时 54 分钟前
    @infinet #23 别的问题不大,快照本身也得占用不少的硬盘容量吧。而且不清楚他快照的逻辑,如果仅仅以文件作为快照还好,如果是类似虚拟机的快照,频繁修改文件目录会造成海量的硬盘容量使用?当然不可否认的是,快照本身可以解决文件被修改的问题。
    YsHaNg
        37
    YsHaNg  
       16 小时 57 分钟前 via iPhone
    @mapleincode cow 文件系统增量快照只占用很少空间
    mylovesaber
        38
    mylovesaber  
       16 小时 55 分钟前
    bcache 我两年前在几百台服务器上尝试过,几乎都有崩掉的情况出现,然后做过不少尝试,没能平安修复,数据也拿不出来,只能 ssd 和 hdd 都格盘重新组建...不知道现在稳定性如何了
    aloxaf
        39
    aloxaf  
       43 分钟前
    @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  
       11 分钟前 via iPhone
    Linux 下 Lvm 你要的功能它都有,性能不错最稳定,为什么要排除呢
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2746 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 01:57 · PVG 09:57 · LAX 17:57 · JFK 20:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.