2023.9 ZFS 能用于数据盘吗?关于 PVE 下 ZFS RAID 等相关 10 个疑问

2023-09-12 09:11:55 +08:00
 totoro625

最近翻了一堆 Wiki/论坛,新 PVE 数据盘主观偏向于 ZFS ,目的是为了用上快照

在实际操作体验中,产生了一些疑问,在 Google 、ChatGPT 、Wiki 、官方论坛内解决了大部分问题,但仍有一些疑问希望能得到有用的答案:

Q1:对于特别热衷于备份的 PVE 用户,RAID or ZFS 是否有必要?

Q2:不适用 ECC 内存、RAID 卡的情况下,4 硬盘 RAID10 对比 ZFS(RAID-Z2)哪个好?

Q3:不适用 ECC 内存、RAID 卡的情况下,2 块硬盘 ZFS(Mirror)+1 块硬盘 ext4 备份 对比 2 块硬盘 RAID1+1 块硬盘 ext4 备份哪个好?

Q4:不启用重复数据删除的情况下,预留 8G 内存给 32T ZFS 存储池是否足够? zfs.arc_max 是否是刚性的?如果如果突发内存占用较大,PVE 系统可用内存不足是否会 boom ?

Q5:低内存条件下 ZFS L2ARC 是否有必要?官方推荐不大于 10 倍内存,如果分配 512G nvme 固态能否充分利用?

Q6:PVE 自带的 ZFS 会不会有坑?只用过 ext4 的一般 Debian 用户能否维护好?

Q7:用了 ZFS 之后如何备份 PVE 虚拟机比较优雅,如果打算异地备份,可以怎么操作?计划 导出 ZFS 的 snapshot 用 Restic 增量去重备份为一堆 128mb 大小的小文件再传输到各个备份点,减轻网络传输压力。

Q8:ZFS(RAID-Z2)不适合存放虚拟机数据,是否应将 VM 系统盘单独放在一个 SSD 上(或者两块 SSD ZFS Mirror)?

Q9:大量的小文件会影响 NFS 性能,具体需要多大的量会影响性能?

注:目前 1.2T 共计 182 万文件,如果 500 万小文件,会有影响吗?

Q10:PVE 下各个 VM 是否应该启用 SWAP ?能否使用内存膨胀替代 SWAP ?

Q11:我即将利用淘汰配置组一套全新的 PVE ,有什么建议给我的吗?

注:优先计划增加 UPS

注 2:已有 1 块 16T 机械硬盘,计划增加 3 块。当前重要数据 1.2T ,归档存储数据 0.5T ,不重要数据 6T ,备份数据若干

注 3:看了 DELL R730XD ,我这点数据量暂不考虑


PS:3 地 3 备+云备


正在运行的虚拟机:

Seafile 专业版,需用到 memcached 、elasticsearch 、Clamav 、OnlyOffice:8~12G 内存; 1.2T 重要数据,急需扩容

MT Photos ,需用到本地 OCR:3~6G 内存; 0.5T 重要数据

Debian 12 ,需用到 Docker ( Tailscale 、NGINX 、frpc ):2~8G 内存

Debian 12 ,跑一些其他服务:4~8G 内存

Openwrt ,512MB 内存,独占

以上服务共计占用物理内存 13G ,KSM 共享 5G ,SWAP2G

当前备份一次数据需用时 10 小时(内网 NFS:DS120J HDD )


现淘汰办公用机,增加部分硬件,搭建新的 PVE8.1 ,计划配置如下:

CPU:Intel i5-11400

主板:华硕 ROG STRIX B560-I GAMING WIFI

内存:英睿达 DDR4 3200 16G*2 无 ECC

固态:三星 256G + 2T

机械:HC550 16T*4 (计划购入)

电源:海盗船 RM750e

UPS:APC BR550G-CN (计划购入)

升级预留:一条不支持拆分的 pcie4.0*16 ,后期打算增加一条固态或者购入 PEX8748 等免拆分卡增加 4 条固态


计划如下:256G 固态 ext4 格式安装 PVE ,4 块 16T 机械用系统自带 ZFS(RAID-Z2)阵列,2T 固态作为全部虚拟机的系统盘,不开启直通,原 PVE 下 Seafile 和 MT Photos 转移到新 PVE 。

