做过 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-toolsRHEL/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 存储,且对可用性有要求:值得配。两块网卡成本不高,能顶住单网卡/单交换机故障。
- 只有一条物理链路:配了也没用,先解决链路冗余再说。
- 数据可丢、能接受停机恢复:优先把钱花在备份上,多路径的收益不如一份可靠的异地备份。
多路径本身不复杂,难的是"想清楚你防的是什么"。它的定位很明确:给远程块设备的访问路径加冗余,让单点链路故障不至于拖垮业务。理解了这个定位,配置那几十行参数就都顺理成章了。