展示容错 NVMe 解决方案的能力:Xinnor xiRAID Classic 软件 RAID 与 AIC HA202-PV 存储桥湾平台
本文展示了如何将 xiRAID Classic 软件 RAID 与 AIC 存储桥湾(SBB)平台相结合,从而构建一个高性能、容错的存储子系统解决方案。我们的全面测试不仅展示了接近后端性能的表现,同时证明了系统具有强大的高可用性(HA)能力,使该方案非常适合用于复杂的高性能计算环境以及使用 BeeGFS 和 Lustre 等并行文件系统的其他市场。
关于 xiRAID Classic
xiRAID Classic 是一款专为 NVMe 存储设备和现代 SAN 网络设计的高性能软件 RAID 解决方案。xiRAID Classic 技术充分发挥了闪存设备(NVMe、SAS、SATA)的能力,构建出一款既快速又容错的 RAID,作为本地块设备运作,并可通过辅助软件进行网络导出。
在高可用性模式下实现 xiRAID Classic 的初衷是将 RAID 呈现为一种新型的集群资源。由于 xiRAID Classic 自然暴露了特定的系统资源(存储块设备),因此它是集群资源管理的理想候选对象。从 v4.1.0 版本开始,xiRAID Classic 在发行版中包含了一个 Pacemaker 资源代理,以便实现 Pacemaker 集成。在这种配置下,xiRAID Classic 通过 RAID 技术确保底层驱动器的数据保护,而集群则消除了由 xiRAID Classic 软件实例所代表的单点故障问题。
关于 AIC HA202-PV
HA202-PV 是一款 SBB(存储桥湾)平台,采用共享存储背板连接同一机箱中两个本来独立的计算节点。每个节点对每个 NVMe 驱动器均拥有专用的 PCI-e x2 连接。以下提供了连接的详细信息。该架构不仅能提高存储后端利用效率和速度,同时在与传统无保护单节点解决方案相同的占地面积内提供冗余存储。
测试方法
我们的测试策略分为两大部分,以全面展示该解决方案的能力:
性能比较
我们对 xiRAID Classic 的性能与原始驱动器性能进行了详细比较。这包括建立硬件最大性能的基准线,然后创建并测试四个 RAID 6 阵列(8 个数据驱动器 + 2 个奇偶校验盘),以确定 RAID 的效率。测试平台采用 AIC HA202-PV SBB 平台,配置了 20 个 NVMe 驱动器(型号 HUSMR7616BDP301,每个 1.6 TB),分成 40 个命名空间以实现最佳吞吐量。测试内容涵盖了顺序读写操作以及在不同配置下的随机读写操作。
高可用性配置
我们搭建并测试了一个功能完备的 HA 集群,该集群基于 xiRAID 和 AIC HA202-PV 平台。此解决方案涉及使用 Pacemaker 和 Corosync 配置一个双节点集群,实施基于 IPMI 的围栏机制(fencing),并使用 Csync2 进行配置同步。我们创建了分布在两个节点上的四个 RAID 6 阵列,并将它们配置为集群资源。通过故障切换、故障恢复和围栏功能的严格测试,确保系统在节点故障情况下依然能实现稳健的容错与无缝运行。
测试环境如下:
- 平台:AIC HA202-PV SBB
- 每节点 CPU 数:2 x Intel® Xeon® Gold 6230
- 每节点内存:256GB
- 驱动器子系统:20 x HUSMR7616BDP301 (1.6 TB)
- 驱动器总线:PCI-e 3.0
- 操作系统:Rocky Linux 9.4
- xiRAID Classic 版本:4.1.0
1. xiRAID Classic 与原始驱动器性能比较
在开始测量之前,我们将每个 NVMe(HUSMR7616BDP301)驱动器分割为两个命名空间,以实现最大吞吐量,从而得到 40 个块设备。同时,在每次测试前我们还对驱动器进行了预调校。
首先,我们建立了一个基准,代表所使用硬件的最大性能水平。接着,我们创建了四个 RAID 6 阵列(8 个数据驱动器 + 2 个奇偶校验盘),对其进行测试并比较结果,以确定 RAID 的效率。附录中包含了用于测试的 FIO 配置文件。
在测试前,对每个阵列均执行了完整的 RAID 初始化。每个服务器节点上的阵列均绑定到了其底层驱动器所在的 NUMA 节点,以避免昂贵的跨 CPU 通信和资源分配冲突。
详细的 RAID 配置信息如下。系统设置的全面描述以及 RAID 阵列创建过程详见后续 HA 配置部分。
节点1
节点2
测试结果
原始 20 个驱动器性能结果
测试场景 | 综合结果 (2 个节点,20 个驱动器) |
---|---|
原始顺序读(numjobs=1,队列深度=32) | 56.4 GB/s |
原始顺序写(numjobs=1,队列深度=32) | 44.4 GB/s |
原始随机读(numjobs=1,队列深度=64) | 810 万 IOPS |
原始混合读写 50%/50%(numjobs=4,队列深度=64) | 550 万 IOPS |
基准性能
- 顺序读:达到原始后端性能的 100%(56.4 GB/s)
- 顺序写:达到原始后端性能的 80%(44.4 GB/s)。计算方法:44.4 GB/s x 80% = 35.5 GB/s
- 随机读:达到原始后端性能的 100%(810 万 IOPS)
- 随机写:我们在同时负载下对 20 个 NVMe 驱动器(40 个命名空间)的 50/50 读写模式进行了评估,测得 IOPS 为 5.569k(读 IOPS:2.783k,写 IOPS:2.786k)。基于这些测量值,可以计算出 4 个 RAID 6 阵列的预期性能。
xiRAID 性能测试结果
测试项目 | xiRAID Classic(4 个 RAID 6 阵列 [8 数据盘 + 2 奇偶校验盘]) | 基准性能 | 效率 |
---|---|---|---|
RAID 顺序写(numjobs=8,队列深度=32) | 34.2 GB/s | 35.5 GB/s | 96% |
RAID 顺序读(numjobs=8,队列深度=32) | 55.4 GB/s | 56.4 GB/s | 98% |
RAID 随机写(numjobs=32,队列深度=32) | 839k IOPS | 928k IOPS | 90% |
RAID 随机读(numjobs=32,队列深度=32) | 780 万 IOPS | 810 万 IOPS | 96% |
2. xiRAID Classic 与 AIC SBB 平台的 HA 配置能力
xiRAID Classic 能够在高可用性(HA)集群中运行,通过在两个节点间分布数据和系统组件,确保用户的数据完整性和可用性。
- Pacemaker 版本:2.1.7
- Corosync 版本:3.1.8
- Csync2 版本:2.1
- 围栏代理:fence-agents-ipmilan
网络配置
确保所有 IP 地址在两个主机上均可解析。在我们的案例中,通过 hosts 文件解析,两个节点的 /etc/hosts
内容如下:
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
10.10.0.11 node11
10.10.0.12 node12
软件组件安装
xiRAID Classic 4.1 安装
在两个节点上执行以下步骤安装 xiRAID Classic 4.1.0:
- 安装 EPEL: # yum install -y epel-release
- 为当前加载的内核安装 kernel-headers: # yum install kernel-devel-$(uname -r)
- 为当前操作系统安装 xiraid-repo: # yum install pkg.xinnor.io/repository/…
- 安装 xiraid-release: # yum install xiraid-release
Pacemaker 安装
在两个节点上执行以下步骤:
- 启用集群仓库: # yum config-manager --set-enabled highavailability crb
- 安装集群软件: # yum install pcs pacemaker psmisc policycoreutils-python3 fence-agents-ipmilan
Csync2 安装
从 Xinnor 仓库在两个节点上安装 Csync2 包:
# yum install csync2
HA 集群设置
Pacemaker 集群创建
本文描述了集群配置的步骤。首先,在两个节点上设置防火墙以允许 Pacemaker 软件工作:
# firewall-cmd --permanent --add-service=high-availability
# firewall-cmd --reload
设置两个节点上 hacluster 用户的相同密码:
# passwd hacluster
在两个节点上启动集群软件:
# systemctl start pcsd.service
# systemctl enable pcsd.service
从其中一个节点进行集群节点认证:
# pcs host auth node11 node12 -u hacluster
Password:
node01: Authorized
node02: Authorized
认证完成后,创建并启动集群(在其中一个节点上启动):
# pcs cluster setup xraidha node11 node12
No addresses specified for host 'node11', using 'node11'
No addresses specified for host 'node12', using 'node12'
Destroying cluster on hosts: 'node11', 'node12'...
node12: Successfully destroyed cluster
node11: Successfully destroyed cluster
Requesting remove 'pcsd settings' from 'node11', 'node12'
node11: successful removal of the file 'pcsd settings'
node12: successful removal of the file 'pcsd settings'
Sending 'corosync authkey', 'pacemaker authkey' to 'node11', 'node12'
node11: successful distribution of the file 'corosync authkey'
node11: successful distribution of the file 'pacemaker authkey'
node12: successful distribution of the file 'corosync authkey'
node12: successful distribution of the file 'pacemaker authkey'
Sending 'corosync.conf' to 'node11', 'node12'
node11: successful distribution of the file 'corosync.conf'
node12: successful distribution of the file 'corosync.conf'
Cluster has been successfully set up.
随后,按照提示执行相关的集群销毁、密钥分发和配置文件分发操作,直至集群成功设置。
启动配置好的集群:
# pcs cluster start --all
node12: Starting Cluster...
node11: Starting Cluster...
围栏设置
在任何使用共享存储设备的 HA 集群中,必须正确配置并启用围栏(STONITH),以确保在允许数据被另一个节点访问之前,将故障节点隔离。本文系统使用 IPMI 进行围栏。当设计和部署您自己的集群时,请根据系统能力和架构自行选择围栏配置。
获取 IPMI 围栏代理选项描述:
# pcs stonith describe fence_ipmilan
添加围栏资源:
# pcs stonith create node11.stonith fence_ipmilan ip="10.10.0.21" auth=password password="admin" username="admin" method="onoff" lanplus=true pcmk_host_list="node11" pcmk_host_check=static-list op monitor interval=10s
# pcs stonith create node12.stonith fence_ipmilan ip="10.10.0.22" auth=password password="admin" username="admin" method="onoff" lanplus=true pcmk_host_list="node12" pcmk_host_check=static-list op monitor interval=10s
防止围栏资源在应被杀死的节点上启动:
# pcs constraint location node11.stonith avoids node11=INFINITY
# pcs constraint location node12.stonith avoids node12=INFINITY
Csync2 配置
-
配置防火墙以允许 Csync2 工作(在两个节点上执行): # firewall-cmd --permanent --add-port=30865/tcp # firewall-cmd --reload
-
在其中一个节点上创建
/usr/local/etc/csync2.cfg
配置文件,内容如下: nossl * *;group csxiha { host node11; host node12; key /usr/local/etc/csync2.key_ha; include /etc/xiraid/raids; }
-
生成密钥: # csync2 -k /usr/local/etc/csync2.key_ha
-
将配置文件和密钥复制到第二个节点: # scp /usr/local/etc/csync2.cfg /usr/local/etc/csync2.key_ha node12:/usr/local/etc/
-
配置定时同步,每分钟执行一次(在两个节点上编辑 crontab): # crontab -e * * * * /usr/local/sbin/csync2 -x
-
若需要异步同步,可创建同步脚本: # vi /etc/xiraid/config_update_handler.sh 在脚本中填入以下内容: #!/usr/bin/bash /usr/local/sbin/csync2 -xv 保存后设置脚本权限: # chmod +x /etc/xiraid/config_update_handler.sh
xiRAID Classic 集群设置配置
- 禁用 RAID 自动启动,防止在节点启动时 xiRAID Classic 自动激活 RAID。在集群配置中,RAID 应由 Pacemaker 作为集群资源来激活: # xicli settings cluster modify --raid_autostart 0
- 使 xiRAID Classic 4.1 资源代理对 Pacemaker 可见(在两个节点上依次执行): # mkdir -p /usr/lib/ocf/resource.d/xraid # ln -s /etc/xraid/agents/raid /usr/lib/ocf/resource.d/xraid/raid
xiRAID RAID 阵列创建
在第一个节点上创建所有 RAID:
# xicli raid create -n media1 -l 6 -d /dev/nvme8n1 /dev/nvme9n1 /dev/nvme4n1 /dev/nvme5n1 /dev/nvme6n1 /dev/nvme7n1 /dev/nvme0n1 /dev/nvme1n1 /dev/nvme2n1 /dev/nvme3n1 -ss 128
# xicli raid create -n media2 -l 6 -d /dev/nvme14n1 /dev/nvme15n1 /dev/nvme16n1 /dev/nvme17n1 /dev/nvme10n1 /dev/nvme11n1 /dev/nvme12n1 /dev/nvme13n1 /dev/nvme18n1 /dev/nvme19n1 -ss 128
# xicli raid create -n media3 -l 6 -d /dev/nvme8n2 /dev/nvme9n2 /dev/nvme4n2 /dev/nvme5n2 /dev/nvme6n2 /dev/nvme7n2 /dev/nvme0n2 /dev/nvme1n2 /dev/nvme2n2 /dev/nvme3n2 -ss 128
# xicli raid create -n media4 -l 6 -d /dev/nvme14n2 /dev/nvme15n2 /dev/nvme16n2 /dev/nvme17n2 /dev/nvme10n2 /dev/nvme11n2 /dev/nvme12n2 /dev/nvme13n2 /dev/nvme18n2 /dev/nvme19n2 -ss 128
配置完成后,由于已配置了配置复制,RAID 配置文件应在另一节点上同步。可通过 xicli raid show
命令验证新建 RAID 的状态(显示为可用但处于离线状态)。
接下来,为新创建的 RAID 建立文件系统:
# mkfs.ext4 /dev/xi_media1
# mkfs.ext4 /dev/xi_media2
# mkfs.ext4 /dev/xi_media3
# mkfs.ext4 /dev/xi_media4
然后,需要分别在每个集群节点上准备挂载点(与 RAID 不同,文件系统及其挂载点需在每个节点上单独创建):
# mkdir -p /mnt/media1
# mkdir -p /mnt/media2
# mkdir -p /mnt/media3
# mkdir -p /mnt/media4
集群资源创建
为了为 xiRAID Classic RAID 创建 Pacemaker 资源,我们将使用随 xiRAID Classic 一同安装并提供给 Pacemaker 的 xiRAID 资源代理。
-
在 RAID 活动的节点上卸载所有 RAID: # xicli raid unload --all
-
获取 RAID 的 UUID: # grep uuid /etc/xiraid/raids/*.conf 输出示例如下: /etc/xiraid/raids/media1.conf: "uuid": "763E66C5-B8E8-4206-8BCB-AD798770F8DD", /etc/xiraid/raids/media2.conf: "uuid": "5C6C2470-9671-4DC8-B1D8-8FFFCF5B3D2D", /etc/xiraid/raids/media3.conf: "uuid": "D113E2B0-5110-41D4-A926-CF5B1F6F90E7", /etc/xiraid/raids/media4.conf: "uuid": "B9F28B55-8440-4311-B0FD-FA5BE8FC9E88",
-
使用上一步获取的 UUID 为 RAID 创建 pcs 资源,并将每个资源分配到相应的组(例如:
--group=gr_media1
): # pcs resource create xi_media1 ocf:xraid:raid name=media1 uuid=763E66C5-B8E8-4206-8BCB-AD798770F8DD op monitor interval=5s meta migration-threshold=1 --group=gr_media1# pcs resource create xi_media2 ocf:xraid:raid name=media2 uuid=5C6C2470-9671-4DC8-B1D8-8FFFCF5B3D2D op monitor interval=5s meta migration-threshold=1 --group=gr_media2 # pcs resource create xi_media3 ocf:xraid:raid name=media3 uuid=D113E2B0-5110-41D4-A926-CF5B1F6F90E7 op monitor interval=5s meta migration-threshold=1 --group=gr_media3 # pcs resource create xi_media4 ocf:xraid:raid name=media4 uuid=B9F28B55-8440-4311-B0FD-FA5BE8FC9E88 op monitor interval=5s meta migration-threshold=1 --group=gr_media4
同时,为文件系统创建资源(注意:文件系统资源与相应 RAID 分组相同): # pcs resource create fs_media1 Filesystem device="/dev/xi_media1" directory="/mnt/media1" fstype="ext4" --group=gr_media1
# pcs resource create fs_media2 Filesystem device="/dev/xi_media2" directory="/mnt/media2" fstype="ext4" --group=gr_media2 # pcs resource create fs_media3 Filesystem device="/dev/xi_media3" directory="/mnt/media3" fstype="ext4" --group=gr_media3 # pcs resource create fs_media4 Filesystem device="/dev/xi_media4" directory="/mnt/media4" fstype="ext4" --group=gr_media4
启动顺序及位置偏好设置
在 xiRAID Classic 4.1 中,要求一次只能启动一个 RAID。为此,我们定义了以下约束(此限制将在未来版本中移除):
# pcs constraint order start xi_media1 then start xi_media2 kind=Serialize
# pcs constraint order start xi_media1 then start xi_media3 kind=Serialize
# pcs constraint order start xi_media1 then start xi_media4 kind=Serialize
# pcs constraint order start xi_media2 then start xi_media3 kind=Serialize
# pcs constraint order start xi_media2 then start xi_media4 kind=Serialize
# pcs constraint order start xi_media3 then start xi_media4 kind=Serialize
为了使两个资源集运行在两个不同的节点上,定义了如下资源位置偏好:
# pcs constraint location gr_media1 prefers node11=50
# pcs constraint location gr_media2 prefers node11=50
# pcs constraint location gr_media3 prefers node12=50
# pcs constraint location gr_media4 prefers node12=50
最后,使用 pcs status
命令验证集群及资源状态。
集群验证
执行 pcs status
可验证集群状态,示例如下:
# pcs status
Cluster name: xraidha
Cluster Summary:
Stack: corosync (Pacemaker is running)
Current DC: node11 (version 2.1.7-5.2.el9_4-0f7f88312) - partition with quorum
Last updated: Wed Oct 2 03:03:57 2024 on node11
Last change: Wed Oct 2 03:03:46 2024 by root via root on node11
2 nodes configured
10 resource instances configured
Node List:
Online: [ node11 node12 ]
Full List of Resources:
node11.stonith (stonith:fence_ipmilan): Started node12
node12.stonith (stonith:fence_ipmilan): Started node11
Resource Group: gr_media1:
xi_media1 (ocf:xraid:raid): Started node11
fs_media1 (ocf:heartbeat:Filesystem): Started node11
Resource Group: gr_media2:
xi_media2 (ocf:xraid:raid): Started node11
fs_media2 (ocf:heartbeat:Filesystem): Started node11
Resource Group: gr_media3:
xi_media3 (ocf:xraid:raid): Started node12
fs_media3 (ocf:heartbeat:Filesystem): Started node12
Resource Group: gr_media4:
xi_media4 (ocf:xraid:raid): Started node12
fs_media4 (ocf:heartbeat:Filesystem): Started node12
Daemon Status:
corosync: active/disabled
pacemaker: active/disabled
pcsd: active/enabled
此时,一个完整配置的 Pacemaker 集群已经建立,RAID 与文件系统资源已链接并动态管理。如果集群中的一个节点发生故障,Pacemaker 将在另一节点上启动相应资源;同时,如果只是单个驱动器故障,xiRAID Classic 会在活动节点上进入降级模式,而不会触发节点间的故障转移。
高可用性测试
故障切换测试
为测试故障切换,我们关闭了第二节点(node12),并检查集群状态以确认所有 RAID 阵列均在第一节点(node11)上处于激活状态:
# pcs status
Cluster name: xraidha
Cluster Summary:
* Stack: corosync (Pacemaker is running)
* Current DC: node11 (version 2.1.7-5.2.el9_4-0f7f88312) - partition with quorum
* Last updated: Wed Oct 2 03:06:48 2024 on node11
* Last change: Wed Oct 2 03:03:46 2024 by root via root on node11
* 2 nodes configured
* 10 resource instances configured
Node List:
* Online: [ node11 ]
* OFFLINE: [ node12 ]
Full List of Resources:
* node11.stonith (stonith:fence_ipmilan): Stopped
* node12.stonith (stonith:fence_ipmilan): Started node11
* Resource Group: gr_media1:
* xi_media1 (ocf:xraid:raid): Started node11
* fs_media1 (ocf:heartbeat:Filesystem): Started node11
* Resource Group: gr_media2:
* xi_media2 (ocf:xraid:raid): Started node11
* fs_media2 (ocf:heartbeat:Filesystem): Started node11
* Resource Group: gr_media3:
* xi_media3 (ocf:xraid:raid): Started node11
* fs_media3 (ocf:heartbeat:Filesystem): Started node11
* Resource Group: gr_media4:
* xi_media4 (ocf:xraid:raid): Started node11
* fs_media4 (ocf:heartbeat:Filesystem): Started node11
Daemon Status:
corosync: active/disabled
pacemaker: active/disabled
pcsd: active/enabled
# xicli raid show
╔RAIDs═══╦══════════════════╦═════════════╦════════════════════════╦══════╗
║ name ║ static ║ state ║ devices ║ info ║
╠════════╬══════════════════╬═════════════╬════════════════════════╬══════╣
║ media1 ║ size: 5964 GiB ║ online ║ 0 /dev/nvme15n1 online ║ ║
║ ║ level: 6 ║ initialized ║ 1 /dev/nvme4n1 online ║ ║
║ ║ strip_size: 128 ║ ║ 2 /dev/nvme16n1 online ║ ║
║ ║ block_size: 4096 ║ ║ 3 /dev/nvme14n1 online ║ ║
║ ║ sparepool: - ║ ║ 4 /dev/nvme2n1 online ║ ║
║ ║ active: True ║ ║ 5 /dev/nvme5n1 online ║ ║
║ ║ config: True ║ ║ 6 /dev/nvme7n1 online ║ ║
║ ║ ║ ║ 7 /dev/nvme10n1 online ║ ║
║ ║ ║ ║ 8 /dev/nvme12n1 online ║ ║
║ ║ ║ ║ 9 /dev/nvme13n1 online ║ ║
╠════════╬══════════════════╬═════════════╬════════════════════════╬══════╣
║ media2 ║ size: 5964 GiB ║ online ║ 0 /dev/nvme0n1 online ║ ║
║ ║ level: 6 ║ initialized ║ 1 /dev/nvme3n1 online ║ ║
║ ║ strip_size: 128 ║ ║ 2 /dev/nvme1n1 online ║ ║
║ ║ block_size: 4096 ║ ║ 3 /dev/nvme6n1 online ║ ║
║ ║ sparepool: - ║ ║ 4 /dev/nvme8n1 online ║ ║
║ ║ active: True ║ ║ 5 /dev/nvme9n1 online ║ ║
║ ║ config: True ║ ║ 6 /dev/nvme11n1 online ║ ║
║ ║ ║ ║ 7 /dev/nvme17n1 online ║ ║
║ ║ ║ ║ 8 /dev/nvme18n1 online ║ ║
║ ║ ║ ║ 9 /dev/nvme19n1 online ║ ║
╠════════╬══════════════════╬═════════════╬════════════════════════╬══════╣
║ media3 ║ size: 5964 GiB ║ online ║ 0 /dev/nvme15n2 online ║ ║
║ ║ level: 6 ║ initialized ║ 1 /dev/nvme4n2 online ║ ║
║ ║ strip_size: 128 ║ ║ 2 /dev/nvme16n2 online ║ ║
║ ║ block_size: 4096 ║ ║ 3 /dev/nvme14n2 online ║ ║
║ ║ sparepool: - ║ ║ 4 /dev/nvme2n2 online ║ ║
║ ║ active: True ║ ║ 5 /dev/nvme5n2 online ║ ║
║ ║ config: True ║ ║ 6 /dev/nvme7n2 online ║ ║
║ ║ ║ ║ 7 /dev/nvme10n2 online ║ ║
║ ║ ║ ║ 8 /dev/nvme12n2 online ║ ║
║ ║ ║ ║ 9 /dev/nvme13n2 online ║ ║
╠════════╬══════════════════╬═════════════╬════════════════════════╬══════╣
║ media4 ║ size: 5964 GiB ║ online ║ 0 /dev/nvme0n2 online ║ ║
║ ║ level: 6 ║ initialized ║ 1 /dev/nvme3n2 online ║ ║
║ ║ strip_size: 128 ║ ║ 2 /dev/nvme1n2 online ║ ║
║ ║ block_size: 4096 ║ ║ 3 /dev/nvme6n2 online ║ ║
║ ║ sparepool: - ║ ║ 4 /dev/nvme8n2 online ║ ║
║ ║ active: True ║ ║ 5 /dev/nvme9n2 online ║ ║
║ ║ config: True ║ ║ 6 /dev/nvme11n2 online ║ ║
║ ║ ║ ║ 7 /dev/nvme17n2 online ║ ║
║ ║ ║ ║ 8 /dev/nvme18n2 online ║ ║
║ ║ ║ ║ 9 /dev/nvme19n2 online ║ ║
╚════════╩══════════════════╩═════════════╩════════════════════════╩══════╝
# df -h | grep media
/dev/xi_media1 5.8T 28K 5.5T 1% /mnt/media1
/dev/xi_media2 5.8T 28K 5.5T 1% /mnt/media2
/dev/xi_media3 5.8T 28K 5.5T 1% /mnt/media3
/dev/xi_media4 5.8T 28K 5.5T 1% /mnt/media4
故障恢复测试
在故障切换测试后,我们启动第二节点(node12)并启动集群,确认故障转移资源恢复到原状态:
# pcs status
Cluster name: xraidha
Cluster Summary:
* Stack: corosync (Pacemaker is running)
* Current DC: node11 (version 2.1.7-5.2.el9_4-0f7f88312) - partition with quorum
* Last updated: Wed Oct 2 03:11:02 2024 on node12
* Last change: Wed Oct 2 03:03:46 2024 by root via root on node11
* 2 nodes configured
* 10 resource instances configured
Node List:
* Online: [ node11 node12 ]
Full List of Resources:
* node11.stonith (stonith:fence_ipmilan): Started node12
* node12.stonith (stonith:fence_ipmilan): Started node11
* Resource Group: gr_media1:
* xi_media1 (ocf:xraid:raid): Started node11
* fs_media1 (ocf:heartbeat:Filesystem): Started node11
* Resource Group: gr_media2:
* xi_media2 (ocf:xraid:raid): Started node11
* fs_media2 (ocf:heartbeat:Filesystem): Started node11
* Resource Group: gr_media3:
* xi_media3 (ocf:xraid:raid): Started node12
* fs_media3 (ocf:heartbeat:Filesystem): Started node12
* Resource Group: gr_media4:
* xi_media4 (ocf:xraid:raid): Started node12
* fs_media4 (ocf:heartbeat:Filesystem): Started node12
Daemon Status:
corosync: active/disabled
pacemaker: active/disabled
pcsd: active/enabled
围栏测试
即使在节点无响应的情况下,也无法确保其不会访问数据,因此必须使用 STONITH 将节点隔离,确保数据在另一个节点访问前,该节点已离线。我们的集群通过 STONITH 强制将节点重新启动以实现隔离。
测试围栏功能时,我们断开了第二节点的网络连接,并检查 STONITH 历史:
# pcs stonith history
示例输出显示对 node12 的重启操作成功:
reboot of node12 successful: delegate=node11, client=pacemaker-controld.4812, origin=node11, completed='2024-10-02 22:04:44.456962 +08:00'
同时,通过如下命令确认第二节点已重启:
# last reboot | head -1
输出示例如下:
reboot system boot 5.14.0-427.26.1. Wed Oct 2 22:06 still running
结论
通过对 Xinnor xiRAID Classic 与 AIC HA202-PV 存储桥湾平台的全面测试,证明了该解决方案在各类工作负载下均表现出卓越的性能与效率。关键发现包括:
- xiRAID Classic 在顺序与随机操作下均能实现基准性能的 90% 至 98%,几乎没有性能损失,从而成为市场上最高效的软件 RAID 解决方案之一。
- 实施的 HA 集群配置展示了无缝的故障切换与故障恢复能力,即使在节点故障情况下也能确保数据的持续可用性。
这些结果突显了该软件定义存储解决方案在高性能计算环境中的可行性。HA 配置的成功实施和测试进一步表明,该方案已准备好应用于生产环境,在这些环境中,系统停机时间不可接受。无缝的故障切换与故障恢复能力,再加上有效的围栏机制,确保了系统在面对各种故障场景时既不会影响数据可用性,也不会损害数据完整性。
xiRAID Classic 与 AIC HA202-PV 的结合为硬件 RAID 系统提供了一种具有成本效益和灵活性的替代方案,特别适用于 BeeGFS 和 Lustre 等并行文件系统。其在接近后端性能的同时实现容错,使其非常适合数据密集型企业应用和研究环境,在这些场景中,数据完整性与访问速度至关重要,同时也能适应不断变化的存储需求。
博客文章来源:xinnor.io/blog/demons…
附录
后端测量任务定义
顺序测试预调校配置
[global]
rw=write
bs=128K
iodepth=64
direct=1
ioengine=libaio
group_reporting
loops=2
[job 1]
filename=/dev/nvme0n1
[job 2]
filename=/dev/nvme0n2
...
随机测试预调校配置
[global]
rw=randwrite
bs=4K
iodepth=32
Numjobs=4
direct=1
ioengine=libaio
group_reporting
loops=2
[job 1]
filename=/dev/nvme0n1
[job 2]
filename=/dev/nvme0n2
...
原始顺序写/读测试
[global]
rw=write
#rw=read
bs=128K
iodepth=32
direct=1
ioengine=libaio
runtime=100
group_reporting
[job 1]
filename=/dev/nvme5n1
...
[job 11]
filename=/dev/nvme0n1
...
原始随机读测试
[global]
rw=randread
bs=4K
iodepth=64
direct=1
ioengine=libaio
runtime=100
group_reporting
[job 1]
filename=/dev/nvme5n1
...
[job 11]
filename=/dev/nvme0n1
...
混合 50/50 随机读写测试
[global]
rwmixwrite=50
rw=randrw
numjobs=4
bs=4K
iodepth=64
direct=1
ioengine=libaio
runtime=100
group_reporting
[job 1]
filename=/dev/nvme5n1
...
[job 11]
filename=/dev/nvme0n1
...
RAID 测试任务定义
RAID 顺序写/读测试
[global]
rw=write
#rw=read
bs=1M
iodepth=32
direct=1
ioengine=libaio
runtime=100
numjobs=8
offset_increment=12%
group_reporting
[job 1]
filename=/dev/xi_media1(3)
numa_cpu_nodes=1
[job 2]
filename=/dev/xi_media2 (4)
numa_cpu_nodes=0
RAID 随机读/写测试
[global]
rw=randwrite
#rw=randread
bs=4K
iodepth=32
direct=1
ioengine=libaio
runtime=100
numjobs=32
group_reporting
[job 1]
filename=/dev/xi_media1(3)
numa_cpu_nodes=1
[job 2]
filename=/dev/xi_media2(4)
numa_cpu_nodes=0