4. 多路径配置:Linux下多路径软件(如dm-multipath)的安装与配置

4.1 核心原理:为什么需要dm-multipath

在InfiniBand(IB)网络中,HCA(Host Channel Adapter)端口与子网管理器(Subnet Manager)配合,通常会为同一存储LUN建立多条路径。以双端口HCA连接双交换机、双存储控制器为例,操作系统看到的同一LUN可能对应4个不同的SCSI设备节点(如/dev/sdb、/dev/sdc、/dev/sdd、/dev/sde)。如果不对这些路径进行统一管理,直接使用裸设备将导致严重问题:数据并发写入时各路径独立维护缓存,极易造成数据不一致;单条路径故障时,上层应用无法自动感知和切换,I/O中断不可避免。

dm-multipath(Device Mapper Multipath)是Linux内核提供的多路径I/O框架,其核心思想是将多个底层SCSI设备合并为一个逻辑设备(如/dev/mapper/mpatha),由内核统一管理路径的负载均衡与故障切换。它通过路径健康检测(默认使用tur或rdac检测命令周期性发送SCSI测试单元就绪命令)感知路径状态,一旦发现活动路径失效,立即将I/O切换到备用路径,整个过程对上层文件系统透明。

关键概念:在IB多路径场景中,路径不仅是物理链路的连接,还涉及子网管理器分配的LID(Local Identifier)和GID(Global Identifier)。dm-multipath工作于SCSI层之上,它不关心底层是IB、光纤通道还是iSCSI,只要SCSI层能识别到多个指向同一LUN的设备节点,就能进行多路径聚合。
dm-multipath 多路径聚合原理(IB双端口双交换机场景) 存储控制器 A LUN ID: 0x1000 存储控制器 B LUN ID: 0x1000 IB交换机 1 LID 3 IB交换机 2 LID 7 HCA 端口1 GID fe80::1 HCA 端口2 GID fe80::2 路径1 路径2 路径3 路径4 /dev/mapper/mpatha 活动路径: 2条 4条路径聚合 故障自动切换

4.2 安装与基础配置流程

在主流Linux发行版中,dm-multipath通常作为标准软件包提供。以RHEL/CentOS/Rocky系列为例,安装命令如下:

# 安装device-mapper-multipath软件包
yum install -y device-mapper-multipath

# 加载内核模块
modprobe dm_multipath

# 生成默认配置文件
mpathconf --enable --with_multipathd y

对于Ubuntu/Debian系统,使用apt install multipath-tools完成安装。安装完成后,需要编辑/etc/multipath.conf配置文件。以下是一个针对IB环境的基础配置模板:

# /etc/multipath.conf
defaults {
    user_friendly_names yes
    find_multipaths yes
    path_grouping_policy multibus
    path_selector "round-robin 0"
    failback immediate
    no_path_retry 5
    polling_interval 5
}

blacklist {
    # 排除本地SATA/SAS磁盘,避免误聚合
    wwid "SATA_*"
    devnode "^sd[a-z]"
}

multipaths {
    multipath {
        wwid 36001405f0abc1234567890def1234567
        alias mpath_ibdata
        path_grouping_policy multibus
        path_selector "round-robin 0"
    }
}

配置完成后,启动multipathd守护进程并设置为开机自启:

systemctl start multipathd
systemctl enable multipathd
multipath -v3   # 以调试模式扫描并聚合路径

4.3 路径状态查看与验证

配置完成后,必须验证多路径是否正常工作。使用multipath -ll命令查看当前多路径拓扑:

# multipath -ll
mpath_ibdata (36001405f0abc1234567890def1234567) dm-2 IB,IBStorage
size=2.0T features='0' hwhandler='0' wp=rw
|-+- policy='round-robin 0' prio=1 status=active
| `- 4:0:0:0  sdb 8:16  active ready running
|-+- policy='round-robin 0' prio=1 status=active
| `- 5:0:0:0  sdc 8:32  active ready running
|-+- policy='round-robin 0' prio=1 status=enabled
| `- 6:0:0:0  sdd 8:48  active ready running
`-+- policy='round-robin 0' prio=1 status=enabled
  `- 7:0:0:0  sde 8:64  active ready running

输出中status=active表示当前活动路径组,status=enabled表示备用路径组。在IB环境中,由于使用multibus策略,所有路径通常都在同一组内参与负载均衡。通过multipathd show paths可以查看每条路径的健康检查状态:

# multipathd show paths
sysfs    dm  sdev  dev  status  chkstat  chkfail  priority
4:0:0:0  mpath_ibdata  sdb  8:16  active  ok       0        1
5:0:0:0  mpath_ibdata  sdc  8:32  active  ok       0        1
6:0:0:0  mpath_ibdata  sdd  8:48  enabled ok       0        1
7:0:0:0  mpath_ibdata  sde  8:64  enabled ok       0        1
经验提示:在IB环境中,建议将polling_interval设置为3~5秒。IB链路故障检测速度远快于传统以太网,较短的轮询间隔可以更快触发路径切换,但也不宜过短(小于2秒),否则可能因瞬时抖动导致频繁切换。

4.4 典型故障场景与切换验证

多路径配置完成后,必须进行故障切换演练。最常见的验证方法是模拟单条链路故障:

# 模拟HCA端口1所在链路故障(拔线或禁用端口)
ibportstate -C 1 -P 1 disable   # 在交换机侧禁用端口

# 观察multipathd日志
journalctl -u multipathd -f
# 预期输出:
# Nov 20 10:23:45 host multipathd[1234]: sdb: checker failed
# Nov 20 10:23:46 host multipathd[1234]: mpath_ibdata: switch to path group #1
# Nov 20 10:23:46 host multipathd[1234]: mpath_ibdata: active path sdc

切换完成后,再次执行multipath -ll,应看到故障路径的status变为failed,而备用路径自动接管。此时在文件系统层面持续写入数据(如dd if=/dev/zero of=/mnt/ibdata/test bs=1M count=10000),应无任何I/O中断或报错。

4.5 常见误区与复盘

误区 后果 正确做法
未将本地磁盘加入blacklist 本地SATA盘被误聚合,导致系统盘无法启动 通过multipath -v3查看所有设备WWID,将本地盘WWID加入黑名单
IB子网管理器未配置多路径支持 虽然SCSI层能看到多路径,但IB层LID/GID解析异常 确认子网管理器已正确分配LID,且HCA端口处于Active状态
使用failover策略而非multibus 仅单条路径承载I/O,IB带宽优势无法发挥 IB环境建议使用multibus + round-robin实现负载均衡
未配置no_path_retry 所有路径失效时,I/O立即返回错误,应用崩溃 设置no_path_retry 5或更大值,给路径恢复留出时间
重要提醒:在IB多路径环境中,find_multipaths yes参数可能导致系统启动时扫描时间过长。如果服务器有大量本地磁盘,建议改为find_multipaths strict或显式在multipaths段中列出需要聚合的WWID,避免启动时对所有SCSI设备逐一探测。

4.6 配置后的系统级检查清单

  • 确认/etc/multipath.conf中黑名单配置正确,本地磁盘未被聚合。
  • 使用multipath -ll确认所有IB路径均显示为active ready状态。
  • 检查/dev/mapper/下逻辑设备是否已创建,且udev规则已生效。
  • 在/etc/fstab中使用/dev/mapper/mpath_ibdata而非/dev/sdb等设备名,防止重启后设备节点漂移。
  • 执行一次完整的故障切换演练,记录切换耗时(通常应小于5秒)。
  • 确认multipathd服务已设置为开机自启,且systemctl status multipathd显示运行正常。