每日 ZFS snapshot 一次,每日 快照方式 备份一次全部虚拟机至 ZFS 下,用 restic 加密备份后,通过 NFS 备份至外部服务期,再通过云服务备份至网盘。(注:内网 1G ,外网上传 100M )

尝试过 PVE 安装 TrueNas core/scale ,PVE 挂载 NFS对 TrueNas 接触很少,需要直通硬盘,担心多一个环节多一份风险。

PVE 炸过很多个,已经有了充分的经验,裸机安装 TrueNas scale 可以考虑,但是比较谨慎。

4433 次点击
所在节点    ZFS
34 条回复
gridsah
2023-09-28 16:51:14 +08:00
Q1:对于特别热衷于备份的 PVE 用户,RAID or ZFS 是否有必要?

RAID 是高可用方案,不是备份方案。

如果你的服务不能中断,至少上个 raid5 ,掉一块盘可以以降级模式跑,服务不中断。况且有足够的备份,也不怕 raid5 连炸 2 块盘,无非整个机器掉线一两天用备份重建一下。多出的一块盘能多出好多空间。

raid 可以用 ZFS 来做。rsync.net 这家专做数据备份的公司从 2012 年就把 ZFS 用于生产了。用来存数据还是很稳的。

当然我主要看重 ZFS 的快照和文件系统级别的 checksum (防止 bit rotate)。 我对数据完整性要求高,所以即使只有单盘也会上 ZFS 的 raid0 (strip)。



Q2:不适用 ECC 内存、RAID 卡的情况下,4 硬盘 RAID10 对比 ZFS(RAID-Z2)哪个好?

ZFS 并不一定需要 ECC 内存,而且 ZFS 并不推荐使用 RAID 卡。但是推荐使用 HBA 卡或者 RAID 卡的 HBA 模式。

需要读写性能 raid10 ,需要安全性 raidz2 。我自己是 4 盘 raidz2 ,但是如 Q1 所说,我有足够的备份,也可以接受 raid5 连炸两盘的情况。所以我准备在 raidz2 的磁盘空间使用 70% 以后,用冷备数据重建为 4 盘 raidz (raid5)。



Q3:不适用 ECC 内存、RAID 卡的情况下,2 块硬盘 ZFS(Mirror)+1 块硬盘 ext4 备份 对比 2 块硬盘 RAID1+1 块硬盘 ext4 备份哪个好?

推荐 ZFS 。我需要 ZFS 的快照和文件系统级别的 checksum (防止 bit rotate)。 我对数据完整性要求高,所以即使只有单盘也会上 ZFS 的 raid0 (strip)。我自己用两年多了。没啥毛病。



Q4:不启用重复数据删除的情况下,预留 8G 内存给 32T ZFS 存储池是否足够? zfs.arc_max 是否是刚性的?如果如果突发内存占用较大,PVE 系统可用内存不足是否会 boom ?
Q5:低内存条件下 ZFS L2ARC 是否有必要?官方推荐不大于 10 倍内存,如果分配 512G nvme 固态能否充分利用?

如果你加 L2ARC 的话,要把 ARC 和 L2ARC 一起考虑。

首先,L2ARC 的独立性极强,它缓存的多是小文件,偏向于提升随机读写性能。L2ARC 和 ARC 的联系并不是特别紧密。但是,L2ARC 的索引在内存里,所以它会和 ARC 抢内存。

现在假设你的 4*8T 硬盘创建出的存储池有 15T (raid10 或 raidz2),但是你只有 8G 内存可以用作 ARC+L2ARC 。

primarycache=all 下 8G ARC 的命中率会比较难看。我推荐把 primarycache 的值改成 metadata 这样 ARC 的内存占用就比较小,可以把内存匀给 L2ARC ,然后 L2ARC 设置 primarycache=all 。

我的 raidz2 (4*8t) 15T 左右,配 30G ARC (primarycache=all) 才有 80%+ 的命中率。raidz2 也有 L2ARC ,给了 180G ,命中率 20% 左右。可以看到 ARC 利用率很高。L2ARC 利用率不高,可以接受,因为我的 raidz2 上随机读写比较少,多数是顺序读写。

