【教程】如何打造一台时髦的NAS(NVMeof/RDMA/虚拟化集群)
本帖最后由 Dolfin 于 2024-11-28 09:43 编辑虎头
故事从二元对立的主题展开,搞清对新技术的崇尚与真实应用的边界。高性能存储像是个极具吸引力的对象,类比黑客帝国里的矩阵系统,看似拥有无尽的可能性以满足任何负载,读一读那些顶尖存储的广告语,足以符合完美期望。
上一年,我迎来头猛兽(EPYC 9004 / NVMe RAID / 100GbE / RDMA 全闪NAS搭建与测试分享),这一年的碎片相处,从驯服到榨干的过程就围绕着:选择何种操作系统,选择何种存储方式,搭建何种存储结构,如何最大化发挥性能这些朴实又充满争议的话题。
整活儿
存储性能基本就围绕三个指标,吞吐 / IOPS / 延迟,跨平台的话还涉及到兼容及易用性,SMB是我的首选。NFSoRDMA的吞吐优秀,不过在实验中极限IOPS差强人意(SMB / NFS /NVMf 不严谨的性能比较)。关于Linux下的SMB,小文件随机读写性能不足,这一点我向KSMBD的作者Namjae Jeon了解,他的看法也是Linux SMB RDMA模式并不适合小文件IO,而同样是Samba Team的Stefan Metzmacher也回复我由于现有vfs_io_uring 未使用 IOSQE_ASYNC,所以更优的Samba IO_uring的性能也受到限制。那么,现在对SMB支持最全面最优化的Windows,就是解法。在RDMA Direct和Multichannel支持下吞吐可轻松超过200Gbps, IOPS达600,000。
在(一个NAS SMB传输的神奇发现)的探索中,我发现单台Windows SMB文件服务器IOPS存在上限,那就横向扩展,集群化,Windows 横向扩展文件服务器(SOFS)就是今天我要一步步分享的。同时,我需要SPDK NVMe-oF Target 作为SOFS的后端存储,而为了榨干硬件,我要把它们全部装进虚拟机,运行在一台裸金属上。
图示存储网格有如下特征
1.物理机3台,1台作为虚拟化存储服务器,2台作为客户端从该存储读写。存储服务器运行4台虚拟机:VM1 Ubuntu SPDK NVMf Target / VM2 Windows Server 2022 故障转移集群节点1 / VM3 Windows Server 2022 节点2 / VM4 DNS 服务器。
2.虚拟存储服务器硬件为X299 / 7960X(16C 32T)/ 128GB Ram / KIOXIA CM6 960GB*2(PCIe 3.0)模式 / ConnectX 40GbE 网卡多张;客户端1 7945HX / 64GB Ram / ConnectX 6 双口;客户端2 EPYC 9124 / 32GB Ram / ConnectX 5 双口。
3.交换机为Nvidia SX6012 12口40GbE 。
4.VM1 PCIe直通ConnectX4 * 2 / CM6 960GB *2 ;VM2及VM3 分别直通 ConnectX4(连接NVMe-oF)/ ConnectX3 Pro (连接客户端)
群集存储性能
来自客户端的IO请求,会被分摊到两个群集节点。另外,受虚拟化的影响,X299 PCIe通道数的限制以及PCIe 3.0的限制,性能会有不少损耗。
4K 随机读取 1,000,000 IOPS
1024K 顺序读取 100Gbps
为什么要使用Windows横向扩展文件服务器(SOFS)?
1. 同时活动共享和透明故障转移
SOFS 通过同时活动共享实现“横向扩展”,所有集群节点可同时访问 CA(持续可用性)共享,避免了单点托管。CSV(集群共享卷)会自动将用户请求重定向到正确的存储节点。如果节点发生故障,SMB 透明故障转移可立即将连接切换至其他节点,确保高可用性。
2. 提高带宽利用率
SOFS 利用所有节点的聚合网络吞吐量,增加节点即可提升总带宽。通过 SMB 多通道和 SMB Direct(RDMA),优化客户端与服务器的连接,减少节点上的 CPU 使用率,进一步提升性能。
3. 简化共享管理
SOFS 通过主动-主动节点架构简化了共享管理,无需平衡各节点的工作负载。所有服务器都能同时提供服务,避免传统主动-被动共享的复杂性。Windows Server 提供了统一的管理工具,使管理更加高效和直观。
为什么要使用NVMe-oF 作为SOFS的存储?
1.在 SOFS 中,磁盘所有权通过 SCSI SPC-3 的“持久预留”(PRs)管理,单节点拥有磁盘,其他节点需请求所有权才能访问,切换所有权会导致短暂停机。引入集群共享卷(CSV)后,多节点可同时访问同一存储,磁盘对所有节点表现为本地卷,CSV 简化了存储管理,减少所需磁盘数量。非拥有节点通过直接 I/O 或 SMB 协议访问磁盘,读写操作使用直接 I/O,其他操作通过 SMB 发送至拥有节点完成。
2.CSV允许多个节点同时访问共享存储,由协调节点(拥有物理磁盘资源的节点)负责同步元数据变更。非协调节点通过直接 I/O 或 SMB 与存储交互。CSV 提供三种 I/O 模式:直接模式,节点直接访问存储,性能最高;文件系统重定向模式,I/O 通过 SMB 重定向至协调节点;块重定向模式,在故障时直接通过 SMB 访问存储子系统,性能较高。
3.在 CSV 环境中,两个节点通过 NVMe-oF 直接访问共享存储时,都可处于直接模式(Direct Mode),无需依赖协调节点。NVMe-oF 提供独立的高性能存储路径,使节点直接读写底层存储,绕过传统协议栈和 SMB 重定向。协调节点仅负责元数据管理,实际 I/O 全部通过独立路径完成,提升性能并减少延迟。这种配置充分利用 NVMe-oF 的优势,实现高效并发访问,同时降低协调节点负载。
双节点都处在直接模式下连接CSV
如何搭建NVMe-oF Target作为SOFS存储?
在ubuntu下编译后SPDK后,创建NVMe-oF Target的命令如下,因为要为SOFS多节点做存储,所以要添加上主动-主动 / 多通道 / 轮询的命令
sudo modprobe nvme_rdma加载内核模块 nvme_rdma,为 RDMA 协议下的 NVMe-oF 提供支持。RDMA(远程直接内存访问)允许高效的网络数据传输,减少 CPU 负载和延迟。
echo 0000:00:1c.0 | sudo tee /sys/bus/pci/devices/0000:00:1c.0/driver/unbind卸载 PCI 设备 0000:00:1c.0 的驱动程序,从系统内核中释放该设备,以便后续由 SPDK 接管控制。
echo 0000:00:11.0 | sudo tee /sys/bus/pci/devices/0000:00:11.0/driver/unbind卸载 PCI 设备 0000:00:11.0 的驱动程序,从系统内核中释放该设备,以便后续由 SPDK 接管控制。
sudo scripts/setup.sh初始化 SPDK 环境,加载所需内核模块,配置大页内存(HugePages)并准备直接硬件访问环境。
sudo build/bin/nvmf_tgt -m 0x3 &启动 SPDK 的 NVMe-oF 目标服务(nvmf_tgt)。-m 0x3 指定服务绑定到 CPU 核心 0 和 1(CPU 位掩码为 0x3)。
sudo scripts/rpc.py nvmf_create_transport -t RDMA创建一个 RDMA 类型的 NVMe-oF 传输服务,用于定义客户端与目标设备之间的通信方式。
sudo scripts/rpc.py bdev_nvme_attach_controller -b NVMe1 -t PCIe -a 0000:00:11.0通过 SPDK 添加 PCI 地址为 0000:00:11.0 的 NVMe 设备作为控制器。-b NVMe1 为设备指定名称,-t PCIe 表示使用 PCIe 协议。
sudo scripts/rpc.py bdev_nvme_attach_controller -b NVMe2 -t PCIe -a 0000:00:1c.0通过 SPDK 添加 PCI 地址为 0000:00:1c.0 的 NVMe 设备作为控制器。-b NVMe2 为设备指定名称,-t PCIe 表示使用 PCIe 协议。
sudo scripts/rpc.py bdev_nvme_set_multipath_policy -b NVMe1n1 -p active_active -s round_robin -r 10为 NVMe 设备 NVMe1n1 配置多路径策略。-p active_active 启用主动-主动模式,-s round_robin 设置路径选择为轮询,-r 10 指定路径切换间隔为 10 次 I/O。
sudo scripts/rpc.py bdev_nvme_set_multipath_policy -b NVMe2n1 -p active_active -s round_robin -r 10为 NVMe 设备 NVMe2n1 配置多路径策略。-p active_active 启用主动-主动模式,-s round_robin 设置路径选择为轮询,-r 10 指定路径切换间隔为 10 次 I/O。
sudo scripts/rpc.py bdev_raid_create -n MyRaid0 -z 128 -r raid0 -b “NVMe2n1 NVMe1n1”创建一个 RAID-0 设备,名称为 MyRaid0,条带大小为 128KB。-r raid0 指定 RAID 类型为 RAID-0,-b "NVMe2n1 NVMe1n1" 添加 NVMe1 和 NVMe2 的命名空间作为 RAID 成员。
sudo scripts/rpc.py nvmf_create_subsystem nqn.2016-06.io.spdk:cnode1 -a -s SPDK00000000000001 -d SPDK_Controller -r创建一个 NVMe-oF 子系统,名称为 nqn.2016-06.io.spdk:cnode1。-a 启用身份验证,-s SPDK00000000000001 设置序列号,-d SPDK_Controller 设置描述,-r 启用远程访问。
sudo scripts/rpc.py nvmf_subsystem_add_ns nqn.2016-06.io.spdk:cnode1 MyRaid0将 RAID-0 设备 MyRaid0 添加为子系统 nqn.2016-06.io.spdk:cnode1 的命名空间。
sudo scripts/rpc.py nvmf_subsystem_add_listener nqn.2016-06.io.spdk:cnode1 -t RDMA -a 192.168.77.16 -s 4420为子系统 nqn.2016-06.io.spdk:cnode1 添加一个 RDMA 类型的监听器,监听地址为 192.168.77.16,端口为 4420。
sudo scripts/rpc.py nvmf_subsystem_add_listener nqn.2016-06.io.spdk:cnode1 -t RDMA -a 192.168.78.16 -s 4420为子系统 nqn.2016-06.io.spdk:cnode1 添加另一个 RDMA 类型的监听器,监听地址为 192.168.78.16,端口为 4420。
如何让SOFS节点挂载NVMe-oF LUN?
1.使用Starwind NVMe-oF initiator,它有免费许可。
2.挂载命令为
StarNVMeoF_Ctrl.exe insert_tcp 192.168.77.16:4420 192.168.77.3 nqn.2016-06.io.spdk:cnode1 SW_10
StarNVMeoF_Ctrl.exe insert_tcp 命令通过 TCP 协议将客户端(192.168.77.3)连接到 NVMe-oF 目标端点(192.168.77.16:4420),注册子系统 nqn.2016-06.io.spdk:cnode1,该子系统由 SPDK 定义,用于识别目标存储设备。会话名称 SW_10 用于标识和管理此次连接。
3.一些时候节点重启后未能自动挂载,或者挂载失败的时候,可以尝试remove命令移除,再重新挂载。
如何创建SOFS?
1.在Windows Server下,不使用AD的情况下,可以使用工作组集群,它允许两个或更多节点作为工作组服务器加入,而无需域控制器或 Active Directory 林。工作组集群不加入域,而是通过工作组模式运行,但仍需要使用 DNS。传统的故障转移集群通常依赖 Active Directory 提供身份服务和管理,而工作组集群提供集中式身份和高安全性,保持应用的高可用性,同时无需使用 AD。
2.两个节点需要使用同样的帐户密码,加入同一个工作组,如果未使用内置管理员账户,需要在注册表中设置 LocalAccountTokenFilterPolicy。
New-itemproperty -path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System –Name LocalAccountTokenFilterPolicy -Value 1将每个节点添加为受信任的主机。修改 TrustedHosts 文件,添加需要连接本地机器的服务器。可以通过主机名、域名或 IP 地址添加受信任主机,星号代表信任所有主机
Set-Item WSMan:\localhost\Client\TrustedHosts -Value "*" -force
3.DNS服务器
DNS的设定在SOFS里极其重要,在DNS服务器中为每个节点添加解析,同时节点的计算机名中要添加DNS后缀。因为DNS的错误配置,我卡了两个月的时间。
4.在每个节点上添加故障转移服务器功能,并创建故障转移群集,添加存储,将存储转换为CSV,添加横向扩展服务器角色,添加IP资源,添加共享。这里我就一代而过了,因为前面步骤正确,后面就很顺利,否则,每一步都可能进行不下去。
蛇尾
写到这里,应该是搭建出了一个SMB集群雏形,看起来自带那些漂亮的技术名词,虚拟化集群 / SPDK / NVMe-oF / RDMA,还有亮眼的性能和低廉的成本,最大化了硬件的使用。使用SOFS收益最大的场景应该是Hyper-V / SQL / VDI 这类负载,或者说非元数据密集型负载。当然我放些虚拟机(虚拟机上跑PCMark这种Trace存储测试性能还是不错的,不要只盯着CDM FIO这种合成测试)顺道做个文件共享也是合适。其实我还是不知道可以拿它来做什么,就拿无数次踩坑的案例,分享给大家。
后续实验:
1.虚拟化下的RDMA稳定性优化
2.SPDK装进DPU和一系列的玩法
3.SRIOV来省几张网卡
4.SOFS的性能调优
一大堆什么玩意,不接地气。
就一句,低压u 装win10 开smb 共享即可。 本帖最后由 网仙 于 2024-11-28 00:02 编辑
没看太明白具体逻辑,楼主能描述的直观一点么?
SPDK是提供SMB服务,调配3个winserver的资源的意思?
在我看来,家用场景及非专业小工作室场景,中小企业场景,力大飞砖就好,太复杂了不利于维护,可靠性也不好保障,下次再来整的时候,又得重新研究学习一遍。 gbawrc 发表于 2024-11-27 23:35
啥玩意,买个双2.5G网卡的B365主板加一颗任意1151的CPU内网共享都够用
折腾这半天,最后想说一句,就这? 牛逼,非常牛逼 虚拟集群提高io吞吐量,但是双活的冗余性在一台物理机上就打了折扣;双物理机效能怎么样,dns看来是关键服务,是不是也搞个冗余。 看不懂牛比就完了 网仙 发表于 2024-11-27 23:54
没看太明白具体逻辑,楼主能描述的直观一点么?
SPDK是提供SMB服务,调配3个winserver的资源的意思?
由两台Windows Server组成的横向扩展文件群集,都连接一个集中存储。SPDK起到了 NVME IP SAN的作用 真要在家里搭数据中心啊 专业人士[傻笑] mkkkno1 发表于 2024-11-28 02:10
虚拟集群提高io吞吐量,但是双活的冗余性在一台物理机上就打了折扣;双物理机效能怎么样,dns看来是关键服 ...
再花三千请一个兼职运维 这功耗得多少[流汗] archxm 发表于 2024-11-28 09:26
再花三千请一个兼职运维
什么意思?你是看不起,觉得别人都是sb;还是觉得别人做的事情都是垃圾?回复多少带点信息,别全是情绪,特别单独回复的时候,你礼貌么? mkkkno1 发表于 2024-11-28 09:46
什么意思?你是看不起,觉得别人都是sb;还是觉得别人做的事情都是垃圾?回复多少带点信息,别全是情绪, ...
没啊,有不少员工处于打杂状态,啥事都会干,这当然没问题了。
家用,还得整这些就太麻烦了。如果各种数据太多,又很有钱,可不得请个运维么 真是一大堆莫名其妙的东西
一台时髦的NAS:请购买DELL PowerScale F910 mkkkno1 发表于 2024-11-28 02:10
虚拟集群提高io吞吐量,但是双活的冗余性在一台物理机上就打了折扣;双物理机效能怎么样,dns看来是关键服 ...
这个实验就像个存储AIO,把块存储/文件存储都装进去,所以一样会有All in Boom的隐患,可以通过7*24高负载压力测试。不过在NVMe-oF这块,虚拟环境下RDMA确实容易故障,因为这是个很底层的技术。真实使用,或者用于业务环境的话,都应该做冗余。
关于效能,存储服务器这边的压力不大,来自客户端这边实际的大文件拷贝任务,4GB/s,存储这边会有30%的CPU占有率(2017年的16核)。其实就当是个网卡和硬盘多点的虚拟机平台就好了。 鉴定完毕,这不是我能玩得起的(指技术门槛和银子)
用8代i5组的万兆NAS已经足够我用了,还好有chatG*P*T,好多刁钻的问题靠自己搜索真的是到现在估计都解决不了 本帖最后由 Dolfin 于 2024-11-28 10:57 编辑
tasagapro 发表于 2024-11-28 10:18
真是一大堆莫名其妙的东西
一台时髦的NAS:请购买DELL PowerScale F910
你知道PowerScale F910要最少需要3台才能用,且不支持SMB RDMA吗?
lz之前发的贴,初看都看不懂,但是到了后面自己折腾,再去看就能get到知识点,lz这一贴,我目前看不懂,硬件没搭齐,不具备实操条件,理论更是空白,等将来摊子搭起来再来研习 Dolfin 发表于 2024-11-28 10:29
你知道PowerScale F910要最少需要3台才能用,且不支持SMB RDMA吗?
你知道英伟达AI集群演示用的都是powerscale吗
SMB RDMA这种场景有人用?现在哪个AI训练集群用SMB? tasagapro 发表于 2024-11-28 10:32
你知道英伟达AI集群演示用的都是powerscale吗
SMB RDMA这种场景有人用?现在哪个AI训练集群用SMB? ...
英伟达AI训练用Powerscale所以我就要用了?
SMB RDMA 没人用了?还有你怎么这么机灵发现我要AI训练了? 本帖最后由 Dolfin 于 2024-11-28 13:41 编辑
brucelee1126 发表于 2024-11-28 10:29
lz之前发的贴,初看都看不懂,但是到了后面自己折腾,再去看就能get到知识点,lz这一贴,我目前看不懂,硬 ...
大家都是动手动脑,看数字从3到4再推到5GB/s就兴奋的人。我这套组合你可能就缺台口多点的交换机,话说你的Nvme全闪h1290fx搞出什么新玩法了吗? 用的DS918+ 一直没出过问题 还好暂无这个级别的需求~~楼主玩的路很宽哈~~ 炫酷到没太看懂。。 brucelee1126 发表于 2024-11-28 10:29
lz之前发的贴,初看都看不懂,但是到了后面自己折腾,再去看就能get到知识点,lz这一贴,我目前看不懂,硬 ...
就是企业级的方案放在家用了,我在公司搞这些交付都搞吐了 火钳刘明,学习ing Dolfin 发表于 2024-11-28 13:37
大家都是动手动脑,看数字从3到4再推到5GB/s就兴奋的人。我这套组合你可能就缺台口多点的交换机,话说你 ...
可惜没有你这个技术,我对5GB/S比较感兴趣[偷笑] lij407 发表于 2024-11-28 18:29
可惜没有你这个技术,我对5GB/S比较感兴趣
详见BruceLee的帖子
SMB再次提升,4GB/s达成,再次更新,突破5GB/s
页:
[1]
2