【教程】如何打造一台时髦的NAS(NVMeof/RDMA/虚拟化集群)

发布时间:2024-11-30 09:32

如何利用美妆教程平台进行自我形象打造 #生活技巧# #化妆打扮技巧# #美妆教程平台#

本帖最后由 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的性能调优

网址:【教程】如何打造一台时髦的NAS(NVMeof/RDMA/虚拟化集群) https://www.yuejiaxmz.com/news/view/322364

相关内容

「推荐」群晖NAS五大神器深度解析与选购指南,重塑数字生活新版图!
“流动的集合体”:虚拟社群人际交往及其互惠行为研究
数据安全指南→NAS群晖备份、同步应用
爱思助手中虚拟U盘怎么使用?虚拟U盘操作教程分享
数字时代的文化生活:让虚拟与现实相互激发
数字时代的文化生活 让虚拟与现实相互激发
让虚拟与现实相互激发(数字时代的文化生活)
AI虚拟助手是干嘛的?好用的AI虚拟推荐
虚拟现实生活模拟器完美最新版
如何成为虚拟助理?

随便看看