自建 NAS 遇到坑,我重新设计了方案,请教各位的使用经验

2023-09-27 22:43:09 +08:00
 gridsah

目前方案

HPE Microserver Gen10 四核心版 (不是 plus, 不带 iLO),纯 NAS ,使用 pkg 装了 NUT v2.8.0 来和 APC bk650m2-ch 通信。这台 UPS 专门供这一台 NAS 用。不跑存储 (NFSv4 only) 和备份脚本之外的东西。需要折腾的服务都跑在另一台 DELL R220 上。

系统盘是光驱位的 intel s3710 200G ,裸装 FreeBSD 13.2 。

数据存储在 4x8T HC320 ZFS raidz2 上。两个 PCIe 接口插了 3 块 NVME ,一个用转接卡转出两块 16G 傲腾做 raid1 SLOG ,另一块装 256G NVME SSD 做 L2ARC 和 SWAP 。

有额外的 8T (HC320) + 2T (西数金盘) 做冷备。

遇到坑

目前表现是,我的白群晖用 NFSv4 从 raidz2 上读数据到群晖的存储池中可以跑满 FreeBSD 单口的 1G 带宽,持续一段时间之后整个系统就自动重启。PC 使用 NFSv4 从 raidz2 拷数据到本地硬盘也一样。

刚开机之后跑 6G 左右 NFSv4 流量就会重启,开机大约 4 小时之后跑 20G 以上的流量也没事。

刚开机之后用 iperf3 测试,用双端口链路聚合跑满 2G 带宽,打 40G 流量 (双向各测一次共 80G) 也不会自动重启。倒是我还观察到 bge 驱动在 iperf3 测试中的波动特别大 (700M+ ~ 900M+)。

我以为是我自己没事就 freebsd-update fetch install 引入了 bug ,但是由于每次更系统时候都有快照,所以我回滚到了最初版本的系统,问题依旧。所以应该不是系统更新导致了这个问题。

crash log 里面什么都没有,很干净。

还有一点我觉得很重要,应该提一下。我在 FreeBSD 的 bugzilla 找到,FreeBSD 使用的 bge 网卡驱动由于开发者手里没有设备,有些 bug 还无法解决,导致目前还不能用于生产环境。

这问题应该是系统装好就有了,但是由于开机后只需要多等几个小时这个问题就不容易被触发,而我又有 UPS 才导致这个问题就没表现出来。几个月以后,就是最近的一次停电,UPS 没撑到来电导致 NAS 关机,我刚开机没几分钟就开始干活时候,有了大的网络负载,这才发现。

目前无法判断是 bge 的驱动有 bug 还是 NFSv4 有 bug 。但现在问题无法解决,FreeBSD 这个方案肯定是用不成了。

新方案

有冷备,可以瞎折腾,不怕丢数据;利用现有硬件,不加新机器,柜子放不下了。

核心需求是 NFS ,后续可能会加 samba 。需要跑一些备份数据的 python & sh 脚本。

第一个方案:

Linux + ZFS on Linux 。PVE 好像就是这个思路。我只需要把旧存储池导入就行。

我用好多年 PVE ,两个礼拜前刚把 PVE 的存储换成本地的两个 ZFS pool + NFSv4 from HPE Gen10 就遇到了 Gen10 流量一大就自动重启的问题。

Debian 或者 RHEL (开发者授权) 这两个系统我比较熟,要装的话应该在这两个系统里选了。不晓得 ZoL 现在靠谱不靠谱。

我是比较偏向于这个方案,少折腾,也有成熟的应用案例。请教各位 ZoL 在 Linux 上表现怎么样?

第二个方案:

Linux + btrfs 。群晖是这个思路。

我用的话,mdadm (raid5 or raid6) 然后直接格式化成 btrfs 。我看 btrfs status 里的 raid 那几行还没有变成 OK 。

还有就是我在论坛里找到好些 btrfs 丢数据的帖子,ZFS 丢数据的帖子很少。

我感觉这个方案不是很靠谱。但有群晖大规模商用的案例在前,所以也可以考虑迁移到这个方案。各位推荐这个方案吗?

第三个方案:

Linux + mdadm (raid5 or raid6) + lvm (主要用快照) + ext4/xfs 。我第一版 NAS 的方案,也是最通用的方案。

但是我非常需要 COW 文件系统的快照以及 checksum 功能 (纠正 bit rotate)。

所以这个方案的优先级比较靠后。我还是偏向于使用 ZFS/btrfs 这种 '下一代' 文件系统。

第四个方案:

Microserver 也是 server ,所以.....HP 的兼容列表里有 Windows Server 。

但 Windows Server 的技术栈我实在是没精力了解......

所以这个方案的优先级......

另外,就我司 Windows Server DFS 的使用体验来看,Windows 存储方面的坑也少不了。

