Akemi

多路径存储dm-multipath

2025/08/19

dm-multipath介绍

一个系统如果可以使用多个不同的通信路径访问同一个存储设备,如光纤、iscsi、SAS等。

想满足当其中一条路径出现故障时,自动切换到另一条路径的需求,红帽推荐使用dm-multipath子系统实现多路径支持

dm-multipath会根据/etc/multipath.conf中的设置,自动检测路径并将路径分组,当组出现故障时,守护进程会将存储流量切换到另一个组

  • 按名称访问多路径设备

内核为每个多路径设备分配一个世界范围标识符WWIDs,默认情况下系统会将设备名称直接设置为其WWIDs。并在/dev/mapper下为每个WWID创建一个设备文件

如果在配置文件中,将user_friendly_names选项设置为yes,那么就会生成类似于/dev/mapper/mpathX这样更友好的名称

WWIDs到设备名称的映射,会存储在/etc/multipath/bindings中,在集群部署时,需要同步到其他节点

  • 自定义名称

如果要使用自定义名称,可以在/etc/multipath.conf中配置multipaths部分的alias选项

部署dm-multipath

1
2
3
4
5
6
7
8
9
10
11
# 部署
yum -y install device-mapper-multipath

# 创建配置文件
/etc/multipath.conf

# 启动multipath,并生成配置文件
mpathconf --enable

# 开机启动
systemctl enable multipathd --now

配置文件参数说明

1
2
3
4
5
6
配置文件分为以下几个部分:
blacklist {} 黑名单,列出不需要多路径管理的设备
blacklist_exceptions {} 黑名单除外,定义了需要多路径管理的设备
defaults {} 定义所有多路径设备的默认设置
devices {} 对特定类型存储控制器设置,会覆盖defaults
multipaths {} 针对特定多路径设备的设置,会覆盖defaults和devices

blacklist设备(黑名单)

使用排除列表,可以防止多路径管理某些设备,通常是没有冗余的本地磁盘

如果multipath将find_multipaths参数设置为yes,可以自动排除这类磁盘

