4. SAN与iSCSI存储网络容错
在业务连续性体系中,服务器与存储之间的链路往往是“看不见的单点”。一台主机可能配了双电源、双网卡,但只要到存储阵列的路径只有一条,光纤或交换机的一次抖动就足以让数据库挂起。本节围绕FC SAN与iSCSI两类存储网络,讲清多路径I/O(MPIO)如何把多条物理链路聚合成一条逻辑路径,以及交换机冗余和存储阵列控制器故障切换如何协同工作。
一、为什么需要多路径:从单点链路到路径集合
主机通过HBA卡(FC)或网卡(iSCSI)访问存储阵列的LUN。在单路径结构中,主机HBA→交换机→阵列控制器端口构成唯一通路,任何一环故障都会导致I/O中断。多路径I/O的核心思想是:主机同时看到通往同一LUN的多条物理路径,操作系统通过MPIO驱动把它们识别为同一个多路径设备,并在路径之间做负载均衡与故障切换。
以一台双HBA服务器连接双控制器阵列为例,典型拓扑是:HBA-A→交换机A→控制器A端口,HBA-B→交换机B→控制器B端口。主机侧会看到两条到同一LUN的路径,MPIO将其聚合为mpath0。正常时两条路径可同时承载I/O;当交换机A或控制器A端口故障时,流量自动切到另一条路径,业务不中断。
二、MPIO配置:从发现路径到策略选择
MPIO的配置分为三步:路径发现、多路径设备聚合、策略设定。以Linux环境为例,安装device-mapper-multipath后,通过multipath -ll可查看聚合结果。假设服务器有两条FC路径,输出中会显示mpatha下挂sda和sdb两个物理设备,分别对应两条HBA链路。
# multipath -ll
mpatha (3600a098038304445552b4d4a4c4e4d5a) dm-0 LENOVO,DE_Series
size=500G features='1 queue_if_no_path' hwhandler='1 alua' wp=rw
|-+- policy='service-time 0' prio=50 status=active
| `- 1:0:0:0 sda 8:0 active ready running
`-+- policy='service-time 0' prio=10 status=enabled
`- 2:0:0:0 sdb 8:16 active ready running
输出中status=active表示当前承载I/O的路径,status=enabled表示备用路径。策略service-time 0表示按路径服务时间动态选择,适合两条链路性能接近的场景。若两条路径性能差异明显,可改用round-robin 0做轮询,或queue-length 0按队列深度选择。
iSCSI场景下,MPIO配置还需注意会话与路径的对应关系。每块网卡发起一个iSCSI会话,通过iscsiadm -m session可看到多个会话指向同一Target。此时MPIO会把不同会话对应的设备聚合为同一多路径设备。若只配置了一个会话,即使有多块网卡,也不会形成真正的多路径。
multipath -ll中同一WWID下是否出现多个物理设备;二是status字段是否至少有一条active、其余enabled或active。只有一条路径时,MPIO形同虚设。三、交换机冗余:双Fabric与Zone设计
FC SAN的交换机冗余通常采用双Fabric架构:Fabric A和Fabric B物理隔离,主机HBA-A接入Fabric A,HBA-B接入Fabric B,阵列的两个控制器端口也分别接入两个Fabric。这样任一Fabric内的交换机、链路或端口故障,都不会影响另一Fabric的I/O。
Zone划分是交换机冗余中容易被忽视的一环。Zone决定了哪些端口可以互相通信。若把主机HBA-A和HBA-B划入同一个Zone,虽然物理上双Fabric,逻辑上却可能形成交叉访问,反而增加故障传播风险。正确做法是按“单HBA单Zone”原则:HBA-A与控制器A端口一个Zone,HBA-B与控制器B端口另一个Zone,两个Zone互不重叠。
iSCSI场景下,交换机冗余体现为双交换机+双VLAN或双网段。主机两块网卡分别接入两台交换机,存储阵列两个控制器端口也分别接入。此时需确保iSCSI会话绑定正确的源网卡,避免因路由选择导致会话走错路径。可通过ip route和iscsiadm -m session -P 3确认每个会话的源IP与目标IP对应关系。
四、存储阵列故障切换:ALUA与控制器接管
多控制器阵列通常支持ALUA(Asymmetric Logical Unit Access,非对称逻辑单元访问)。每个LUN有一个“优选控制器”和一个“非优选控制器”。主机通过优选控制器的路径访问时延迟更低,通过非优选控制器访问时阵列内部会转发,延迟略高但可用。当优选控制器故障时,非优选控制器接管LUN,主机侧MPIO感知路径优先级变化,把I/O切到接管后的路径。
以ThinkSystem DE系列为例,控制器A为LUN 0的优选控制器,控制器B为非优选。正常时multipath -ll中控制器A对应路径prio=50,控制器B对应路径prio=10。当控制器A故障,控制器B接管,路径优先级重新计算,原enabled路径变为active。整个过程对上层文件系统透明,但需确保MPIO策略中queue_if_no_path已启用,否则路径切换瞬间的I/O可能直接报错而非排队等待。
五、验证与排障:从路径状态到实际I/O
配置完成后,验证应覆盖三个层面。第一层是路径层:multipath -ll确认多路径设备下有多条路径且状态正常。第二层是链路层:模拟拔掉一条FC线或禁用一块网卡,观察multipath -ll中对应路径是否变为failed,另一条是否转为active。第三层是业务层:在切换过程中持续对LUN上的文件系统做读写,确认无I/O错误或仅短暂排队。
常见问题中,iSCSI多路径失效多因会话未绑定源网卡,导致所有会话走同一物理链路;FC多路径失效多因Zone划分错误,主机只看到一条路径。排障时先用multipath -ll看路径数量,再用systool -c fc_host -v或iscsiadm -m session看物理链路,最后用iostat -x 1观察各路径的I/O分布是否均衡。
| 检查项 | 正常表现 | 异常表现与处理 |
|---|---|---|
| 多路径设备路径数 | 同一WWID下≥2条路径 | 仅1条:检查HBA/NIC、Zone、iSCSI会话 |
| 路径状态 | 至少1条active,其余enabled/active | 全部failed:检查交换机与阵列端口 |
| I/O分布 | 各active路径均有流量 | 单路径承载:检查MPIO策略与ALUA优先级 |
| 故障切换 | 拔线后I/O切换,业务不中断 | 切换失败:检查queue_if_no_path与应用超时 |
把上述四层——多路径聚合、MPIO策略、交换机与Zone冗余、阵列控制器接管——串起来看,存储网络容错的本质是“让主机始终有至少一条可用路径,并让这条路径在故障时被自动选中”。配置完成后,定期做一次拔线演练,比任何纸面检查都更能暴露真实问题。