文章目录
- Linux 多路径Multipath学习
- 1. 简介
- 1.1 Multipath I/O 技术
- 2. Multipath安装与使用
- 2.1 安装
- 2.2 启动
- 3. scsi设备模拟器scsi_debug
- 3.1 简介
- 3.2 加载 scsi_debug
- 3.3 查看 scsi_id
- 3.4 配置多个模拟设备
- 3.5 聚合多路径
- 4. 删除聚合和单设备
- 4.1 删除mpath
- 4.2 删除 scsi 设备
Linux 多路径Multipath学习
参考文档:https://blog.csdn.net/bandaoyu/article/details/138010001
B站视屏:https://www.bilibili.com/video/BV1UP4y1g7Zc/?spm_id_from=333.1387.homepage.video_card.click&vd_source=dd77faf7fb5fc21ed5955c2317119153
1. 简介
- 什么是多路径?
普通的电脑主机都是一个硬盘挂接到一个总线上,这里是一对一的关系。
而到了分布式环境,主机和存储网络连接,中间每一层可能存在多块网卡,多个交换机可选,就构成了多对多的关系。
也就是说,主机到存储可以有多条路径可以选择。主机到存储之间的IO由多条路径可以选择,那么就有以下问题需要解决:
- 每条路径如何表达?
- I/O流量如何选择路径?
- 流量如何在多条路径之间分配?(负载均衡)
- 其中一条路径坏掉了,如何处理? (高可用)
第一条比较简单,每条路径,让操作系统把每条路径识别成独立的磁盘即可,这两个识别出的磁盘实际上只是通向同一个物理盘的不同路径而已,如下图:
IO 可以从两张网卡中的任意一张到达存储设备RDID A,也就是有2条路径,把这两条路径设备成/dev/hba1 和/dev/hba2 两块盘. 选择其中一块盘写数据即可. 实际都是向RDID A写数据. 对磁盘/dev/hba1就是走绿色那条路径,对/dev/hba2写就是走蓝色那条路径
lsblk 会看到下面的输出 sdd,sde,sdf,sdg
四块盘实际指向的是同一个物理存储设备 253:3 映射为多路径设备mpatha
那么 2. I/O流量如何选择路径? 3. 流量如何在多条路径之间分配?(负载均衡) 4. 其中一条路径坏掉了,如何处理? (高可用) 这些问题怎么解决 这就需要多路径出场了。
1.1 Multipath I/O 技术
当服务器到某一存储设备有多条路径时,每条路径都会识别为一个单独的设备,下IO时,要写哪个设备(既走哪条路径),然后故障时的切换和恢复,IO流量的负载均衡等,都要applicantion自己选择和判断,太麻烦了,还不方便
于是技术人员编写了一个中间层软件,专门解决
- 每条路径如何表达?
- I/O流量如何选择路径?
- 流量如何在多条路径之间分配?(负载均衡)
- 其中一条路径坏掉了,如何处理? (高可用)
这几个问题,这就是多路径技术。
多路径技术其中之一就叫Multipath(linux上的主流),把选择哪条路故障时的切换和恢复,IO流量的负载均衡等径Multipath帮你搞定,applicantion全程无感知,对Multipath模拟出来的设备下IO即可,就像写一个普通的盘一样
2. Multipath安装与使用
参考文旦:
https://blog.csdn.net/u011436427/article/details/113662832
https://www.cnblogs.com/fy054/p/16376654.html
2.1 安装
当前大多数
linux
中已经默认安装了multipath
# 安装multipath
yum install device-mapper-multipath
rpm -qa | grep device-mapper-multipath
2.2 启动
安装之后如果直接启动则会报错,提示在
/etc/
目录下没有multipath.conf
文件
安装
multipath
之后会默认生成multipath.conf
文件,可以使用find
命令查找
# 查找文件
[root@localhost ~]# find / -name multipath.conf
/usr/share/doc/device-mapper-multipath-0.4.9/multipath.conf
# 将文件 cp 到 /etc 目录下
[root@localhost ~]# cp /usr/share/doc/device-mapper-multipath-0.4.9/multipath.conf /etc/
# 启动 multipath
[root@localhost ~]# systemctl start multipathd
3. scsi设备模拟器scsi_debug
3.1 简介
scsi_debug
是 Linux 内核中的一个模块,主要用于模拟 SCSI(Small Computer System Interface)设备,帮助开发者进行调试和测试相关的存储驱动程序等。
- 用途
- 驱动开发与测试:在开发 SCSI 设备驱动时,
scsi_debug
可以模拟各种 SCSI 设备的行为。例如,存储设备制造商可以利用它来测试新的磁盘驱动程序,确保驱动能够正确地处理 SCSI 命令。通过模拟不同的设备状态和响应,可以发现驱动在处理正常和异常情况(如设备错误、命令超时等)时的潜在问题。- 内核调试:对于 Linux 内核开发人员来说,
scsi_debug
有助于调试与 SCSI 子系统相关的内核代码。可以模拟出复杂的 I/O 场景,比如模拟大量的并发 I/O 请求,以检查内核中的 SCSI 调度程序是否能够正确地管理和优化这些请求。- 工作原理
- 当
scsi_debug
模块被加载到内核中时,它会创建虚拟的 SCSI 设备。这些设备在操作系统层面看起来就像真实的 SCSI 设备一样,有自己的设备标识符(如 LUN - Logical Unit Number)。- 它能够模拟 SCSI 命令的执行过程。例如,当操作系统发送一个读取磁盘扇区的 SCSI 命令时,
scsi_debug
可以根据预先设定的规则生成相应的响应数据,就好像是从真实的磁盘中读取到的数据一样。它可以模拟不同类型的 SCSI 设备的命令集,包括磁盘、磁带等多种存储设备。
3.2 加载 scsi_debug
scsi_debug
属于内核的一个模块,可以先检查内核是否加载了这个模块
# 检查
[root@localhost ~]# lsmod | grep scsi_debug
# 加载模块
[root@localhost ~]# modprobe scsi_debug
# 检查
[root@localhost ~]# lsmod | grep scsi_debug
scsi_debug 84972 0
crc_t10dif 12912 2 scsi_debug,sd_mod
# 测试完成之后可以使用 rmmod scsi_debug 卸载
rmmod scsi_debug
# 加载完成之后会多一个模拟设备,如下图所示 sdb,如果是需要聚合,显然一个模拟一个设备是不够的,稍后在进行配置。
3.3 查看 scsi_id
# 可以通过 scsi_id 命令查看 wwid
[root@localhost ~]# /usr/lib/udev/scsi_id -g --page=0x83 /dev/sdb
35333333000001f40
# 或者通过 lsscsi 命令查看
[root@localhost ~]# lsscsi -i
[1:0:0:0] cd/dvd NECVMWar VMware IDE CDR10 1.00 /dev/sr0 -
[2:0:0:0] disk VMware, VMware Virtual S 1.0 /dev/sda -
[3:0:0:0] disk Linux scsi_debug 0004 /dev/sdb 35333333000001f40
3.4 配置多个模拟设备
修改配置文件内容
注意:测试验证时先修改
vpd_use_hostno
文件,在修改add_host
文件内容,下图中顺序反了,不然就会生成4个不同的wwid
的模拟设备
3.5 聚合多路径
# 查看多路径聚合信息,这里是把上面的 wwid 相同的 sdc,sdd,sde,sdf 聚合在一起
[root@localhost scsi_debug]# multipath -ll
mpatha (353333330000007d0) dm-2 Linux ,scsi_debug
size=8.0M features='0' hwhandler='0' wp=rw
|-+- policy='service-time 0' prio=1 status=enabled
| `- 26:0:0:0 sdc 8:32 active ready running
|-+- policy='service-time 0' prio=1 status=enabled
| `- 27:0:0:0 sdd 8:48 active ready running
|-+- policy='service-time 0' prio=1 status=enabled
| `- 28:0:0:0 sde 8:64 active ready running
`-+- policy='service-time 0' prio=1 status=enabled
`- 29:0:0:0 sdf 8:80 active ready running
# sdb 的没有聚合,可以通过命令查看日志,sdb 的 wwid 没有在配置文件中,所以跳过了 sdb
# -r reload重启
# -v3 查看重启日志
multipath -r -v3
[root@localhost scsi_debug]# lsscsi -i
[1:0:0:0] cd/dvd NECVMWar VMware IDE CDR10 1.00 /dev/sr0 -
[2:0:0:0] disk VMware, VMware Virtual S 1.0 /dev/sda -
[25:0:0:0] disk Linux scsi_debug 0004 /dev/sdb 3533333300000cb20
[26:0:0:0] disk Linux scsi_debug 0004 /dev/sdc 353333330000007d0
[27:0:0:0] disk Linux scsi_debug 0004 /dev/sdd 353333330000007d0
[28:0:0:0] disk Linux scsi_debug 0004 /dev/sde 353333330000007d0
[29:0:0:0] disk Linux scsi_debug 0004 /dev/sdf 353333330000007d0
[root@localhost scsi_debug]# multipath -a 3533333300000cb20
wwid '3533333300000cb20' added
# 上面使用命令添加的 wwid 到 wwids 文件中
[root@localhost ~]# find / -name wwids
/etc/multipath/wwids
[root@localhost ~]# cat /etc/multipath/wwids
# Multipath wwids, Version : 1.0
# NOTE: This file is automatically maintained by multipath and multipathd.
# You should not need to edit this file in normal circumstances.
#
# Valid WWIDs:
/353333330000007d0/
/3533333300000cb20/
4. 删除聚合和单设备
# 删除设备一般选择 -f 参数,-F 参数是删除所有设备
[root@localhost ~]# multipath -h
multipath-tools v0.4.9 (05/33, 2016)
Usage:
multipath [-a|-A|-c|-w|-W] [-d] [-T tm:val] [-r] [-i] [-v lvl] [-p pol] [-b fil] [-q] [dev]
multipath -l|-ll|-f [-v lvl] [-b fil] [dev]
multipath -F [-v lvl]
multipath -t
multipath -h
Where:
-h print this usage text
-l show multipath topology (sysfs and DM info)
-ll show multipath topology (maximum info)
-f flush a multipath device map
-F flush all multipath device maps
-a add a device wwid to the wwids file
-A add devices from kernel command line mpath.wwids
parameters to wwids file
-c check if a device should be a path in a multipath device
-T tm:val
check if tm matches the multipathd timestamp. If so val is
whether or not the device is a path in a multipath device
-q allow queue_if_no_path when multipathd is not running
-d dry run, do not create or update devmaps
-t dump internal hardware table
-r force devmap reload
-i ignore wwids file
-B treat the bindings file as read only
-b fil bindings file location
-w remove a device from the wwids file
-W reset the wwids file include only the current devices
-p pol force all maps to specified path grouping policy :
. failover one path per priority group
. multibus all paths in one priority group
. group_by_serial one priority group per serial
. group_by_prio one priority group per priority lvl
. group_by_node_name one priority group per target node
-v lvl verbosity level
. 0 no output
. 1 print created devmap names only
. 2 default verbosity
. 3 print debug information
dev action limited to:
. multipath named 'dev' (ex: mpath0) or
. multipath whose wwid is 'dev' (ex: 60051..)
. multipath including the path named 'dev' (ex: /dev/sda)
. multipath including the path with maj:min 'dev' (ex: 8:0)
4.1 删除mpath
[root@localhost ~]# multipath -ll
mpathb (3533333300000cb20) dm-3 Linux ,scsi_debug
size=8.0M features='0' hwhandler='0' wp=rw
`-+- policy='service-time 0' prio=1 status=active
`- 25:0:0:0 sdb 8:16 active ready running
mpatha (353333330000007d0) dm-2 Linux ,scsi_debug
size=8.0M features='0' hwhandler='0' wp=rw
|-+- policy='service-time 0' prio=1 status=enabled
| `- 26:0:0:0 sdc 8:32 active ready running
|-+- policy='service-time 0' prio=1 status=enabled
| `- 27:0:0:0 sdd 8:48 active ready running
|-+- policy='service-time 0' prio=1 status=enabled
| `- 28:0:0:0 sde 8:64 active ready running
`-+- policy='service-time 0' prio=1 status=enabled
`- 29:0:0:0 sdf 8:80 active ready running
[root@localhost ~]# multipath -f mpathb
[root@localhost ~]#
[root@localhost ~]# multipath -ll
mpatha (353333330000007d0) dm-2 Linux ,scsi_debug
size=8.0M features='0' hwhandler='0' wp=rw
|-+- policy='service-time 0' prio=1 status=enabled
| `- 26:0:0:0 sdc 8:32 active ready running
|-+- policy='service-time 0' prio=1 status=enabled
| `- 27:0:0:0 sdd 8:48 active ready running
|-+- policy='service-time 0' prio=1 status=enabled
| `- 28:0:0:0 sde 8:64 active ready running
`-+- policy='service-time 0' prio=1 status=enabled
`- 29:0:0:0 sdf 8:80 active ready running
4.2 删除 scsi 设备
mpath删除之后 scsi 设备还是在的,所以还需要删除 scsi
[root@localhost ~]# lsscsi
[1:0:0:0] cd/dvd NECVMWar VMware IDE CDR10 1.00 /dev/sr0
[2:0:0:0] disk VMware, VMware Virtual S 1.0 /dev/sda
[25:0:0:0] disk Linux scsi_debug 0004 /dev/sdb
[26:0:0:0] disk Linux scsi_debug 0004 /dev/sdc
[27:0:0:0] disk Linux scsi_debug 0004 /dev/sdd
[28:0:0:0] disk Linux scsi_debug 0004 /dev/sde
[29:0:0:0] disk Linux scsi_debug 0004 /dev/sdf
# 在每一个 scsi 设备下都会有这样一个文件 /sys/block/scsiName/device/delete
[root@localhost ~]# ll /sys/block/sdb/device/delete
--w-------. 1 root root 4096 Jan 14 06:12 /sys/block/sdb/device/delete
# 删除方式
echo 1 > /sys/block/sdb/device/delete
# 批量删除 lsscsi | grep scsi_debug | awk '{print $NF}' | awk -F/ '{print $NF}' | while read line;do echo 1 > /sys/block/${line}/device/delete;done