Linux 多路径Multipath学习

news2025/1/15 17:37:45

文章目录

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

  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
# -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

 
 
 
 
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2277115.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

浅谈云计算06 | 云管理系统架构

云管理系统架构 一、云管理系统架构(一)远程管理系统(二)资源管理系统(三)SLA 管理系统(四)计费管理系统 二、安全与可靠性保障(一)数据安全防线(…

Observability:利用 GCP Vertex AI 集成提升 LLM 可观察性

作者:来自 Elastic Ishleen Kaur•Muthukumar Paramasivam 随着组织越来越多地将 LLM 用于内容创建、检索增强生成 (Retrieval-Augmented Generation - RAG) 和数据分析等 AI 应用,SRE 和开发人员面临着新的挑战。监控工作流、分析输入和输出、管理查询延…

Node.js - Express框架

1. 介绍 Express 是一个基于 Node.js 的 Web 应用程序框架,主要用于快速、简便地构建 Web 应用程序 和 API。它是目前最流行的 Node.js Web 框架之一,具有轻量级、灵活和功能丰富的特点。 核心概念包括路由,中间件,请求与响应&a…

Linux Top 命令 load average 指标解读

前言 作为平台开发的同学,维护平台稳定性是我们最基本的工作职责,下面主要介绍下top 命令里 ,load average 这个指标如何去衡量机器负载程度。 概念介绍 load average 是系统在过去 1 分钟、5 分钟、15 分钟 的平均负载,它表示运…

【大数据】机器学习------神经网络模型

一、神经网络模型 1. 基本概念 神经网络是一种模拟人类大脑神经元结构的计算模型,由多个神经元(节点)组成,这些节点按照不同层次排列,通常包括输入层、一个或多个隐藏层和输出层。每个神经元接收来自上一层神经元的输…

【day5】Redis持久化之AOF + Redis事务_锁机制

AOF是什么 以日志的形式来记录每个写操作(增量保存),将 Redis 执行过的所有写指令记录下来(比 如 set/del 操作会记录, 读操作 get 不记录 只许追加文件但不可以改写文件 redis 启动之初会读取该文件重新构建数据 redis 重启的话就根据日志文件的内容将写指令从前到…

【Python】Python之locust压测教程+从0到1demo:基础轻量级压测实战(1)

文章目录 一、什么是Locust二、Locust 架构组成三、实战 Demo准备一个可调用的接口编写一个接口测试用例编写一个性能测试用例执行性能测试用例代码1、通过 Web UI 执行(GUI模式)2、通过命令行执行(非GUI模式) 小知识:…

Jaeger UI使用、采集应用API排除特定路径

Jaeger使用 注: Jaeger服务端版本为:jaegertracing/all-in-one-1.6.0 OpenTracing版本为:0.33.0,最后一个版本,停留在May 06, 2019。最好升级到OpenTelemetry。 Jaeger客户端版本为:jaeger-client-1.3.2。…

基于Python机器学习、深度学习技术提升气象、海洋、水文领域实践应用-以ENSO预测为例讲解

1. 背景与目标 ENSO(El Nio-Southern Oscillation)是全球气候系统中最显著的年际变率现象之一,对全球气候、农业、渔业等有着深远的影响。准确预测ENSO事件的发生和发展对于减灾防灾具有重要意义。近年来,深度学习技术在气象领域…

【IDEA 2024】学习笔记--文件选项卡

在我们项目的开发过程中,由于项目涉及的类过多,以至于我们会打开很多的窗口。使用IDEA默认的配置,个人觉得十分不便。 目录 一、设置多个文件选项卡按照文件字母顺序排列 二、设置多个文件选项卡分行显示 一、设置多个文件选项卡按照文件字…

nginx的可视化配置工具nginxWebUI的使用

文章目录 1、nginx简介2、nginxWebUI2.1、技术解读2.2、开源版和专业版之间的区别2.3、功能解读 3、安装与使用3.1、下载镜像3.2、查看镜像3.3、启动容器3.4、使用 4、总结 1、nginx简介 Nginx 是一个高效的 HTTP 服务器和反向代理,它擅长处理静态资源、负载均衡和…

qt vs ios开发应用环境搭建和上架商店的记录

qt 下载链接如下 https://download.qt.io/new_archive/qt/5.14/5.14.2/qt-opensource-mac-x64-5.14.2.dmg 安装选项全勾选就行,这里特别说明下qt5.14.2/qml qt5.14.2对qml支持还算成熟,但很多特性还得qt6才行,这里用qt5.14.2主要是考虑到服…

系统思考—全局思维

在一个复杂的企业中,无论是生产、营销、研发、产品还是采购,作为核心团队,大家不只关注单一的问题——需要从整体出发。企业是一个有机的整体,每一个环节都息息相关。如果只解决一个问题,却忽视了其他部分的相互作用&a…

软件设计师 - 第10章 网络与信息安全基础知识

网络概述 功能:数据通信,资源共享,管理集中化,实现分布式处理,负载均衡 分类:局域网,城域网,广域网 拓扑结构:总线型,星型,环型,树型,分布式 ISO/OSI七层模型: 应用层:提供与用户交互的界面,并支持特定应用程序的服务,FTP、Telnet、SMTP、NFS、SNMP、HTTP、…

记录一次Android Studio的下载、安装、配置

目录 一、下载和安装 Android Studio 1、搜索下载Android studio ​2、下载成功后点击安装包进行安装: 3、这里不用打勾,直接点击安装 : 4、完成安装: 5、这里点击Cancel就可以了 6、接下来 7、点击自定义安装&#xff1a…

自定义注解使用AspectJ切面和SpringBoot的Even事件优雅记录业务接口及第三方接口调用日志实现思路

自定义注解使用AspectJ切面和SpringBoot的Even事件优雅记录业务接口及第三方接口调用日志实现思路 文章目录 1.前言2.思路2.1使用ELK收集日志2.1.1ELK搭建2.1.2项目中集成ELK日志收集2.1.2.1 引入依赖2.1.2.2 logback-xxx.xml配置2.1.2.3 yaml配置 2.2本文思路2.2.1书接上文--自…

Windows 正确配置android adb调试的方法

下载适用于 Windows 的 SDK Platform-Tools https://developer.android.google.cn/tools/releases/platform-tools?hlzh-cn 设置系统变量,路径为platform-tools文件夹的绝对路径 点击Path添加环境变量 %adb%打开终端输入adb shell 这就成功了!

保姆级图文详解:Linux和Docker常用终端命令

文章目录 前言1、Docker 常用命令1.1、镜像管理1.2、容器管理1.3、网络管理1.4、数据卷管理1.5、监控和性能管理 2、Linux 常用命令分类2.1、文件和目录管理2.2、用户管理2.3、系统监控和性能2.4、软件包管理2.5、网络管理 前言 亲爱的家人们,技术图文创作很不容易…

相机SD卡照片数据不小心全部删除了怎么办?有什么方法恢复吗?

前几天,小编在后台友收到网友反馈说他在整理相机里的SD卡,原本是想把那些记录着美好瞬间的照片导出来慢慢欣赏。结果手一抖,不小心点了“删除所有照片”,等他反应过来,屏幕上已经显示“删除成功”。那一刻,…

《C++11》nullptr介绍:从NULL说起

在C11之前,我们通常使用NULL来表示空指针。然而,NULL在C中有一些问题和限制,这就是C11引入nullptr的原因。本文将详细介绍nullptr的定义、用法和优点。 1. NULL的问题 在C中,NULL实际上是一个整数0,而不是一个真正的…