2449 次点击
所在节点    程序员
22 条回复
nuk
2023-09-28 02:48:06 +08:00
没插个显示器看看是什么错误?个人感觉应该和 bge 关系不大,如果能找到 crash 的地方就好说了。
gridsah
2023-09-28 08:06:59 +08:00
@nuk 今天晚上我接个显示器看看 console 有没有报错,估计是没有。

我个人觉得是 bge driver 的锅,因为我配 Wake on LAN 的时候,bge 的行为就很古怪,bugzilla 也找到了相关问题说它还没法正常支持 WoL 。最终方案是,我在 BIOS 里记下两个网口的 mac 地址,需要 WoL 的时候向这两个 mac 发 magic packet ,这才可以正常唤醒。

倒是 NFSv4 有问题的可能性不大。
henyi2211
2023-09-28 09:14:34 +08:00
用现有的 NAS 系统不香吗,truenas 、unraid
gridsah
2023-09-28 09:35:28 +08:00
@henyi2211 Unraid TrueNAS 现在都是 Linux+OpenZFS+WebUI 。我的需求里面没有 WebUI ,也不需要买它们的 support 服务。

bro 注意看主题,我是在问这几个组合的使用体验,不是求推荐。
guochao
2023-09-28 10:49:38 +08:00
现在 zfs 主要是在 openzfs 上做开发了吧,bsd 那边可能也切过来了?我这两年没有特别多用其他 unix ,不大好横向比较

我的 pc 现在是 nixos root on openzfs ,compression=on ,开 dedup 以后资源消耗有点大,但是我感觉在公司用 xfs vdo 也是有点,后来关掉了,因为发现我的用例来说即使算上 rust / node_modules 实际上好像也没有那么多 duplication 。文件系统自带 samba/nfs 这种感觉有点……奇异。现在处于不停的啃 openzfs 、gentoo 、solaris 之类的文档的状态,打算先在日常使用、变更最多的机器上尝试各种新技术以后再上 nas 。

nas 之前是 btrfs ,但是我心里有点打鼓,尤其是我没有用专门的很好的设备,而是捡了个垃圾,供电什么的都没有那么好。所以也是先换 debian + mdadm + xfs 了,在公司用的多,我自己解决一部分问题,大佬解决一部分问题。btrfs 以后再尝试吧。

比较在意 lvm2 的 snapshot 在什么方面不能满足需求?我自己感觉 lvm2 的 snapshot 一般情况也够用了

truenas core 现在还是 freebsd 吧?我看 truenas scale 是 linux 的样子。以前尝试过 core ,后来没太多用这个。
zdy349
2023-09-28 11:10:29 +08:00
直接 LINUX
数据重要上个硬 raid+ext4/xfs 这种方案吧
数据不重要甚至可以直接 noraid+随便怎么折腾吧
gridsah
2023-09-28 11:16:37 +08:00
@guochao 是的,FreeBSD 现在也切到了 OpenZFS 上。dedup 目前没有足够有说服力的应用案例,所以我不用这个功能。

OpenZFS 不支持 samba ,但支持 NFS ,原理是 OpenZFS 直接和内核里的 NFS 子系统通信,但是据说还有点小问题。所以 FreeBSD 上的 OpenZFS 在这里有一些 hack ,就是让 OpenZFS 把发往内核的信息解析成 /etc/exports 文件的配置项,放在 /etc/zfs/exports 再用常规的方法加载进 NFS 子系统。

由于我是 NFS 的重度用户,所以 FreeBSD 上 NFS 服务的几个核心文档的中文版是我翻译的 https://note.lishouzhong.com/article/translation/sitemap-index.html 另外,说起来我还是 Gentoo wiki 简中区的翻译 hhhhhhh

btrfs 我只在群晖 718p 上用过半年多,但是它的性能实在太差,而我的群晖又没法在 WebUI 上配缓存,所以我就切到 ext4 下面了。另外我看到有帖子说群晖上的 btrfs 离开群晖之后只能在特定几个版本的 Linux 内核下读数据。所以,我对这个文件系统的稳定性还是持怀疑态度。

lvm 快照占用的硬盘空间是预先分配的,如果给快照用的空间被写满,那快照对于后续的数据就失效了。这时候回滚可能会让 APP 认为数据不一致。但是 ZFS/btrfs 就没有给快照预分配空间这种操作,快照默认可以利用剩余的最大空间。

我还挺喜欢 FreeBSD 的,但是这个硬件兼容性实在是让人头大.....我在公司 ESXi7 上的 FreeBSD VM 倒是跑得一点问题都没有。

