DM-Multipath 多路径存储实战:给远程磁盘加冗余链路,单网卡/单交换机故障不中断业务

做过 iSCSI 或者光纤存储的人大概都碰到过这种情况:服务器上挂着一块远程磁盘,平时好好的,某天交换机动了一下、或者机房里一根网线被人踩掉了,业务瞬间挂死,磁盘 I/O 报错、数据库直接锁死。明明存储设备上还有另一块网卡、另一条链路,可操作系统压根不知道它的存在。这就是单路径存储的致命弱点——从服务器到存储设备之间只有一条路,路上任何一环出问题,整块盘就不通了。

这篇文章要讲的就是解决这个问题的技术:DM-Multipath(Device Mapper Multipath)多路径存储。它的核心思路非常朴素:让服务器到同一块存储之间同时存在多条物理路径(多块网卡、多台交换机、存储上多个控制器口),操作系统把它们识别成一条逻辑设备,平时可以负载均衡走多条路,某条路断了自动切换到剩下的路,业务层完全无感。这是企业存储的标准做法,在只有一两台 VPS 的个人站长场景里同样能大幅提升可用性。

一、为什么个人站长也需要多路径

很多人会觉得多路径是"大厂才玩的东西",其实不然。只要你的架构里出现了"计算和存储分离"——比如 Web 服务器挂在后端的 iSCSI 存储上、数据库的数据文件放在远程块设备上——你就已经暴露在单点故障面前了。而搭建冗余的成本,可能只是多买一块网卡、多拉一根网线。

先看清楚单路径到底会在哪些环节断掉:

  • 网卡故障:服务器上负责连存储的那块网卡坏了,链路全断。
  • 交换机故障:中间那台交换机重启或宕机,走它的所有流量中断。
  • 线缆问题:网线松动、光模块老化、水晶头接触不良。
  • 存储控制器故障:存储设备上提供服务的那个控制器口失效。

这四类故障里,前三类占了绝大多数。而只要有两条独立的路径(两块网卡分插不同交换机),上面的任意单点出问题都不会导致整体中断。多路径要做的,就是把这套冗余真正用起来。

二、多路径的底层原理:为什么会出现"重复磁盘"

理解多路径,先要理解一个现象:当你给 Linux 服务器配了两条通往同一块 LUN 的路径时,lsblk 或 fdisk -l 里会看到两块盘,比如 /dev/sdb 和 /dev/sdc,而且它们的容量、型号完全一样。第一次遇到的人往往会以为存储配错了,其实它们是同一个 LUN 的两个视图。

原因在于:iSCSI 或 FC 的发现机制是"按路径发现"的。服务器通过网卡 A 发 discover 请求,看到了 LUN;通过网卡 B 再发一次,又看到了同一个 LUN。内核不知道这两个是同一个东西,就各自分配了设备节点。

这时候如果不管它,会引发灾难性后果:你以为格式化了 /dev/sdb,实际上 /dev/sdc 指向的是同一块数据,两个设备节点上的文件系统互相冲突,写坏元数据、文件系统崩溃都是分分钟的事。多路径工具的首要任务,就是把这些重复的设备节点认出来,收敛成一个 /dev/mapper/mpathX 逻辑设备,让你只操作这一个入口。

DM-Multipath 依赖两个组件:

  • multipathd 守护进程:后台运行,实时监测每条路径的健康状态,路径失效时更新映射表。
  • device-mapper 内核模块:真正实现 I/O 转发,把发往 /dev/mapper/mpathX 的请求选一条可用路径送出去。

三、装环境:安装与启动

Debian/Ubuntu 系:

apt update
apt install -y multipath-tools

RHEL/CentOS 系:

yum install -y device-mapper-multipath
systemctl enable --now multipathd

安装后检查守护进程有没有跑起来:

systemctl status multipathd
multipath -ll

如果 multipath -ll 没有任何输出,说明当前系统还没发现任何多路径设备(正常,等挂载 iSCSI 之后才会有)。如果有设备但显示异常,多半是配置没生效,往下看配置部分。

四、先搭一条 iSCSI 链路作为底子

多路径必须有"多条路"才有意义,所以我们先在服务器和存储之间建好两条独立的 iSCSI 会话。假设存储端(target)的 IP 是 10.0.0.10,服务器的两块网卡分别是 192.168.10.5 和 192.168.20.5,且两块网卡都能路由到 10.0.0.10。

