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
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]" devnode "^hd[a-z]" devnode "^cciss!c[0-9]d[0-9]" 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" prio "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
| devices { 这是一个设备,匹配VV device { vendor "3PARdata" product "VV" path_grouping_policy "multibus" path_checker "readsector0" prio "emc" hardware_handler "1 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
/> 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
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.
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,那就要针对这两个设备做管理
/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
cat > /etc/multipath.conf <<'EOF' defaults { user_friendly_names yes find_multipaths yes } blacklist { devnode "^sd[abcd]$" devnode "^nvme" } blacklist_exceptions { devnode "^sd[e-f]" wwid "3600140581e80dbae13c47a888dd13a2e" } devices { device { vendor "LIO-ORG" product "multipath-iscsi" path_grouping_policy "failover" path_checker "tur" features "0" hardware_handler "0" failback "immediate" no_path_retry "fail" rr_min_io 100 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
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 没有问题
|