你这个 15T 可用空间配 8G ARC..... 命中率有多难看我都不敢想 hhhhhh

https://note.lishouzhong.com/article/wiki/zfs/ZFS%20%E9%92%88%E5%AF%B9%E4%BD%BF%E7%94%A8%E5%9C%BA%E6%99%AF%E7%9A%84%E4%BC%98%E5%8C%96%E6%96%B9%E6%B3%95.html

你可以在这看到我写的关于 primarycache 相关的东西。

其实你不用太关心那个 10 倍的数据。

https://note.lishouzhong.com/article/wiki/zfs/ZFS%20%E6%8A%80%E5%B7%A7%E4%B8%8E%E7%9F%A5%E8%AF%86.html#org7c13e2d

这是计算 L2ARC 占多少内存的方法,你可以用这个算法算出你的 L2ARC 要用多少内存。



Q6:PVE 自带的 ZFS 会不会有坑?只用过 ext4 的一般 Debian 用户能否维护好?

我目前有一台 DELL R220 装了 PVE ,系统盘默认的 raid0 在跑,小问题有一点,出在 ZFS 和 systemd 的配合上面,影响数据的问题没有。



Q7:用了 ZFS 之后如何备份 PVE 虚拟机比较优雅,如果打算异地备份,可以怎么操作?计划 导出 ZFS 的 snapshot 用 Restic 增量去重备份为一堆 128mb 大小的小文件再传输到各个备份点,减轻网络传输压力。

不了解,我一直是 PVE 本地的第二个 raid1 的 zpool 存备份文件。



Q8:ZFS(RAID-Z2)不适合存放虚拟机数据,是否应将 VM 系统盘单独放在一个 SSD 上(或者两块 SSD ZFS Mirror)?

没有什么不适合存放虚拟机数据的,担心性能的话,加个 SLOG 就行。我只是把数据库之类对 I/O 敏感的 VM 放在了 SSD 上,跑应用的都放在 raidz2 上了。后来给 raidz2 配了 SLOG 之后,把数据库 VM 放在 raidz2 上的性能表现也变得可以接受了。

看这里
https://note.lishouzhong.com/article/wiki/zfs/ZFS%20ZIL(SLOG)%20%E7%BB%84%E4%BB%B6.html



Q9:大量的小文件会影响 NFS 性能,具体需要多大的量会影响性能?

注:目前 1.2T 共计 182 万文件,如果 500 万小文件,会有影响吗?

我是 NFS 重度用户,没这个说法。NFS 的瓶颈在于硬盘或者网络。小文件影响硬盘 I/O 进而影响 NFS 效能,并不是小文件直接对 NFS 产生影响。

FreeBSD 上 NFS 几个核心服务的文档是我翻译的,你需要可以看这里。文档里压根没提小文件。

https://note.lishouzhong.com/article/translation/sitemap-index.html



Q10:PVE 下各个 VM 是否应该启用 SWAP ?能否使用内存膨胀替代 SWAP ?

我的使用经验是,SWAP 可以搞小点。一般我只给 VM 最大 2G SWAP (8G ram 1G swap, 16G ram 2G swap),作用是降低一下突发的大内存申请、或者大量内存操作带来的压力。如果 VM 真的开始杀进程了,SWAP 根本救不回来,重启吧。



Q11:我即将利用淘汰配置组一套全新的 PVE ,有什么建议给我的吗?

讲道理,如果你的新 PVE 够用的话,淘汰的配置可以装 PBS 专门用作备份。定时开机,定时跑任务,但是这确实有点浪费。

注:优先计划增加 UPS

UPS 很重要很重要很重要很重要很重要很重要 一定要优先 (我手里两台 APC bk650m2-ch)

注 2:已有 1 块 16T 机械硬盘,计划增加 3 块。当前重要数据 1.2T ,归档存储数据 0.5T ,不重要数据 6T ,备份数据若干

注 3:看了 DELL R730XD ,我这点数据量暂不考虑
gridsah
2023-09-28 16:59:31 +08:00
>首先,L2ARC 的独立性极强,它缓存的多是小文件,偏向于提升随机读写性能。

