自学内容网 自学内容网

Linux 多路径Multipath学习

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由多条路径可以选择,那么就有以下问题需要解决:

  1. 每条路径如何表达?
  2. I/O流量如何选择路径?
  3. 流量如何在多条路径之间分配?(负载均衡)
  4. 其中一条路径坏掉了,如何处理? (高可用)

第一条比较简单,每条路径,让操作系统把每条路径识别成独立的磁盘即可,这两个识别出的磁盘实际上只是通向同一个物理盘的不同路径而已,如下图:

在这里插入图片描述

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自己选择和判断,太麻烦了,还不方便

在这里插入图片描述

于是技术人员编写了一个中间层软件,专门解决

  1. 每条路径如何表达?
  2. I/O流量如何选择路径?
  3. 流量如何在多条路径之间分配?(负载均衡)
  4. 其中一条路径坏掉了,如何处理? (高可用)

这几个问题,这就是多路径技术。

多路径技术其中之一就叫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)设备,帮助开发者进行调试和测试相关的存储驱动程序等。

  1. 用途
    • 驱动开发与测试:在开发 SCSI 设备驱动时,scsi_debug可以模拟各种 SCSI 设备的行为。例如,存储设备制造商可以利用它来测试新的磁盘驱动程序,确保驱动能够正确地处理 SCSI 命令。通过模拟不同的设备状态和响应,可以发现驱动在处理正常和异常情况(如设备错误、命令超时等)时的潜在问题。
    • 内核调试:对于 Linux 内核开发人员来说,scsi_debug有助于调试与 SCSI 子系统相关的内核代码。可以模拟出复杂的 I/O 场景,比如模拟大量的并发 I/O 请求,以检查内核中的 SCSI 调度程序是否能够正确地管理和优化这些请求。
  2. 工作原理
    • 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
# -rreload重启
# -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

 
 
 
 
 


原文地址:https://blog.csdn.net/D1179869625/article/details/145150014

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!