服务器端发起发现和登录:

iscsiadm -m discovery -t sendtargets -p 10.0.0.10
iscsiadm -m node -T iqn.2026-10.com.example:storage -p 10.0.0.10 -l

关键来了:要用两块网卡各发起一次登录,才能形成两条路径。可以用 iface 分别绑定源网卡:

# 记录第一条会话
iscsiadm -m session -P 3 | grep iface
# 用指定网卡接口再发起一条
iscsiadm -m node -T iqn.2026-10.com.example:storage -p 10.0.0.10 -I iface0 -l
iscsiadm -m node -T iqn.2026-10.com.example:storage -p 10.0.0.10 -I iface1 -l

登录两条会话后,lsblk 应该能看到两个同容量的设备(未收敛时)。这时候先不要格式化、不要挂载,让多路径工具先接管。

五、配置 /etc/multipath.conf

多路径的核心配置文件是 /etc/multipath.conf。默认它可能不存在或全是注释,最省事的做法是:

# 复制官方默认样例再改
cp /usr/share/doc/multipath-tools/examples/multipath.conf /etc/multipath.conf
# 或者直接生成默认
mpathconf --enable --with_multipathd y

一份适用于 iSCSI 的精简配置长这样:

defaults {
    polling_interval        10
    path_selector           "service-time 0"
    path_grouping_policy    failover
    failback                immediate
    rr_weight               uniform
    no_path_retry           queue
    user_friendly_names     yes
}

blacklist {
    devnode "^(ram|raw|loop|fd|md|dm-|sr|scd|st)[0-9]*"
    device {
        vendor  "IET"
        product "VIRTUAL-DISK"
    }
}

blacklist_exceptions {
    wwid "36001405*"
}

逐条解释几个最关键的参数:

  • polling_interval 10:每 10 秒检查一次每条路径的存活状态。
  • path_grouping_policy failover:把能同时到达同一存储的两条路径分成一个组,平时只用其中一条,主路径挂了才切到另一条。对于单控制器的小存储,这是最合适的策略;如果存储控制器支持 ALUA(异步逻辑单元访问),可以改成 group_by_prio 让两条路同时承担流量。
  • failback immediate:主路径恢复后立即切回来。生产环境有时会设成延迟切回,避免路径反复抖动导致 I/O 来回震荡。
  • no_path_retry queue:这个最重要也最危险——所有路径都挂了时,I/O 请求是排队等待而不是直接失败。好处是路径恢复后业务能继续,坏处是如果路径长期不恢复,进程会长时间 hang 住。
  • blacklist:必须排除掉本地磁盘和虚拟设备,否则多路径会把服务器的系统盘也纳入管理,后果严重。注意 iSCSI 的虚拟磁盘有时会被误伤,所以再配一条 blacklist_exceptions 把存储的 wwid 放行。

六、识别 wwid 与验证收敛

每块多路径设备有一个唯一的 wwid(World Wide Identifier),是多路径识别同一 LUN 不同路径的凭据。查 wwid:

# 列出所有 SCSI 设备及其 wwid
/usr/lib/udev/scsi_id -g -u /dev/sdb
# 或
multipath -d -v 3

拿到 wwid 后,可以在配置里为它指定一个固定的别名,这样重启后设备名不会漂移:

multipaths {
    multipath {
        wwid    36001405a1b2c3d4e5f600000000001
        alias   mpdata
    }
}

重载配置并查看收敛结果:

systemctl restart multipathd
multipath -ll

正常输出应该长这样:

mpdata (36001405a1b2c3d4e5f600000000001) dm-2 IET,VIRTUAL-DISK
size=100G features='0' hwhandler='0' wp=rw
|-+- policy='service-time 0' prio=1 status=active
| `- 6:0:0:1 sdb 8:16 active ready running
`-+- policy='service-time 0' prio=1 status=enabled
  `- 7:0:0:1 sdc 8:32 active ready running

注意上面 mpdata 下面挂了两条路径,但只有一条是 active、另一条是 enabled(standby 状态)——这正是 failover 策略下的正常状态:I/O 全走 active 那条,standby 随时待命。这个 /dev/mapper/mpdata 才是你唯一应该操作的设备。

七、挂载与开机自动生效

格式化并挂载逻辑设备(注意:只操作 /dev/mapper/mpdata,绝不碰 /dev/sdb):

mkfs.ext4 /dev/mapper/mpdata
mkdir -p /data
mount /dev/mapper/mpdata /data

写进 /etc/fstab 时必须用 UUID 而不是设备名,并加上多路径专用挂载选项:

blkid /dev/mapper/mpdata
# 输出类似 UUID="a1b2c3d4-..." 取 UUID 值写入 fstab

UUID=a1b2c3d4-5678-90ab-cdef-1234567890ab  /data  ext4  defaults,_netdev,nofail  0  0

_netdev 表示这是网络设备,本地文件系统挂载要等网络起来之后再进行;nofail 保证存储暂时不可达时系统仍能正常启动,不至于卡在开机阶段。这两个选项缺一不可,少了都有可能开机卡在"等待网络存储"而进不去系统。

八、故障演练:拔掉一条路径会怎样

配置完不演练等于没配。最直接的测试方法是在服务器上禁用其中一块网卡(模拟链路中断):

ip link set eth1 down
# 观察多路径状态
watch -n1 'multipath -ll | grep -E "mpath|sdb|sdc"'

你会发现原来 active 的那条路径状态从 active ready running 变成了 failed faulty running,而 standby 那条自动提升为 active,I/O 继续由它承担。此时 dmesg 里能看到类似 dm-multipath: path 6:0:0:1 is now degraded 的日志,而你在 /data 里读写文件完全不受影响——这正是多路径的价值。

恢复网卡后:

ip link set eth1 up
multipath -ll

因为配了 failback immediate,原路径会在一两个轮询周期内自动切回 active。如果想看得更清楚,把 failback 改成 manual,切回就必须手动执行 multipathd reconfigure 或用 dmsetup 干预。

九、五个必踩的坑

坑一:忘装 multipath 就格式化了磁盘。这在单路径变多路径时最容易发生——先挂的 iSCSI 只有一条路,格式化了 /dev/sdb;后来又加了一条路,系统出现 /dev/sdc,此时 /dev/sdb 变成多路径下的一个子路径,原来的挂载点可能失效甚至损坏文件系统。正确做法是:只要涉及远程块设备,永远先装好多路径、让设备以 /dev/mapper/ 形态出现,再格式化。

坑二:no_path_retry 设成 queue 却没有超时保护。所有路径断开时,I/O 无限排队,mount、df 都能挂死,救都救不回来。稳妥的做法是设一个有限重试次数(如 no_path_retry 5),并配合应用层的超时;关键业务还要监控 multipath -ll 的路径状态,一旦出现 faulty 立即告警。

坑三:blacklist 没排除系统盘。如果存储和本地盘型号接近,多路径可能把本地 SATA/SAS 盘也纳管,导致系统盘设备名变动、无法启动。务必用 devnode 和 vendor/product 组合精确排除。

坑四:用 /dev/sdX 而不是 /dev/mapper 操作。设备名会漂移,重启后 sdb 可能变成 sdc。挂载、格式化、fstab 一律走 /dev/mapper/别名 或 UUID。

坑五:以为多路径能替代备份。多路径解决的是"路径冗余",不是"数据冗余"。它不复制数据——两条路径指向的仍是同一份数据。存储本身坏了(阵列崩溃、误删、勒索加密),多路径一点忙都帮不上。路径冗余和存储冗余(RAID)、数据备份是三个不同层次的事,缺一不可。

十、个人站点的现实取舍

最后回到个人站长视角。要不要上多路径?我的建议是分场景:

  • 单台 VPS + 本地磁盘:不需要,多路径无从谈起。
  • Web 服务器挂远程 iSCSI 存储,且对可用性有要求:值得配。两块网卡成本不高,能顶住单网卡/单交换机故障。
  • 只有一条物理链路:配了也没用,先解决链路冗余再说。
  • 数据可丢、能接受停机恢复:优先把钱花在备份上,多路径的收益不如一份可靠的异地备份。

多路径本身不复杂,难的是"想清楚你防的是什么"。它的定位很明确:给远程块设备的访问路径加冗余,让单点链路故障不至于拖垮业务。理解了这个定位,配置那几十行参数就都顺理成章了。

Last modification:October 6th, 2026 at 09:24 pm

Leave a Comment