NAS 磁盘文件系统如何设计

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

问题:

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

4440 次点击
所在节点    NAS
51 条回复
heimoshuiyu
238 天前
@aloxaf 缓存问题你说的对,但我指的是在有写缓存的方案之上创建 btrfs 或 zfs ,上层的文件系统调用 fsync()写入数据时,下层的写缓存设备在数据实际写入磁盘之前就向文件系统报告已经写入完成,并且可能改变实际的写入顺序。这相当于破坏了日志文件系统的一致性

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

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

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

然后就是 zfs 和 brtfs 的对比,一个能管磁盘,一个就是比较高层次的磁盘系统,所以。然后别歧视 zfs ,有过很多性能测试,RAID-Z1 比 RAID-5 (软,或者非企业卡)还是能高不少的,当然了就是吃内存吃性能。当初我是研究了一圈,自攒的 8HDD+4SSD+2NVME 系统,上了 quts hero ,然后前一段 zfs 也下放到了 qts 上。
alex8
237 天前
@ZGeek
所有的文件系统都不会自动发现修复,只有读取或自检时才会校验纠错,并在 dmsg 里记录日志.
破坏性测试'dd if=/dev/random of=/dev/sda2 bs=512 count=10 seek=$((2**29/512))'
无论那种方案,都要定期 scrub
dilidilid
175 天前
@ZGeek ZFS 总的来说稳定性肯定是要比 btrfs ,尤其是 btrfs over mdadm 好很多的,白群晖的 btrfs over mdadm 是魔改过的,不是原始版本,也并不是官方推荐的运行方式,你自己在 Linux 发行版上捣鼓稳定性只会更差。
不过 ZFS 不能在 SSD 开写缓存也不方便做真正的分层,但话又说回来,SSD 分层存储在家用环境的意义本来就很存疑,你直接把热数据全放到 SSD 上然后定期 clone 到你大的 storage pool 不就好了吗,为啥一定要强行合并成一个大的 pool 呢

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

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

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

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

© 2021 V2EX