1
2
3
4
5
6
7
8
9
10
11
12
13
blacklist {
# 通过设备属性排除(例如排除本地磁盘)
devnode "^sd[a-z]" # 排除所有 /dev/sdX 设备
devnode "^hd[a-z]" # 排除 IDE 设备
devnode "^cciss!c[0-9]d[0-9]" # 排除 HP Smart Array 设备

# 通过 WWID 排除特定设备
wwid "3600508b400105e210000900000490000" # 排除某个已知的本地磁盘

# 通过设备类型排除(例如排除光驱)
device {
type "cdrom" # 排除所有光驱设备
}

缺省参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
path_selector service-time 0   设置了多路径在组中使用的算法 
默认service-time 0,最短延迟路径
可选round-robin 0,负载分担
可选queue-length 0

path_grouping_policy 定义如何分组
默认failover,仅使用一条,即主备模式
multibus 所有路径同时活跃
group_by_prio 按优先级分组

defaults {
path_grouping_policy "group_by_prio" # 路径分组策略(按优先级分组)
path_checker "tur" # 路径检测方式(Test Unit Ready 命令)
prio "alua" # 优先级算法(ALUA 支持)
rr_weight "priorities" # 轮询权重策略
failback "immediate" # 故障恢复策略(立即切回)
no_path_retry "queue" # 无可用路径时的处理方式(队列请求)
user_friendly_names "no" # 是否使用易读名称(建议关闭)
}

使用devices部分配置多路径

1
2
3
4
5
6
7
8
9
10
11
12
# 为特定存储设备定制参数(覆盖 defaults)
devices {
这是一个设备,匹配VV
device {
vendor "3PARdata" # 匹配 HP 3PAR 存储
product "VV" # 匹配虚拟卷
path_grouping_policy "multibus" # 使用多总线策略
path_checker "readsector0" # 通过读取扇区0检测路径
prio "emc" # 使用 EMC 优先级算法
hardware_handler "1 alua" # 启用 ALUA 支持
}
}

多路径设备的分区操作

使用分区编辑器在多路径设备上创建分区

parted /dev/mapper/mpatha

然后执行udevadm settle等待系统检测到新分区,并在/dev/mapper/下创建关联文件

移除多路径设备

multipath -f 清理所有多路径设备的路径
multipath -F 刷新配置

使用iSCSI创建多路径设备

拓扑

target配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
hostnamectl set-hostname iscsi-target && bash

yum -y install targetcli
lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
fd0 2:0 1 4K 0 disk
sda 8:0 0 10G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 9G 0 part
├─centos-root 253:0 0 8G 0 lvm /
└─centos-swap 253:1 0 1G 0 lvm [SWAP]
sdb 8:16 0 500G 0 disk

将sdb作为后端存储共享出去
targetcli
/> backstores/block create multipath-iscsi dev=/dev/sdb
/> iscsi/ create iqn.2024-08.com.example:block.target
/> iscsi/iqn.2024-08.com.example:block.target/tpg1/luns/ create /backstores/block/multipath-iscsi
/> iscsi/iqn.2024-08.com.example:block.target/tpg1/acls/ create iqn.2024-08.com.example:client.initiator
# 创建监听门户,分别监听两个IP的3260端口
/> cd /iscsi/iqn.2024-08.com.example:block.target/tpg1/portals
/iscsi/iqn.20.../tpg1/portals> delete 0.0.0.0 ip_port=3260
/iscsi/iqn.20.../tpg1/portals> create 10.163.2.125
/iscsi/iqn.20.../tpg1/portals> create 10.163.3.113

/> ls
o- / ......................................................................................... [...]
o- backstores .............................................................................. [...]
| o- block .................................................................. [Storage Objects: 1]
| | o- multipath-iscsi ................................ [/dev/sdb (500.0GiB) write-thru activated]
| | o- alua ................................................................... [ALUA Groups: 1]
| | o- default_tg_pt_gp ....................................... [ALUA state: Active/optimized]
| o- fileio ................................................................. [Storage Objects: 0]
| o- pscsi .................................................................. [Storage Objects: 0]
| o- ramdisk ................................................................ [Storage Objects: 0]
o- iscsi ............................................................................ [Targets: 1]
| o- iqn.2024-08.com.example:block.target .............................................. [TPGs: 1]
| o- tpg1 ............................................................... [no-gen-acls, no-auth]
| o- acls .......................................................................... [ACLs: 1]
| | o- iqn.2024-08.com.example:client.initiator ............................. [Mapped LUNs: 1]
| | o- mapped_lun0 ....................................... [lun0 block/multipath-iscsi (rw)]
| o- luns .......................................................................... [LUNs: 1]
| | o- lun0 ............................ [block/multipath-iscsi (/dev/sdb) (default_tg_pt_gp)]
| o- portals .................................................................... [Portals: 2]
| o- 10.163.2.125:3260 ................................................................ [OK]
| o- 10.163.3.113:3260 ................................................................ [OK]
o- loopback ......................................................................... [Targets: 0]

# 防火墙
firewall-cmd --permanent --add-port=3260/tcp
firewall-cmd --reload

# 开机自启
systemctl enable target --now

initiator配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
# 软件安装
yum -y install iscsi-initiator-utils device-mapper-multipath

# 配置名称
echo "InitiatorName=iqn.2024-08.com.example:client.initiator" > /etc/iscsi/initiatorname.iscsi
systemctl restart iscsid

# 发现并登录target
iscsiadm -m discovery -t st -p 10.163.2.125
10.163.3.113:3260,1 iqn.2024-08.com.example:block.target
10.163.2.125:3260,1 iqn.2024-08.com.example:block.target

iscsiadm -m node -l
Logging in to [iface: default, target: iqn.2024-08.com.example:block.target, portal: 10.163.3.113,3260] (multiple)
Logging in to [iface: default, target: iqn.2024-08.com.example:block.target, portal: 10.163.2.125,3260] (multiple)
Login to [iface: default, target: iqn.2024-08.com.example:block.target, portal: 10.163.3.113,3260] successful.
Login to [iface: default, target: iqn.2024-08.com.example:block.target, portal: 10.163.2.125,3260] successful.

# 已经可以看到有设备了,他们分别被映射到了sdf和sde
ls -l /dev/disk/by-path/
lrwxrwxrwx. 1 root root 9 Aug 19 17:50 ip-10.163.2.125:3260-iscsi-iqn.2024-08.com.example:block.target-lun-0 -> ../../sdf
lrwxrwxrwx. 1 root root 9 Aug 19 17:41 ip-10.163.3.113:3260-iscsi-iqn.2024-08.com.example:block.target-lun-0 -> ../../sde

已知被映射到了sdf和sde,那就要针对这两个设备做管理
# 获取WWIDs
/lib/udev/scsi_id -g -u /dev/sde
3600140581e80dbae13c47a888dd13a2e
/lib/udev/scsi_id -g -u /dev/sdf
3600140581e80dbae13c47a888dd13a2e

# 查看设备厂商信息
cat /sys/block/sde/device/vendor
LIO-ORG
cat /sys/block/sde/device/model
multipath-iscsi

# 配置multipath
cat > /etc/multipath.conf <<'EOF'
defaults {
user_friendly_names yes # 使用易读的设备名 (mpatha, mpathb)
find_multipaths yes # 自动发现多路径设备
}
blacklist {
devnode "^sd[abcd]$" # 排除本地磁盘
devnode "^nvme" # 排除 NVMe 设备
}
blacklist_exceptions {
devnode "^sd[e-f]" # 排除在黑名单外,需要管理的设备,不建议,因为重启会变化
wwid "3600140581e80dbae13c47a888dd13a2e" # 直接使用WWIDs排除
}
devices {
device {
vendor "LIO-ORG" # 自动包含所有LIO设备
product "multipath-iscsi"
path_grouping_policy "failover" # 主备模式
path_checker "tur" # 使用 Test Unit Ready 检查路径
features "0" # 不使用特殊功能
hardware_handler "0" # 无硬件处理器
failback "immediate" # 主路径恢复立即切换回
no_path_retry "fail" # 所有路径失效时立即失败
rr_min_io 100 # 负载均衡: 每路径100个IO后切换
rr_weight "uniform" # 所有路径权重相同
prio "const" # 所有路径优先级相同
}
}

EOF

systemctl restart multipathd
systemctl status multipathd

# 链路聚合模式:
multipath -ll
mpatha (3600140581e80dbae13c47a888dd13a2e) dm-2 LIO-ORG ,multipath-iscsi
size=500G features='0' hwhandler='0' wp=rw
`-+- policy='service-time 0' prio=1 status=active
|- 2:0:0:0 sde 8:64 active ready running
`- 5:0:0:0 sdf 8:80 active ready running

# 主备模式:
multipath -ll
mpatha (3600140581e80dbae13c47a888dd13a2e) dm-2 LIO-ORG ,multipath-iscsi
size=500G features='0' hwhandler='0' wp=rw
|-+- policy='service-time 0' prio=1 status=active
| `- 2:0:0:0 sde 8:64 active ready running
`-+- policy='service-time 0' prio=1 status=enabled
`- 5:0:0:0 sdf 8:80 active ready running

主备模式failover测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
当前active的是sde

# 测试写入
dd if=/dev/zero of=/dev/mapper/mpatha bs=1M count=100 status=progress
104857600 bytes (105 MB) copied, 0.513024 s, 204 MB/s

# 断掉当前活跃链路sde
iscsiadm -m node -T iqn.2024-08.com.example:block.target -p 10.163.3.113 -u
multipath -ll
mpatha (3600140581e80dbae13c47a888dd13a2e) dm-2 LIO-ORG ,multipath-iscsi
size=500G features='0' hwhandler='0' wp=rw
`-+- policy='service-time 0' prio=1 status=active
`- 6:0:0:0 sdf 8:80 active ready running

成功切换为sdf active状态

# 测试写入
dd if=/dev/zero of=/dev/mapper/mpatha bs=1M count=100 status=progress
104857600 bytes (105 MB) copied, 0.299769 s, 350 MB/s
没有问题
CATALOG
  1. 1. dm-multipath介绍
  2. 2. 部署dm-multipath
    1. 2.1. 配置文件参数说明
    2. 2.2. 多路径设备的分区操作
  3. 3. 使用iSCSI创建多路径设备
    1. 3.1. target配置
    2. 3.2. initiator配置
    3. 3.3. 主备模式failover测试