去年因为做了个数据量比较大的项目,外加各种模型权重、数据集越来越多,患上了存储空间焦虑症。年底的时候回国扛了一台绿联的 DXP6800Pro ,外加 6 个西数 16T 二手企业盘和 2 个 2T 的致钛 Ti600 的 SSD 到办公室,现在不焦虑存储空间了,但有点纠结怎么用好这个 NAS 。网上搜索+问了问 ChatGPT ,并没有在方案设计上找到什么有建设性的答案。
目前的状态
刷了 Debian12 ,6 个 HDD 用 ZFS 组了个 RaidZ2 ,两个 SSD 做镜像后现在是 ZFS 的 LOG 。本意是想加速一下写入,但似乎并没有起到太大的作用。我自己还搞了个万兆交换机,配合手动配置 IP ,让电脑和 NAS 之间通过万兆局域网连接,平时会通过一个跑在 podman 里的 samba 挂载到(Windows 和 Linux 都有)电脑上。Samba 开了个共享账号给周围的同事用,自己有一个单独的 Samba 账号。本来还搭了个 Aria2 ,但因为 podman 容器里挂载目录的权限问题比 docker 要复杂一些,所以还没跑通。
总结来说,现在的 NAS 用起来有以下几个痛点
- 读写性能跑不满自己搭的万兆局域网,最多跑满 HDD 的顺序读写,SSD 似乎没有起到什么作用
- 所有的东西塞在一个大存储池里,偶尔手动把数据复制到用于备份的另一台机器上
- 一旦有点大规模的(特别是随机的)读写,企业盘炒豆子的声音会引起一些同事的抗议
鄙人的核心诉求大概如下(重要性从高到低)
- 不能丢数据
- 尽可能充分利用现有硬件,提升性能和存储空间利用率
- 减少维护时的心智和体力负担
- 作为隐私焦虑症患者,希望尽可能保障隐私和安全性(例如在一些应用/软件选择上使用了开源方案而非商业方案)。但考虑到 3 ,可以选一些“退而求其次”的选择,比如 debian 换成 ubuntu ,podman 换成 docker
- 降低金钱的成本
如果可以,我希望达到这样一个效果
- 日常通过局域网将 NAS 挂载到电脑上时,可以实现万兆局域网的速度+SSD 的随机读写性能。这意味着我在我的电脑上跑模型训练之类的工作的时候,(如果数据集很幸运地在缓存里)可以从 NAS 加载数据集
- 所有的数据在一个合理的时间内可以落盘到 RAID1 的 HDD 上,并可以实现定时备份。
2.5 如果可以的话,我希望大部分的 HDD 读写可以发生在一个可控的时间段内(比如下班之后),这样 HDD 的炒豆子声不至于影响别人
- 如果哪个硬盘坏了,我能有个办法及时知道,然后找一块好盘换进去就能继续用
- 可以在 NAS 上跑个类似 aria2 的服务,实现离线下载。有时还想 git clone 一些比较大的仓库(比如 hugging face 上的模型权重),也希望可以让 NAS 代劳
为了达到这样一个效果,我调研到了下面几个结论
- 万兆+随机读写的需求本质上是需要让 SSD 充当读写缓存(读+写缓存,而不是类似 ZFS 的 L2ARC 的主要加速读取操作的缓存)。并且由于 SSD 充当了写缓存,实际上在写操作的缓存策略上是 WriteBack ,即先写到 SSD 上,然后再异步地写入 HDD
- 目前比较方便且成熟的存储管理方案有两个,一个是 LVM ,一个是 ZFS ,其中 LVM 可以通过配置 LVMCache 的 cachepool 或 cachevol 实现 writeback 缓存
- ZFS 的 ARC 和 L2ARC 主要加速读取操作,将 log 放在 SSD 上可以加速同步写操作,但在一些情况下(例如大量随机读写,来自网络连接的异步读写)作用有限,最后还是用 HDD 硬扛。
- ZFS 具有一些我非常喜欢的 LVM 不具备的功能,比如透明压缩,数据去重等,如果可以的话,利用好这些功能可以提升存储空间利用率。但 ZFS 似乎并不支持类似 LVMCache 的 writeback
- 很多人不推荐 writeback 缓存策略是因为 SSD 的寿命有限,如果 SSD 损坏并且 SSD 上有数据没有写回 HDD ,会导致缓存的数据丢失。但我这儿有两块 SSD ,如果做 mirror 或 raid1 的话可以减小这种情况发生的概率
- 我知道 Raid 不是备份,但备份到云的成本过于高昂,所以目前的办法是同机器上不同硬盘互相备份。换言之我可以在同一个机器上组超过 2 套 Raid ,然后这两套 Raid 互为备份。此外,我也有定时把数据全量备份到另外的硬盘/机器上的习惯。
基于以上结论和一些来自 ChatGPT 的建议,我得到了目前以下几个关于存储规划的方案
- LVM + LVMCache(writeback) + LVM Raid1:
这个方案是全 LVM 方案,看起来在存储规划的角度基本满足我上面提到的想法;
- 4 个 HDD 组 RaidZ2 + (2xHDD+2xSSD)组 LVM + LVMCache(writeback):
这个方案兼顾了 LVM 的 writeback 缓存功能和 ZFS 的一些能力,将热数据放在 LVM 中提升性能,把备份和冷数据放在 ZFS 中,提高存储空间利用率和安全性;
- SSD 单独组成存储池(无论使用 ZFS 还是 LVM ),纯享 SSD 的读写性能,定时将 SSD 中的数据备份到 HDD ,一些对读写(特别是随机读写)性能要求不高的工作可以直接落盘到 HDD 上;
在应用规划上,目前的 Samba 方案暂时没有找到合适的替代;考虑过利用 Nextcloud 实现 WebDav ,但其本身的性能实在堪忧,所以暂时没有用上。
其他一些补充和 Q&A
- 为什么不用 PVE 而是选择了 debian/ubuntu 作为裸机操作系统?
办公室的网络环境有点复杂,使用 PVE 的话难以配置 NAS 连接到办公室的网络。而且考虑到目前的应用需求,似乎 podman 可以满足需求,而不是使用虚拟机。
-
办公室的网络环境是怎样的?
总结起来包括以下几个事实:
- 对于连接到公司网络来说,需要额外的图形化界面认证+安装公司的 CA 证书才能连接到公司内网,否则可以连接到外网,但公司内网的设备无法连接到 NAS
- 我自己搞了个 5x2.5G 电口+2xSPF+的交换机,两个光口配置了个 VLAN 分别连接了 NAS 网卡 1 和电脑网卡 1 ,两台设备手动配置 IP 实现互相访问; 5 个电口则配置了另一个 VLAN ,一个电口用于上行连接公司网络(公司的是千兆网口),电口一个给了 NAS 网卡 2 ,一个给了电脑网卡 2 ,其他电口连接各种其他想要以 2.5G 局域网连接 NAS 的同事们。至于更远的同事们,只能委屈他们走公司内网连接到这个 NAS 了
- 为什么不是公司来折腾这些东西?
因为公司太烂,且没钱
目前的问题
- 考虑到以上提到的“想要的”和“需要的”,我是不是需要更换存储规划方案?如果更换,选哪一个,为什么?或者,有没有更好的其他方案?
- 在软件应用的选择上,是否有其他的方案和推荐?
- 其他的 使用小妙招/建议/评价?
在此感谢社区内的诸位,祝大家春节愉快,阖家欢洛!
|