什么是多路径
多路径的意思也就是有多条链路访问i/o块存储设备,每条路径在操作系统中都会被识别为一个独立的块设备,从而造成操作系统和管理员的使用混乱,但是他们往往指向的是同一个块设备,因此需要使用多路径软件来将他们合并为一个设备,避免使用过程中的操作混乱。使用设备映射器多路径(DM Multipath),可以将服务器节点和存储阵列间的多个 I/O 路径配置为单一设备。这些 I/O 路径是可包含独立电缆、交换机和控制器的物理 SAN 连接。
multipath包含的组件
组件 | 描述 |
---|---|
dm_multipath | 内核模块 为路径和路径组群重新路由 I/O 并支持故障切换。 |
mpathconf工具 | 配置并启用设备映射器多路径。 |
multipath 命令 | 列出并配置多路径设备。每当添加块设备时,它也由 udev 执行,以确定该设备是否是多路径设备的一部分。 |
multipathd 守护进程 | 自动创建和删除多路径设备并监控路径;作为路径失败,可以更新多路径设备。允许对多路径设备进行交互式的修改。如果 /etc/multipath.conf 文件有任何更改,请重新加载该服务。 |
kpartx 命令 | 为设备中的分区创建设备映射器设备。当创建了多路径设备以便在其之上创建分区设备时,该命令将由 udev 自动执行。kpartx 命令在其自己的软件包中提供,但 device-mapper-multipath 软件包依赖于它。 |
mpathpersist | 在多路径设备中设置 SCSI-3 持久预留。这个命令的工作方式与 sg_persist 对于 SCSI 设备的工作方式相似,它们不是多路径的,但它会处理在多路径设备的所有路径中设置持久性保留的方法。它与 multipathd 协调,以确保在稍后添加的路径上正确设置保留。要使用此功能,必须在 /etc/multipath.conf 文件中定义 reservation_key 属性。否则 multipathd 守护进程将不会检查新发现的路径或恢复的路径。 |
multipath 命令
multipath 命令用于检测和组合到设备的多个路径。它提供不同的选项来管理您的多路径设备。
下表描述了可能会用到的 multipath 命令的一些选项。
选项 | 描述 |
---|---|
-l | 显示 sysfs 和设备映射器收集的当前多路径拓扑。 |
-ll | 显示来自 sysfs、设备映射器以及系统上所有其他可用组件收集的当前多路径拓扑。 |
-f device | 删除命名的多路径设备。 |
-F | 删除所有未使用的多路径设备。 |
-w device | 从 wwids 文件中删除指定设备的 wwid。 |
-W | 重置 wwids 文件,使其只包含当前的多路径设备。 |
-r | 强制重新载入多路径设备。 |
multipath.conf文件的配置
multipath.conf主要包括blacklist、multipaths、devices三部分的配置
blacklist配置,是多路径设备的黑名单,我们需要将系统盘排除在外
blacklist {
devnode "^sda"
}
Multipaths部分配置multipaths和devices两部分的配置。
multipaths {
multipath {
wwid **** #此值multipath -v3可以看到
alias iscsi-dm0 #映射后的别名,可以随便取
path_grouping_policy multibus #路径组策略
path_selector "round-robin 0" #选择哪条路径进行下一个IO操作的方法
}
}
Devices部分配置
devices {
device {
vendor "iSCSI-Enterprise" #厂商名称
product "Virtual disk" #产品型号
path_grouping_policy multibus #默认的路径组策略
getuid_callout "/sbin/scsi_id -g -u -s /block/%n" #获得唯一设备号使用的默认程序
path_checker readsector0 #决定路径状态的方法
path_selector "round-robin 0" #选择那条路径进行下一个IO操作的方法
failback immediate #故障恢复的模式
no_path_retry queue #在disable queue之前系统尝试使用失效路径的次数的数值
rr_min_io 100 #在当前的用户组中,在切换到另外一条路径之前的IO请求的数目
}
}
实验介绍
这里已经提前使用iSCSI提前挂载好了需要配置多路径的磁盘,如果没有配好环境,从我主页参考iSCSI存储的配置文章。
sda和sdb就是iSCSI存储使用两个IP模拟出的的两条路径。
[root@client ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 40G 1 disk
sdb 8:16 0 40G 1 disk
sr0 11:0 1 3.9G 0 rom /mnt
vda 253:0 0 40G 0 disk
├─vda1 253:1 0 600M 0 part /boot/efi
├─vda2 253:2 0 1G 0 part /boot
└─vda3 253:3 0 38.4G 0 part
├─klas-root 252:0 0 34.4G 0 lvm /
└─klas-swap 252:1 0 4G 0 lvm [SWAP]
查看客户端操作系统中是否安装了multhpath软件,如果没有安装的话使用yum安装一下。
说明:
(1) device-mapper-multipath:即multipath-tools。主要提供multipathd和multipath等工具和 multipath.conf等配置文件。创建的多路径设备会在/dev/mapper中。
(2) device-mapper:主要包括两大部分:内核部分和用户部分。
内核部分主要包括device mapper核心(dm.ko)和一些target driver(md-multipath.ko)。核心完成设备的映射,而target根据映射关系和自身特点具体处理从mappered device 下来的i/o。
用户空间部分主要包括device-mapper这个包。其中包括dmsetup工具和一些帮助创建和配置mappered device的库。这些库主要抽象,封装了与ioctr通信的接口,以便方便创建和配置mappered device。multipath-tool的程序中就需要调用这些库。
(3) dm-multipath.ko和dm.ko:dm.ko是device mapper驱动。它是实现multipath的基础。dm-multipath其实是dm的一个target驱动。
(4) scsi_id: 包含在udev程序包中,可以在multipath.conf中配置该程序来获取scsi设备的序号。通过序号,便可以判断多个路径对应了同一设备。这个是多路径实现的关键。multipath程序在创建multipath设备时,会调用scsi_id,从其标准输出中获得该设备的scsi id。在改写时,需要修改scsi_id程序的返回值为0。因为在multipath程序中,会检查该值来确定scsi id是否已经成功得到。
[root@client ~]# rpm -qa | grep multipath
multipath-tools-help-0.8.4-6.ky10.aarch64
multipath-tools-0.8.4-6.ky10.aarch64
[root@client ~]#
[root@client ~]# yum install device-mapper-multipath
Last metadata expiration check: 0:43:26 ago on Sun 17 Nov 2024 09:21:43 PM CST.
Package multipath-tools-0.8.4-6.ky10.aarch64 is already installed.
Dependencies resolved.
Nothing to do.
Complete!
查看multipathd服务的状态,启动multhpath服务
[root@client ~]# systemctl status multipathd
● multipathd.service - Device-Mapper Multipath Device Controller
Loaded: loaded (/usr/lib/systemd/system/multipathd.service; disabled; vendor preset: enabled)
Active: inactive (dead)
[root@client ~]#
[root@client ~]# lsmod | grep dm_multipath
dm_multipath 262144 2 dm_service_time
[root@client ~]# systemctl start multipathd
[root@client ~]# systemctl status multipathd
● multipathd.service - Device-Mapper Multipath Device Controller
Loaded: loaded (/usr/lib/systemd/system/multipathd.service; disabled; vendor preset: enabled)
Active: active (running) since Sun 2024-11-17 22:44:35 CST; 8s ago
Process: 95603 ExecStartPre=/sbin/modprobe -a scsi_dh_alua scsi_dh_emc scsi_dh_rdac dm-multipath (code=exited, status=0/SUCCESS)
Main PID: 95608 (multipathd)
Status: "up"
Tasks: 7
Memory: 16.6M
CGroup: /system.slice/multipathd.service
└─95608 /sbin/multipathd -d -s
Nov 17 22:44:35 client systemd[1]: Starting Device-Mapper Multipath Device Controller...
Nov 17 22:44:35 client multipathd[95608]: --------start up--------
Nov 17 22:44:35 client multipathd[95608]: read /etc/multipath.conf
Nov 17 22:44:35 client multipathd[95608]: path checkers start up
Nov 17 22:44:35 client multipathd[95608]: 36001405d89fa6a7269340e4a6e9a9a55: load table [0 83886080 multipath 0 1 alua 2 1 service-time 0 1 1 8:0 1 service-time 0 1 1 8:16 1]
Nov 17 22:44:35 client systemd[1]: Started Device-Mapper Multipath Device Controller.
Nov 17 22:44:36 client multipathd[95608]: dm-2: add map (uevent)
[root@client ~]#
使用multipath -ll命令查看多路径设备
sda,sdb设备已经被识别到
[root@client ~]# multipath -ll
36001405d89fa6a7269340e4a6e9a9a55 dm-2 LIO-ORG,test
size=40G features='0' hwhandler='1 alua' wp=ro
|-+- policy='service-time 0' prio=50 status=active
| `- 1:0:0:0 sda 8:0 active ready running
`-+- policy='service-time 0' prio=50 status=enabled
`- 2:0:0:0 sdb 8:16 active ready running
使用mpathconf --enable命令生成配置文件
[root@client ~]# mpathconf --enable
[root@client ~]# cat /etc/multipath.conf
# device-mapper-multipath configuration file
# For a complete list of the default configuration values, run either:
# # multipath -t
# or
# # multipathd show config
# For a list of configuration options with descriptions, see the
# multipath.conf man page.
defaults {
user_friendly_names yes
find_multipaths yes
}
blacklist_exceptions {
property "(SCSI_IDENT_|ID_WWN)"
}
blacklist {
}
修改multipath.conf配置文件
[root@client ~]# cat /etc/multipath.conf
# device-mapper-multipath configuration file
# For a complete list of the default configuration values, run either:
# # multipath -t
# or
# # multipathd show config
# For a list of configuration options with descriptions, see the
# multipath.conf man page.
defaults {
user_friendly_names yes
}
blacklist {
devnode "vd[a]"
}
multipaths{
multipath{
wwid 36001405d89fa6a7269340e4a6e9a9a55 #此值multipath -v3可以看到
alias iscsi-dm0 #映射后的别名,可以随便取
path_grouping_policy multibus #路径组策略
path_selector "round-robin 0" #选择那条路径进行下一个IO操作的方法
}
}
devices {
device {
vendor "iSCSI-Enterprise" #厂商名称
product "Virtual disk" #产品型号
path_grouping_policy multibus #默认的路径组策略
getuid_callout "/sbin/scsi_id -g -u -s /block/%n" #获得唯一设备号使用的默认程序
path_checker readsector0 #决定路径状态的方法
path_selector "round-robin 0" #选择那条路径进行下一个IO操作的方法
failback immediate #故障恢复的模式
no_path_retry queue #在disable queue之前系统尝试使用失效路径的次数的数值
rr_min_io 100 #在当前的用户组中,在切换到另外一条路径之前的IO请求的数目
}
}
重启multhpathd服务,使用multipath -ll查看多路径的状态
[root@client ~]# systemctl restart multipathd
[root@client ~]# multipath -ll
iscsi-dm0 (36001405d89fa6a7269340e4a6e9a9a55) dm-2 LIO-ORG,test
size=40G features='0' hwhandler='1 alua' wp=ro
`-+- policy='round-robin 0' prio=50 status=active
|- 1:0:0:0 sda 8:0 active ready running
`- 2:0:0:0 sdb 8:16 active ready running