NAS 磁盘文件系统如何设计

2025 年 1 月 16 日
 ZGeek

现状

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

问题:

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

6106 次点击
所在节点    NAS
51 条回复
mayli
2025 年 1 月 17 日
没有 ecc 大概率不需要考虑 2 ) 能够自动检测文件错误并修复
因为理论上你写的,或者其他情况造成内存位反转就 gg 了。

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

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

ssd 单盘单独用吧,做系统,或者临时缓存。
mayli
2025 年 1 月 17 日
ps: 只有 btrfs 和 zfs 有快照

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

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

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

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

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

https://v2ex.ih06.com/t/1105508

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

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

© 2021 V2EX