改成 偏向于提升随机读的性能
gridsah
2023-09-28 21:42:30 +08:00
突然想起来,影响 L2ARC cache 行为的那个参数是 secondarycache ,primarycache 控制的是 ARC 的缓存行为....再更正一下
winson030
229 天前
@xomix 请问,我有四块盘,两块 16t ,两块 3t 。zfs 选择 raid 类型有什么建议吗?上网查到 raidz 会按照最小硬盘的容量确定 pool 的容量,四块盘组 raidz 最后只有 3t ,感觉非常亏。
totoro625
229 天前
@winson030 #24 你找的 raidz 教程不对,一般不推荐人用 zfs
如果需要相关教程的话可以看一下这两个:
A. https://dapeng.li/learning/zfs/index.html
B. https://note.lishouzhong.com/article/wiki/sitemap-index.html

多块盘容量不一致不推荐使用 ZFS ,比较推荐你使用 Unraid ,如果一定要 ZFS 可以
两块 16T 的可以分为 2 个 3T 分区,2 个 13T 分区
这样你可以用 4 个 3T 分区组 ZFS ,raidz1 可用空间是 9T ,raidz2 可用空间是 6T
剩下两个 13T 分区随意折腾,可以 raid1 或直接挂载为普通目录
xomix
228 天前
@winson030 不建议选择 zfs ,zfs 和软 raid 建议都选择相同容量硬盘。如果你有不同容量硬盘要用,建议是 16T 两块做条带,3T 两块做 raid0 ,重要数据放 3T ,注意 3T 报警,16T 做 iSCSI 给虚拟机用,你只需要备份几份虚机安装完再封装的信息就够了。
dilidilid
90 天前
@winson030 上面都回的什么呀,你这种情况可以两块 16T 一个 vdev ,两块 3T 一个 vdev ,总空间 19T ,任何一个 vdev 两块盘一起挂整个 pool 就挂了。但说句实话你那两块 3T 太鸡肋了,不如卖了,就用两块 16T 做 ZFS 镜像。
winson030
89 天前
@dilidilid 这样也可以。我现在用了 unraid 的默认模型了,用的时候开机,还可以
xinmans
65 天前
上万兆网卡的话,sata 盘组 zfs ( 16T*8 ),能跑满万兆吗?是否需要加 nvme ssd 的 cache ?
totoro625
65 天前
@xinmans #29 16T*4 RAID-Z2 + 写缓存 32G*2 + 读缓存 1T + 内存 64G
磁盘测速:fio --randrepeat=1 --ioengine=libaio --direct=1 --gtod_reduce=1 --name=test --filename=test --size 100GB --bs=4m --iodepth=1 --readwrite=write (第二次 read )
WRITE: bw=265MiB/s (278MB/s), 265MiB/s-265MiB/s (278MB/s-278MB/s), io=100GiB (107GB)
READ: bw=365MiB/s (383MB/s), 365MiB/s-365MiB/s (383MB/s-383MB/s), io=100GiB (107GB)

测试了一下固态,读 3G 写 400M
xinmans
64 天前
@totoro625 16T*8 ,RAIDZ2 ,ARC 缓存 9.8G ,内存 20G ,Swap 15G

WRITE: bw=265MiB/s (278MB/s), 265MiB/s-265MiB/s (278MB/s-278MB/s), io=100GiB (107GB), run=386739-386739msec
READ: bw=799MiB/s (838MB/s), 799MiB/s-799MiB/s (838MB/s-838MB/s), io=100GiB (107GB), run=128115-128115msec

写性能和你差不多,读性能翻倍了,可能是 8 盘位的原因(盘位翻倍了)。
xinmans
64 天前
看来组个万兆局域网,可以轻松跑慢万兆吧,读文件和编辑视频文件都会很爽
xinmans
64 天前
@totoro625 你是否开了 trim ? 如果开了,有哪些影响?是否影响性能?能节省多少空间?
totoro625
64 天前
@xinmans #33 我是默认设置,没改过
磁盘是手动分区,人为保留 30%容量不分区

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

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

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

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

© 2021 V2EX