我不选成品 NAS 系统是因为,我的核心需求很简单,NFS/samba+python/sh ,并不需要 WebUI 也不买 support 服务。
gridsah
2023-09-28 11:20:29 +08:00
@zdy349 我需要快照、文件系统级别的 checksum (修复 bit rotate)。
另外,核心数据我有冷备,不怕丢数据,但是我怕 bit rotate 。

我现在偏向于 Linux + ZFS 所以来论坛请教一下使用经验。注意看主题。
guochao
2023-09-28 11:41:14 +08:00
@gridsah 赞!

> 原理是 OpenZFS 直接和内核里的 NFS 子系统通信
哈,我暂时还没有研究这些。如果是这样的话,其实我就比较倾向直接用 exports ,因为最近非常喜欢 nixos 那种 declarative 的理念,而且这种方法管理的系统很容易统一各种 id ,不过不开心的就是还有很多工具不大好声明式管理,需要写很多足够健壮的脚本

> btrfs 离开群晖之后只能在特定几个版本的 Linux 内核下读数据
群晖用了一些私有的 flag ,是有问题。对于我来说,我更多的是被 arch wiki 里面的警告吓到了:The RAID 5 and RAID 6 modes of Btrfs are fatally flawed 。所以之前尝试 btrfs 的时候,叠了一层 mdadm ,btrfs 跑在单个 md 设备上。

> 快照用的空间被写满
对照了一下使用场景,我的 use case 里面数据大部分时候是增加的,不会有很多改变,所以对于我来说分配好 volume 留出冗余就还好。对于经常有变更的场景感觉是个问题
gridsah
2023-09-28 14:11:01 +08:00
@guochao

> The RAID 5 and RAID 6 modes of Btrfs are fatally flawed

Arch 的 wiki 说的是真的,btrfs 自己的文档也说 raid56 unstable
https://btrfs.readthedocs.io/en/latest/Status.html

我需要足够灵活的快照,所以 LVM 用起来很吃力,特别是在空间规划方面需要更多精力。
gridsah
2023-09-28 21:35:20 +08:00
@nuk Gen10 插显示器重新复现了一下 bug ,机器的表现是突然暴毙,啥输出都没看到。

我从感觉上来说是 bge 有 bug 。因为我第二次重新配好链路聚合才复现出 bug 来。

第一次操作:

Gen10 双端口链路聚合 loadbalance l3 l4 算法,只插一个口到傻交上,另一个口没插。单网口跑了 40G 流量还没触发 bug 。

第二次操作:

把管理交换机拆出来,重新把 Gen10 的两个口都插到交换机配好链路聚合的两个口上,重新测。6G 流量之后暴毙,显示器没有任何 echo 。

就是,突然,就没了。暴毙。
nuk
2023-09-28 23:08:00 +08:00
@gridsah 6G 就是 30 秒左右?是不是触发了 watchdog ,但是网卡应该不至于造成整个系统 reset 吧,看看能不能升级 bios 啥的
gridsah
2023-09-28 23:28:14 +08:00
@nuk 6G 60s 左右,因为 NFSv4 读文件时候是单线程,所以无法触发链路聚合,只能跑 1G 带宽。

是不是触发 watchdog 我就不了解了。触发 bug 的一瞬间机器就重启了,重启完日志也很干净,我的水平也不足以给内核 debug 。

包括 BIOS 在内的所有固件已经更到最新版了。现在的只能把数据备份一下转 Linux 了。
nuk
2023-09-28 23:41:49 +08:00
@gridsah 那没办法了,直接 reset 大概率是硬件触发的,不知道 bge 里提到的两个参数有没有用
hw.bge.allow_asf
Allow the ASF feature for cooperating with IPMI. Can cause
system lockup problems on a small number of systems. Enabled
by default.

dev.bge.%d.msi
Non-zero value enables MSI support on the Ethernet hardware.
The default value is 1.
gridsah
2023-09-29 09:10:01 +08:00
@nuk Microserver Gen10 没有 IPMI 。而且我推测也不是中断机制的问题,因为这个 bug 在开机几个小时后就很难触发。

我刚刚让 11 楼提到的的 '第一次操作' 也触发了 bug ,就是双口链路聚合但只插一个口到傻交,然后开机后马上用 NFSv4 的负载占满 Gen10 的 1G 上行,4.7G 满载的上行流量就能触发 bug 。两个网口都试过了,都可以以这种方式触发 bug 。

我现在接上冷备盘,备份数据之后开始转 Linux 。

另外,修正 13 楼,是,我让 NFSv4 以单线程读文件,所以无法触发链路聚合。NFSv4 本身是多线程结构。
gridsah
2023-09-29 17:31:19 +08:00
单网口,配静态地址,不带链路聚合也能触发 bug ....
gridsah
2023-10-01 20:38:45 +08:00
@nuk #12 看起来这个 hard reset 是由 watchdog 出发的,因为我在 Debian12 的日志里找到了

