多路径Multipath
概述
多路径(Multipath)技术,特别是在存储系统中,是一种提高可靠性和性能的重要手段。多路径技术允许服务器通过多条物理路径连接到存储设备。这些路径可以是包含独立电缆、交换机和控制器的物理SAN连接。
多路径技术主要实现以下功能:
-
故障切换与恢复:通过提供路径冗余,当某条路径出现故障时,系统可以自动切换到其他备用路径,确保数据访问的连续性。
-
负载均衡:可以将I/O操作以轮询(round-robin)或其他方式分布到所有路径中,从而优化存储设备的性能。
-
磁盘虚拟化:将多个物理磁盘设备虚拟化为一个或多个逻辑设备,简化存储管理。
技术原理与组件
-
Device Mapper:Device Mapper是Linux内核中的一个组件,它提供了设备映射的框架。多路径(DM-Multipath)是Device Mapper的一个目标(target)驱动,用于实现多路径功能。
-
multipathd守护进程:该守护进程负责监控路径状态,并根据配置文件中定义的策略进行故障切换和负载均衡。
-
multipath.conf配置文件:该文件用于定义多路径设备的配置,包括黑名单、默认设置、多路径设备和设备设置等。
配置与管理
在Linux系统中,配置多路径通常涉及以下步骤:
-
安装多路径软件:在RHEL/CentOS系统中,可以使用
yum
或dnf
命令安装device-mapper-multipath
软件包。在Ubuntu系统中,可以使用apt-get
命令安装multipath-tools
和multipath-tools-boot
软件包。 -
创建或修改配置文件:默认情况下,可能没有
/etc/multipath.conf
配置文件。可以使用mpathconf
命令生成配置文件,或者从模板文件中复制。配置文件定义了哪些设备应该被多路径处理,以及如何处理它们。 -
启动multipathd服务:使用
systemctl
命令启动并设置multipathd服务为自动启动。 -
验证配置:使用
multipath -ll
命令查看多路径设备的状态和配置。
实验
在vm1和vm2上各添加一张网卡(仅主机、桥接、nat都可以)
此处添加了仅主机网卡:dhcp获取地址(实际环境静态配置)
Vm1:
Ens160:192.168.99.132
Ens224:192.168.139.136
Vm2:
Ens160:192.168.99.131
Ens224:192.168.139.137
创建iscsi共享
[root@vm1 ~]# setenforce 0
[root@vm1 ~]# firewall-cmd --set-default-zone=trusted
[root@vm1 Desktop]# du -sh /file1
100M /file1
[root@vm1 Desktop]#
重启服务
[root@vm1 ~]# systemctl restart target #默认监听所有网卡的3260端口
vm2使用两张网卡分别登录
[root@vm2 ~]# iscsiadm -m discovery -t st -p 192.168.99.132
192.168.99.132:3260,1 iqn.2024-04.com.test:server
[root@vm2 ~]# iscsiadm -m discovery -t st -p 192.168.139.136
192.168.139.136:3260,1 iqn.2024-04.com.test:server
[root@vm2 ~]#
注:此时一个共享,通过两个路径登录,会被识别为两个设备,但实际上是一个设备
配置设备映射器多路径
使用设备映射器多路径(DM Multipath),您可以将服务器节点和存储阵列间的多个 I/O 路径配置为单一设备。这些 I/O 路径是可包含独立电缆、交换机和控制器的物理 SAN 连接。
多路径聚合了 I/O 路径并生成由聚合路径组成的新设备。
DM 多路径提供:
-
冗余
DM 多路径可在主动/被动(active/passive)配置中提供故障切换。在主动/被动配置中,任何时候路径的子集都只用于 I/O 。如果 I/O 路径的任何元素(如电缆、交换机或控制器)出现故障,DM 多路径会切换到备用路径。
-
改进的性能
可将 DM 多路径配置为主动/主动模式,其中将 I/O 以轮循(round-robin)方式分布到所有路径中。在某些配置中,DM-Multipath 可以检测 I/O 路径上的加载,并动态重新平衡负载。
vm2先登出
# 安装相应软件包
[root@vm2 ~]# yum -y install device-mapper-multipath
您可以使用 mpathconf
工具设置 DM 多路径。这个工具会根据以下情况创建或编辑 /etc/multipath.conf
多路径配置文件:
-
如果
/etc/multipath.conf
文件已存在,则mpathconf
实用程序将编辑该文件。 -
如果
/etc/multipath.conf
文件不存在,则mpathconf
实用程序将从头开始创建/etc/multipath.conf
文件。
# 生成配置文件:
[root@vm2 ~]# ls /etc/multipath/
[root@vm2 ~]# find / -name "multipath.conf"
/usr/lib/tmpfiles.d/multipath.conf
/usr/share/doc/device-mapper-multipath/multipath.conf
[root@vm2 ~]# cat /usr/share/doc/device-mapper-multipath/multipath.conf #配置示例
# 可以直接将上述文件复制到/etc/下
# 也可以使用命令生成:
[root@vm2 ~]# mpathconf --enable
[root@vm2 ~]# ls /etc/multipath.conf
/etc/multipath.conf
[root@vm2 ~]# iscsiadm -m node -T iqn.2024-04.com.test:server -l 登录
[root@vm2 ~]# lsblk /dev/sd*
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 100M 0 disk
└─sda1 8:1 0 50M 0 part
sda1 8:1 0 50M 0 part
sdb 8:16 0 100M 0 disk
└─sdb1 8:17 0 50M 0 part
sdb1 8:17 0 50M 0 part
[root@vm2 ~]#
# 获取设备wwid:systemd-udev包提供/usr/lib/udev/scsi_id
[root@vm2 ~]# ls /usr/lib/udev/scsi_id
/usr/lib/udev/scsi_id
[root@vm2 ~]# ln -s /usr/lib/udev/scsi_id /usr/bin/scsi_id
[root@vm2 ~]# scsi_id --whitelisted --device=/dev/sda
36001405f6d0773377df44baaaa4ffac1
[root@vm2 ~]# scsi_id --whitelisted --device=/dev/sdb
36001405f6d0773377df44baaaa4ffac1
[root@vm2 ~]#
# sda和sdb的wwid一致,证明是同一个设备
# 修改配置文件如下:
[root@vm2 ~]# vim /etc/multipath.conf
[root@vm2 ~]# cat /etc/multipath.conf
defaults {user_friendly_names yesfind_multipaths yesenable_foreign "^$"
}
blacklist_exceptions {property "(SCSI_IDENT_|ID_WWN)"
}
blacklist {
}
multipaths {multipath {wwid 36001405f6d0773377df44baaaa4ffac1alias blue}
}
[root@vm2 ~]#
# 可以使用multipathd show config或multipath -t查看默认配置的值:
[root@vm2 ~]# multipath -t 输出略
# 重启服务
[root@vm2 ~]# systemctl restart multipathd.service
验证
[root@vm2 ~]# lsblk /dev/sd*
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 100M 0 disk
└─blue 253:3 0 100M 0 mpath └─blue1 253:4 0 50M 0 part
sdb 8:16 0 100M 0 disk
└─blue 253:3 0 100M 0 mpath └─blue1 253:4 0 50M 0 part
[root@vm2 ~]#
# 使用多路径设备挂载测试:
[root@vm2 ~]# ll /dev/mapper/blue
lrwxrwxrwx. 1 root root 7 Apr 29 09:28 /dev/mapper/blue -> ../dm-3
[root@vm2 ~]# ll /dev/mapper/blue1
lrwxrwxrwx. 1 root root 7 Apr 29 09:28 /dev/mapper/blue1 -> ../dm-4
[root@vm2 ~]# mount /dev/mapper/blue1 /mnt
[root@vm2 ~]# ls /mnt/
vm2.txt
[root@vm2 ~]# multipath -ll
blue (36001405f6d0773377df44baaaa4ffac1) dm-3 LIO-ORG,file1
size=100M features='0' hwhandler='1 alua' wp=rw
|-+- policy='service-time 0' prio=50 status=active
| `- 2:0:0:0 sda 8:0 active ready running
`-+- policy='service-time 0' prio=50 status=enabled`- 3:0:0:0 sdb 8:16 active ready running
[root@vm2 ~]#
# 测试关闭vm2的ens224网卡:
[root@vm2 ~]# nmcli connection down ens224
Connection 'ens224' successfully deactivated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/4)
[root@vm2 ~]#
[root@vm2 ~]# multipath -ll
blue (36001405f6d0773377df44baaaa4ffac1) dm-3 LIO-ORG,file1
size=100M features='0' hwhandler='1 alua' wp=rw
|-+- policy='service-time 0' prio=50 status=active
| `- 2:0:0:0 sda 8:0 active ready running
`-+- policy='service-time 0' prio=50 status=enabled`- 3:0:0:0 sdb 8:16 active ready running
[root@vm2 ~]#
[root@vm2 ~]# touch /mnt/test.txt 可以正常读写
[root@vm2 ~]# echo 123 > /mnt/test.txt
[root@vm2 ~]# cat /mnt/test.txt
123
[root@vm2 ~]# nmcli connection down ens160
[root@vm2 ~]# multipath -ll
blue (36001405f6d0773377df44baaaa4ffac1) dm-3 LIO-ORG,file1
size=100M features='0' hwhandler='1 alua' wp=rw
|-+- policy='service-time 0' prio=0 status=active
| `- 2:0:0:0 sda 8:0 failed faulty running
`-+- policy='service-time 0' prio=0 status=enabled`- 3:0:0:0 sdb 8:16 active faulty running
[root@vm2 ~]#
[root@vm2 ~]# nmcli connection up ens224
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/7)
[root@vm2 ~]# multipath -ll
blue (36001405f6d0773377df44baaaa4ffac1) dm-3 LIO-ORG,file1
size=100M features='0' hwhandler='1 alua' wp=rw
|-+- policy='service-time 0' prio=0 status=enabled
| `- 2:0:0:0 sda 8:0 failed faulty running
`-+- policy='service-time 0' prio=50 status=active`- 3:0:0:0 sdb 8:16 active ready running
[root@vm2 ~]#
[root@vm2 ~]# nmcli connection up ens160
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/8)
[root@vm2 ~]# multipath -ll
blue (36001405f6d0773377df44baaaa4ffac1) dm-3 LIO-ORG,file1
size=100M features='0' hwhandler='1 alua' wp=rw
|-+- policy='service-time 0' prio=50 status=enabled
| `- 2:0:0:0 sda 8:0 active ready running
`-+- policy='service-time 0' prio=50 status=active`- 3:0:0:0 sdb 8:16 active ready running
[root@vm2 ~]#
# 此时默认是主备的状态
配置算法为轮询
[root@vm2 ~]# cat /etc/multipath.conf | grep -v ^# | grep -v ^$
defaults {user_friendly_names yesfind_multipaths yesenable_foreign "^$"
}
blacklist_exceptions {property "(SCSI_IDENT_|ID_WWN)"
}
blacklist {
}
multipaths {multipath {wwid 36001405f6d0773377df44baaaa4ffac1alias bluepath_grouping_policy multibuspath_checker readsector0path_selector "round-robin 0"rr_weight prioritiesno_path_retry 5}
}
[root@vm2 ~]# systemctl restart multipathd.service
[root@vm2 ~]# multipath -ll
Apr 29 14:12:20 | /etc/multipath.conf line 28, invalid keyword in the multipath section: path_checker
blue (36001405f6d0773377df44baaaa4ffac1) dm-3 LIO-ORG,file1
size=100M features='1 queue_if_no_path' hwhandler='1 alua' wp=rw
`-+- policy='round-robin 0' prio=50 status=enabled|- 2:0:0:0 sda 8:0 active ready running`- 3:0:0:0 sdb 8:16 active ready running
[root@vm2 ~]#
[root@vm2 ~]# cat /etc/multipath.conf | grep path_grouping_policy#path_grouping_policy multibus 注释此行
[root@vm2 ~]#
[root@vm2 ~]# multipath -ll
Apr 29 14:13:45 | /etc/multipath.conf line 28, invalid keyword in the multipath section: path_checker
blue (36001405f6d0773377df44baaaa4ffac1) dm-3 LIO-ORG,file1
size=100M features='1 queue_if_no_path' hwhandler='1 alua' wp=rw
|-+- policy='round-robin 0' prio=50 status=enabled
| `- 2:0:0:0 sda 8:0 active ready running
`-+- policy='round-robin 0' prio=50 status=enabled`- 3:0:0:0 sdb 8:16 active ready running
[root@vm2 ~]#
具体配置含义参考:配置设备映射器多路径 | Red Hat Product Documentation
作业
准备两台虚拟机vm1、vm2,各两张网卡,vm1添加一块20G的硬盘
-
vm1创建1个200M的文件,创建一个分区(用第二块硬盘) 配置iscsi target目标,共享文件和分区,acl自定义
-
在客户端,配置多路径,发现并登录共享,要求共享的文件识别为mpatha,以主备的形式存在,共享的分区识别为mpathb,path_grouping_policy使用multibus,path_selector使用round-robin 0 格式化并挂载mpatha到自己创建的目录中,测试目录可写 格式化并挂载mpathb到指定目录中,使mariadb的数据存储在vm1中。
-
配置mpatha和mpathb的持久挂载。