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切换到备用路径,整个过程对上层文件系统透明。
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
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或更大值,给路径恢复留出时间 |
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显示运行正常。