kernel: sp5100-tco sp5100-tco: Watchdog hardware is disabled

但是要修这玩意得改 BIOS.....
nuk
2023-10-02 00:02:17 +08:00
@gridsah 不知道是不是 amdsbwd 这个模块,可以禁止加载看看
gridsah
2023-10-03 09:08:17 +08:00
@nuk #18 不搞了,硬盘上的 FreeBSD 已经没了,被我换成了 Debian12 。这几天正在看看 journalctl -b 里面报的错有什么是我能修的。
gridsah
2023-10-03 10:18:04 +08:00
这里发一下选系统的流程给后来人做个参考。

从惠普那找到 Gen10 的 QuickSpecs 文档,发现官方确定兼容的系统是 REHL 7.4 ,去红帽那里下载好对应版本。装上去,导出启动日志。

我想用 Debian12 ,装上去,导出启动日志。

最后两个日志汇总 warning 和 error ,以 RHEL 7.4 日志为基准,按照出错的功能/硬件,有:

FADT field Pm2ControlBlock has valid Length but zero Address......
Ignoring BGRT: failed to map image memory

-pmd_set_huge: Cannot satisfy [mem 0xf8000000-0xf8200000] with a huge-page mapping due to MTRR override.

[Firmware Bug]: HEST: Table contents overflow for hardware error source: 2.

-[Firmware Bug]: ACPI: No _BQC method, cannot determine initial brightness
-pci 0000:05:03.0: ASPM: Could not configure common clock

pnp 00:04: disabling [mem 0xfeb00000-0xfeb00fff] because it overlaps
usb: port power management may be unreliable

+device-mapper: core: CONFIG_IMA_DISABLE_HTABLE is disabled. Duplicate IMA measurements will not be record
+pstore: ignoring unexpected backend 'efi'

sp5100-tco sp5100-tco: Watchdog hardware is disabled

-random: systemd: uninitialized urandom read (16 bytes read)
-usb 2-4.1: device descriptor read/64, error -32

kfd kfd: error getting iommu info. is the iommu enabled?
kfd kfd: Error initializing iommuv2 for device (1002:9874)
kfd kfd: device (1002:9874) NOT added due to errors

以短横线 - 开头的是 RHEL 7.4 独有的报错,以加号 + 开头的是 Debian12 独有的报错。其他是两个系统共有的报错。

一通 google 之后,发现以 + 开头的 2 条信息都是些不影响它作为 NAS 使用的小问题,RHEL 上独有的报错不确定会影响啥。

我需要用 USB 外接 SATA3 硬盘来做冷备,两个系统都有的 USB 电源管理的报错倒不重要,毕竟传完数据就把 USB 线拔走了,耗电不耗电不重要,反正不会烧设备。但是 RHEL 独有的那个 usb 报错就让我心里没底。

至于其他共有的报错,惠普说 RHEL 7.4 没问题,那就姑且认为这些报错不影响使用吧。

决定使用 Debian12 。

启动日志读下来,感觉 HPE Microserver Gen10 这个设备就像是一个半成品,Gen10 plus 才是成品。

官方宣称兼容的 RHE 7.4 都有这么多报错,而且有些出错的 ACPI 功能实际上是 iLO 要用的功能,而 Gen10 没有 iLO 。

此外,如果在 BIOS 里面开了 iommu ,那么板载的 raid 卡就出问题,需要在内核参数中加入 iommu=pt 或者 iommu=soft 才能让系统正常认到板载 raid 卡里的四块硬盘。但我又不开虚拟机,所以在 BIOS 里面把 iommu 关了,不会触发板载 raid 卡的 bug 。

感觉上来说,Gen10 的 BIOS 固件压根没用心做。



最终,目前 Gen10 作为 NAS 的方案是,200G intel S3710 (uefi+lvm+ext4) + 4*8T HC320 (raidz2) + 2*16G 傲腾 (SLOG) + 256G NVMe SSD (200G as cache)。

这次迁移发现,我有可靠的冷备方案,可以接受 raid5 连炸两块盘,决定抽点时间把 raidz2 重建成 raidz 。

在查资料的过程中,我还是认为支持 COW 文件系统才是未来趋势。ZFS 现在在 Oracle 手里,就我对 Oracle 的了解,它绝对不会把 ZFS 的 CDDL 改成 GPL ,进入 Linux 内核的只有 btrfs 一枝独苗。RH 的 stratis 只是把现有的方案整合了一下假装是个 '下一代文件系统',并不是一个新的 fs 。所以我再给了 btrfs 一次机会,把群晖上的文件系统从 ext4 切成了 btrfs ,性能差是差,倒也基本够用。目前一切正常。

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

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

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

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

© 2021 V2EX