[TOC]

0x00 前言简述

Q:什么是Multipath多路径?

答:Multipath I/O 电脑储存技术,指利用两个以上的路径同时在CPU与储存设备之间传送讯号,以达到侦错与强化效能的目的。
简单的说当服务器到某一存储设备有多条路径时,每条路径都会识别为一个单独的设备(不便于使用),而多路径允许您将服务器节点和储存阵列间的多个I/O路径配置为一个单一设备(就是我们所说的链路聚合)即多路径聚合了I/O路径并生成由这些集合路径组成的新设备,这些I/O路径可包含独立电缆、交换器和控制器的实体SAN链接(FC / SAS / iSCSI)等;

WeiyiGeek.多路径图示

WeiyiGeek.多路径图示


工作原理:
当因为主机HBA卡、线缆、交换机或者存储设备的RAID控制器故障等原因造成一条物理路径失效时,服务器可以将通过此物理路径的I/O转移到其他正常的物理路径上面,应用程序不会觉察到这种改变,从而提高系统的可用性。

硬件要求:
硬件方面需要服务器有2块或以上的HBA接口卡,网络上有两个或以上的交换机,块存储设备有两个或以上的冗余控制器,各个物理路径之间没有任何硬件相互依赖。多路径冗余I/O也可以实现I/O的负载均衡,提高系统性能,但主要还是一种容错机制。


Q:它有什么用?

  • 冗余: 主备模式,高可用;
  • 性能优化: 主主模式,负载均衡;


Q: 如何使用Multipath?
描述: 可以参照下面的章节并存在相应的测试环境进行实践,常见三种情况会使用到比如有存储设备并且与主机通过(FC-光纤线、SAS-线缆、以太网-六类线)进行直连;
其应用场景:

  • 1.针对于块存储磁盘多路径IO设备
  • 2.使用在Oracle的ASM环境中


多路径技术

描述:实现的核心通过存储设备去适配操作系统,从而实现多路径技术,支持ALUA是其中主要部分。

1.ALUA

描述:ALUA多路径技术(Asymmetric Logical Unit Access-非对称逻辑单元存取),其提供了一个路径发现和确定优先次序的标准化机制,实现主机和存储设备的路径自协商和动态管理

特点:对于特定的LUN来说,在它的路径中,一个控制器的目标端口处于主动/优化状态,另一个控制器的目标端口处于主动/非优状态。在某一个时刻,某个LUN只是属于某一个控制器,要想实现两边的负载均衡,就是将任务A扔给控制器A,将任务B扔给控制器B,对于同一个任务来说任何时候只有一个控制器在控制

2.SLUA

描述:SLUA多路径技术(Symmetric Logical Unit Access-对称逻辑单元存取)别名对称镜像卷,它是多路径的基本特性。
特点:对于特定的LUN来说,在它的路径中两个存储控制器的目标端口均处于主动/优化状态。两个控制器之间实现高速互联的通讯,一个IO发到控制器端,两个控制器可同时参与处理;当一个控制器繁忙系统时候不需要主机端的负载均衡软件参与就可以自动实现负载均衡

SLUA与ALUA对比:

  • 前者: 双主/优化, 一个LUN可以属于两个控制器负载均衡、同一个RAID上的不同LUN组可以跨控制器,LUN跨控制器迁移不影响应用、带宽加倍1秒自动切换;
  • 后者: 双主/非优化,同一个LUN归属某一个控制器,双控之间不可自动实现负载均衡,并且切换时间一般为十几秒;
WeiyiGeek.多路径技术

WeiyiGeek.多路径技术


名词解析
1.DM Multipath - 多路径设备

描述:若不采用 DM Multipath 那么从服务器节点到储存控制器的每一条路径都会被系统视为独立的设备,即使I/O路径连接的是相同的服务器节点到相同的储存控制器也是如此, DM Multipath提供了有逻辑的管理I/O路径的方法,即在基础设备顶端生成单一多路径设备;

2.WWID - 全球识别符

描述:每个多路径设备都有一个WWID(全球识别符),它是全球唯一的无法更改的号码, 默认情况下会将多路径设备的名称设定为它的WWID, 可以在多路径配置文件(/etc/multipath.conf)中设置user_friendly_names选项,该选项可将别名设为格式为mpathn的节点唯一名称也可以也可以自定义存储设备名称;

示例.查看设备的 scsi id 即WWID查看, 获取 iscsi 共享盘的 wwid 全球唯一识别号三种方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 方式1.扫描SCSI设备号命令
$/usr/lib/udev/scsi_id -u -g /dev/mapper/asm08 #去掉空格--replace-whitespace
360050768xxx000000010d2
$/usr/lib/udev/scsi_id --whitelisted --device=/dev/sdb
36000d3100366e600000000000000001c

# 方式2
$cat /etc/multipath/wwids
# Valid WWIDs:
/36000d3100366e600000000000000001c/

# 方式3
$multipath -ll | grep "mpath"
mpatha (36000d3100366e600000000000000001c) dm-0 COMPELNT,Compellent Vol

示例2.自定义存储设备名称;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# /etc/multipath.conf
# 方式1
defaults {
user_friendly_names yes
....
}
# 结果
$multipath -ll
# mpatha (36000d3100366e600000000000000001c) dm-0 COMPELNT,Compellent Vol
# size=500G features='1 queue_if_no_path' hwhandler='1 alua' wp=rw
# `-+- policy='service-time 0' prio=25 status=enabled
# |- 4:0:0:1 sdb 8:16 active ready running
# |- 4:0:0:2 sdc 3:32 active ready running
$ls -alh /dev/mapper/mpatha-part1
# lrwxrwxrwx 1 root root 7 Sep 8 2020 /dev/mapper/mpatha-part1 -> ../dm-0

# ---------------------------------------------------------- #

# 方式2:绑定后需重新生成路径的映射表
multipaths {
multipath {
wwid "36000d3100366e600000000000000001c"
alias k8sapp
}
}
# 结果
$multipath -v2
$multipath -ll
# k8sapp (36000d3100366e600000000000000001c) dm-0 COMPELNT,Compellent Vol
# size=1.0T features='1 queue_if_no_path' hwhandler='1 alua' wp=rw
# -+- policy='service-time 0' prio=25 status=active
# |- 5:0:8:1 sdb 8:16 active ready running
# |- 5:0:9:1 sdc 8:32 failed ready running
$ls -alh /dev/mapper/k8sapp
# lrwxrwxrwx 1 root root 7 Sep 8 2020 /dev/mapper/k8sapp -> ../dm-0


3.scsi_id - 设备id

描述:其包含在udev程序包中,可以在multipath.conf中配置该程序来获取scsi设备的序号。通过序号便可以判断多个路径对应了同一设备。这个是多路径实现的关键。
multipath程序在创建multipath设备时,会调用scsi_id,从其标准输出中获得该设备的scsi id。在改写时需要修改scsi_id程序的返回值为0。因为在multipath程序中,会检查该值来确定scsi id是否已经成功得到。


4.多路径聚合和映射

Q:什么是存储的多路径聚合和映射?
Linux 主机上通过外接 FC / SAS 到物理存储设备时,一般都会在主机上加装HBA卡,HBA卡通过WWN号连接光纤交换机或直接存储。如果HBA卡出问题需要更换时,WWN号相应的也会改变,中间的这个纽带相当于断了,就无法正常识别存储磁盘分区。
当然有些HBA上面贴的有WWN号,可以在更换HBA卡之前在光交或存储上更换相应的配置。不过很多没有标这个WWN所以需要非常,建议更换后到系统下通过命令查看新识别的WWN号确认以下即可。

主机上HBA卡WWN号查看

1
2
3
4
5
6
7
# FC SAN
cat /sys/class/fc_host/host*/port_name
0x2002d0431efb7f5d #HBA卡WWN号

# SAS SAN
$cat /sys/class/sas_phy/phy-*/sas_address|sort|uniq
0x51866da091944100 #HBA卡WWN号

WeiyiGeek.服务器HBA标识

WeiyiGeek.服务器HBA标识


0x01 Multipath 管理

描述:对于存储设备创建的LUN卷以及映射分配给服务器后往往有多个控制器进行冗余,刷新scsi设备后你将会在服务器中查看到多个/dev/sd[b-z]磁盘设备,此时需要采用多路径软件进行聚合链路,使原本有多个SCSI磁盘的磁盘挂载到本地时候聚合为一个设备;注意这与您的存储设备息息相关大多数存储连接到Linux主机上可以使用multipath自带的多路径软件,然而向Huawei的存储则需要单独安装一个第三方的多路径软件才行;

Linux - Multipath

描述:在linux中开源的multipath工具是用来进行多路径IO管理,当一条链路不稳定时可自动切换到另一条链路,当然要使用多路径设备就必须安装相对应的multipath软件;

Multipath 安装&启动
备注:CentOS 7.8 / Ubuntu 20.04 tls 自带无需安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# CentOS 
rpm -qa | grep "multipath" # 查看系统是否安装
yum install device-mapper-multipath
systemctl enable multipathd || chkconfig multipathd on # 启用多路径软件开机自启
systemctl start multipathd || service multipathd status # 启动multipath多路径服务

# ubuntu
apt list | grep "multipath" # 查看系统是否安装
# multipath-tools-boot/focal 0.8.3-1ubuntu2 all
# multipath-tools/focal,now 0.8.3-1ubuntu2 amd64 [installed,automatic]
apt-get install multipath-tools
systemctl enable multipathd && systemctl start multipathd

# 软件包说明
(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驱动。

redhat.multipath

redhat.multipath


接口驱动查看

  • 1.针对于 FC SAN 多路径块存储卷磁盘

    1
    2
    3
    # (1) 存储上将LUN映射给需要的主机,然后查看主机或者存储交换机上的wwn号
    cat /sys/class/fc_host/host*/port_name
    0x2002d0431efb7f5d #HBA卡WWN号标识
  • 2.针对于 SAS SAN 多路径块存储卷磁盘

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    # (1) SAS HBA卡wwn标识号标识
    $cat /sys/class/sas_host/host5/device/phy-*/sas_phy/phy-*/sas_address|sort|uniq
    $cat /sys/class/sas_phy/phy-*/sas_address|sort|uniq
    0x51866da091944100

    # (2) SAS-HBA卡驱动查看
    $lspci | grep LSI
    01:00.0 RAID bus controller: Broadcom / LSI MegaRAID SAS-3 3108 [Invader] (rev 02)
    04:00.0 Serial Attached SCSI controller: Broadcom / LSI SAS3008 PCI-Express Fusion-MPT SAS-3 (rev 02)
    # 系统块设备查看
    $ll /sys/block/ | grep 04:00.0
    lrwxrwxrwx 1 root root 0 Sep 11 16:57 sdb -> ../devices/pci0000:00/0000:00:02.0/0000:04:00.0/host4/port-4:2/end_device-4:2/target4:0:2/4:0:2:1/block/sdb/
    lrwxrwxrwx 1 root root 0 Sep 11 16:57 sdc -> ../devices/pci0000:00/0000:00:02.0/0000:04:00.0/host4/port-4:2/end_device-4:2/target4:0:2/4:0:2:2/block/sdc/
    lrwxrwxrwx 1 root root 0 Sep 11 15:15 sdd -> ../devices/pci0000:00/0000:00:02.0/0000:04:00.0/host4/port-4:1/end_device-4:1/target4:0:1/4:0:1:1/block/sdd/
    lrwxrwxrwx 1 root root 0 Sep 11 15:15 sde -> ../devices/pci0000:00/0000:00:02.0/0000:04:00.0/host4/port-4:1/end_device-4:1/target4:0:1/4:0:1:2/block/sde/

    # (3) systool 命令:http://fibrevillage.com/storage/61-systool-a-useful-tool-for-san-as-well-for-sysfs-devices
    $apt install sysfsutils
    $systool -c sas_host -v
    # Class = "sas_host"

    # Class Device = "host5"
    # Class Device path = "/sys/devices/pci0000:00/0000:00:02.0/0000:04:00.0/host5/sas_host/host5"
    # uevent =

    # Device = "host5"
    # Device path = "/sys/devices/pci0000:00/0000:00:02.0/0000:04:00.0/host5"
    # uevent = "DEVTYPE=scsi_host"
  • 3.针对于 iSCSI 块存储磁盘

    1
    # 暂代补充


磁盘SCSI设备扫描添加与卸载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
# (1) SCSI存储设备扫描
# 方式1:
# yum install –y sg3_utils
$ sudo rescan-scsi-bus.sh #/usr/bin/rescan-scsi-bus.sh
Scanning SCSI subsystem for new devices
Scanning host 0 for SCSI target IDs 0 1 2 3 4 5 6 7, all LUNs
Scanning for device 0 2 0 0 ...
OLD: Host: scsi0 Channel: 02 Id: 00 Lun: 00
Vendor: DELL Model: PERC H730 Mini Rev: 4.27
Type: Direct-Access ANSI SCSI revision: 05
Scanning host 1 for SCSI target IDs 0 1 2 3 4 5 6 7, all LUNs
Scanning for device 1 0 0 1 ...
OLD: Host: scsi1 Channel: 00 Id: 00 Lun: 01
Vendor: COMPELNT Model: Compellent Vol Rev: 0701
Type: Direct-Access ANSI SCSI revision: 05
sg2 changed: LU not available (PQual 1)
OLD: Host: scsi1 Channel: 00 Id: 00 Lun: 02
Vendor: COMPELNT Model: Compellent Vol Rev: 0701
Type: Direct-Access ANSI SCSI revision: 05
Scanning for device 1 0 1 1 ...
OLD: Host: scsi1 Channel: 00 Id: 01 Lun: 01
Vendor: COMPELNT Model: Compellent Vol Rev: 0701
Type: Direct-Access ANSI SCSI revision: 05
sg4 changed: LU not available (PQual 1)
OLD: Host: scsi1 Channel: 00 Id: 01 Lun: 02
Vendor: COMPELNT Model: Compellent Vol Rev: 0701
Type: Direct-Access ANSI SCSI revision: 05
Scanning host 2 for SCSI target IDs 0 1 2 3 4 5 6 7, all LUNs
Scanning host 3 for SCSI target IDs 0 1 2 3 4 5 6 7, all LUNs
Scanning host 4 for SCSI target IDs 0 1 2 3 4 5 6 7, all LUNs
Scanning host 5 for SCSI target IDs 0 1 2 3 4 5 6 7, all LUNs
Scanning host 6 for SCSI target IDs 0 1 2 3 4 5 6 7, all LUNs
Scanning host 7 for SCSI target IDs 0 1 2 3 4 5 6 7, all LUNs
Scanning host 8 for SCSI target IDs 0 1 2 3 4 5 6 7, all LUNs
Scanning host 9 for SCSI target IDs 0 1 2 3 4 5 6 7, all LUNs
Scanning host 10 for SCSI target IDs 0 1 2 3 4 5 6 7, all LUNs
Scanning host 11 for SCSI target IDs 0 1 2 3 4 5 6 7, all LUNs
Scanning for device 11 0 0 0 ...
OLD: Host: scsi11 Channel: 00 Id: 00 Lun: 00
Vendor: PLDS Model: DVD+-RW DU-8A5LH Rev: 6D51
Type: CD-ROM ANSI SCSI revision: 05
.0 new or changed device(s) found.
0 remapped or resized device(s) found.
0 device(s) removed.

# 方式2:如果更换HBA卡或者添加了新的LUN卷块存储则需要重新扫盘
for i in /sys/class/scsi_host/*; do echo "- - -" > $i/scan; done
# Tips:某些存储或系统没有scan文件,可以通issue_lip文件识别
echo "1" > /sys/class/fc_host/host4/issue_lip

# (2) 查看存储设备是否映射到主机LUN卷存储是否被添加到本地
$ fdisk -l | grep "/dev"
# Disk /dev/sde: 1 TiB, 1099511627776 bytes, 2147483648 sectors
# Disk /dev/sdd: 1.2 TiB, 1319413953024 bytes, 2576980377 sectors
# Disk /dev/mapper/k8sapp: 1.2 TiB, 1319413953024 bytes, 2576980377 sectors
# Disk /dev/mapper/k8slog: 1 TiB, 1099511627776 bytes, 2147483648 sectors

$ lsblk
# sdb 8:16 0 1.2T 0 disk
# └─k8sapp 253:0 0 1.2T 0 mpath /mnt/nfs/k8sapp
# sdc 8:32 0 1T 0 disk
# └─k8slog 253:1 0 1T 0 mpath /mnt/nfs/k8slog
# sdd 8:48 0 1.2T 0 disk
# └─k8sapp 253:0 0 1.2T 0 mpath /mnt/nfs/k8sapp
# sde 8:64 0 1T 0 disk
# └─k8slog 253:1 0 1T 0 mpath /mnt/nfs/k8slog

$cat /proc/partitions # 分区信息带有(major|minor)
major minor #blocks name
7 0 56648 loop0
7 1 72256 loop1
7 2 30600 loop2
7 3 72984 loop3
7 4 30608 loop4
7 5 56276 loop5
8 0 1170997248 sda
8 1 1024 sda1
8 2 524288000 sda2
8 3 4194304 sda3
8 4 10485760 sda4
8 5 629145600 sda5
8 64 1073741824 sde
8 48 1288490188 sdd
11 0 1048575 sr0
253 0 1288490188 dm-0
253 1 1073741824 dm-1
8 32 1073741824 sdc
8 16 1288490188 sdb


# (3) 众所周知SATA和SCSI是支持热插拔的,通过存储设备直连的LUN到服务器时候,系统不能自动识别往往需要重启系统来识别,但是有另外一种方法可以很方面的让系统识别新的设备,即通过`/proc/scsi/scsi`使系统识别新的驱动器
echo "scsi add-single-device w x y z" > /proc/scsi/scsi
# 为使该命令正常运行,必须指定正确的参数值 w、x、y 和 z,如下所示:
# w 是主机适配器标识,第一个适配器为零(0)
# x 是主机适配器上的 SCSI 通道,第一个通道为零(0)
# y 是设备的 SCSI 标识
# z 是 LUN 号,第一个 LUN 为零(0)

例如:从rescan-scsi-bus.sh执行中获得设备参数值 Scanning for device 1 0 0 1
# 添加硬盘并查看
echo "scsi add-single-device 1 0 0 0" >/proc/scsi/scsi && fdisk -l
# 删除硬盘并查看(确保首先卸下的磁盘设备从系统中umount)
echo "scsi remove-single-device 0 0 1 0" >/proc/scsi/scsi && fdisk -l

$cat /proc/scsi/scsi
# Attached devices:
# Host: scsi0 Channel: 02 Id: 00 Lun: 00
# Vendor: DELL Model: PERC H730 Mini Rev: 4.27
# Type: Direct-Access ANSI SCSI revision: 05
# Host: scsi4 Channel: 00 Id: 01 Lun: 01 # 例如:device ID = 4 0 1 1
# Vendor: COMPELNT Model: Compellent Vol Rev: 0701
# Type: Direct-Access ANSI SCSI revision: 05
# Host: scsi4 Channel: 00 Id: 01 Lun: 02 # 例如:device ID = 4 0 1 2
# Vendor: COMPELNT Model: Compellent Vol Rev: 0701
# Type: Direct-Access ANSI SCSI revision: 05
# Host: scsi11 Channel: 00 Id: 00 Lun: 00
# Vendor: PLDS Model: DVD+-RW DU-8A5LH Rev: 6D51
# Type: CD-ROM ANSI SCSI revision: 05
# Host: scsi4 Channel: 00 Id: 02 Lun: 01 # 例如:device ID = 4 0 2 2
# Vendor: COMPELNT Model: Compellent Vol Rev: 0701
# Type: Direct-Access ANSI SCSI revision: 05
# Host: scsi4 Channel: 00 Id: 02 Lun: 02 # 例如:device ID = 4 0 2 2
# Vendor: COMPELNT Model: Compellent Vol Rev: 0701
# Type: Direct-Access ANSI SCSI revision: 05


multipath 配置和使用

  • 案例1.SAS FAN 多路径
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    # (0) 多路径自动处理可载入模块
    modprobe dm-multipath # 初始化DM
    modprobe dm-round-robin
    lsmod | grep multipath # 查看
    # dm_multipath 32768 4 dm_round_robin,dm_service_time
    # multipath 20480 0

    # (1) 查看当前系统下各磁盘分区
    [email protected]:/mnt/ww# fdisk -l | egrep "^/dev"
    # 比如 /dev/mapper/xxxxx 的磁盘可能是逻辑卷(LVM)或者多路径(Multipath)
    Disk /dev/mapper/mpatha-part1 4096 0 2576980377 1.2T Linux filesystem
    Disk /dev/mapper/mpatha-part2 4096 0 2147483648 1T Linux filesystem


    # (2) 查看当前系统下是否存在逻辑卷在进行判别;
    $lvdisplay
    # 或者采用以下命令分区以及逻辑卷一目了然
    $lvmdiskscan
    dev/loop0 [ 55.32 MiB]
    /dev/mapper/mpatha-part1 [ <1.20 TiB]
    /dev/loop1 [ 70.56 MiB]
    /dev/mapper/mpatha-part2 [ 1.00 TiB]
    /dev/loop2 [ 29.88 MiB]
    /dev/sda2 [ 500.00 GiB]
    /dev/loop3 [ 71.27 MiB]
    /dev/sda3 [ 4.00 GiB]
    /dev/loop4 [ 29.89 MiB]
    /dev/sda4 [ 10.00 GiB]
    /dev/loop5 [ <54.96 MiB]
    /dev/sda5 [ 600.00 GiB]
    2 disks
    10 partitions
    0 LVM physical volume whole disks
    0 LVM physical volumes


    # (3) 查看当前系统下是否存在多路径磁盘多路径一般的 /dev/mapper/xxxx 链接到一个磁盘 /dev/dm-x 的块设备文件
    $ ls -alh /dev/mapper/mpatha-part1
    lrwxrwxrwx 1 root root 7 Sep 8 2020 /dev/mapper/mpatha-part1 -> ../dm-1
    $ multipath -ll
    # mpatha (36000d3100366e6000000000000000020) dm-1 COMPELNT,Compellent Vol
    # size=1.0T features='1 queue_if_no_path' hwhandler='1 alua' wp=rw
    # `-+- policy='service-time 0' prio=25 status=active
    # |- 4:0:1:2 sde 8:64 failed ready running # 未挂载的时候显示failed
    # `- 4:0:2:2 sdc 8:32 active ready running
    # mpathb (36000d3100366e6000000000000000021) dm-0 COMPELNT,Compellent Vol
    # size=1.2T features='1 queue_if_no_path' hwhandler='1 alua' wp=rw
    # `-+- policy='service-time 0' prio=25 status=active
    # |- 4:0:1:1 sdd 8:48 failed ready running
    # `- 4:0:2:1 sdb 8:16 active ready running


    # (4) multipath.conf 配置
    blacklist {
    devnode "^(ram|raw|loop|fd|md|dm-|sr|scd|st|sda)[0-9]*"
    }
    defaults {
    user_friendly_names yes # 磁盘名称友好显示
    path_grouping_policy multibus
    failback immediate
    no_path_retry fail
    }
    # 在/etc/multipath.conf中可以配置设备scsi id和设备路径形成绑定
    multipaths {
    multipath {
    wwid "36000d3100366e6000000000000000021"
    alias k8sapp
    }
    multipath {
    wwid "36000d3100366e6000000000000000020"
    alias k8slog
    }
    }


    # (5) multipath 操作(重新加载配置文件并合并路径)
    systemctl restart multipathd && systemctl status multipathd # 重启与查看多路径服务启用状态
    multipath -F # 删除现有链路
    multipath -v2 # 打印创建或修改的多路径映射的拓扑即多路径设备相关信息
    multipath -v3 # 查看多路径 blacklist、whitelist和设备wwid
    multipath -ll # 查看当前系统的多路径拓扑
    # k8slog (36000d3100366e6000000000000000020) dm-1 COMPELNT,Compellent Vol
    # size=1.0T features='1 queue_if_no_path' hwhandler='1 alua' wp=rw
    # `-+- policy='service-time 0' prio=25 status=active
    # |- 4:0:1:2 sde 8:64 active ready running
    # `- 4:0:2:2 sdc 8:32 active ready running
    # k8sapp (36000d3100366e6000000000000000021) dm-0 COMPELNT,Compellent Vol
    # size=1.2T features='1 queue_if_no_path' hwhandler='1 alua' wp=rw
    # `-+- policy='service-time 0' prio=25 status=active
    # |- 4:0:1:1 sdd 8:48 active ready running
    # `- 4:0:2:1 sdb 8:16 active ready running

    # 从上面的信息可以看出multipat获取到了2个路径`实际设备sde/虚拟设备sdc`设备聚合成为一个k8slog磁盘设备名称,k8slog是多路径映射名称,指向dm-1它是block设备。
    # 而 /dev/mapper/k8sapp 与 /dev/dm-1实际上指向的同一个设备
    /usr/lib/udev/scsi_id -g /dev/dm-1
    36000d3100366e6000000000000000020
    /usr/lib/udev/scsi_id -g /dev/mapper/k8sapp
    36000d3100366e6000000000000000021


    # (6) 多路径设备磁盘分区与格式
    # 此处由于使用的磁盘无需分区着就使用设备的全部控制,但是注意如果磁盘大于2T则需要采用parted命令进行磁盘分区;
    $ mkfs.xfs /dev/mapper/k8sapp
    $ mkfs.xfs /dev/mapper/k8slog
    $ fdisk -l
    # Disk /dev/mapper/k8sapp: 1.2 TiB, 1319413953024 bytes, 2576980377 sectors
    # Units: sectors of 1 * 512 = 512 bytes
    # Sector size (logical/physical): 512 bytes / 4096 bytes
    # I/O size (minimum/optimal): 2097152 bytes / 2097152 bytes

    # Disk /dev/mapper/k8slog: 1 TiB, 1099511627776 bytes, 2147483648 sectors
    # Units: sectors of 1 * 512 = 512 bytes
    # Sector size (logical/physical): 512 bytes / 4096 bytes
    # I/O size (minimum/optimal): 2097152 bytes / 2097152 bytes


    # (7) 查看dm-1 、dm-2设备的uuid
    $ls -alh /dev/disk/by-uuid/
    lrwxrwxrwx 1 root root 10 Sep 12 23:23 40fd2fd5-997f-4266-a0c8-95c0e534a23b -> ../../dm-1
    lrwxrwxrwx 1 root root 10 Sep 12 23:23 acccde8a-16b2-4a87-a8da-0ba2c72aa688 -> ../../dm-0


    # (8) 挂载多路径设备到文件系统中(推荐采用UUID进行挂载)
    # k8sapp
    /dev/disk/by-uuid/acccde8a-16b2-4a87-a8da-0ba2c72aa688 /mnt/nfs/k8sapp xfs defaults 0 0
    # k8slog
    /dev/disk/by-uuid/40fd2fd5-997f-4266-a0c8-95c0e534a23b /mnt/nfs/k8slog xfs defaults 0 0


    # (9) 查看挂载的多路径设备
    $ lsblk
    sdb 8:16 0 1.2T 0 disk
    └─k8sapp 253:0 0 1.2T 0 mpath /mnt/nfs/k8sapp
    sdc 8:32 0 1T 0 disk
    └─k8slog 253:1 0 1T 0 mpath /mnt/nfs/k8slog
    sdd 8:48 0 1.2T 0 disk
    └─k8sapp 253:0 0 1.2T 0 mpath /mnt/nfs/k8sapp
    sde 8:64 0 1T 0 disk
    └─k8slog 253:1 0 1T 0 mpath /mnt/nfs/k8slog

    $ df -h
    /dev/mapper/k8sapp 1.2T 8.6G 1.2T 1% /mnt/nfs/k8sapp
    /dev/mapper/k8slog 1.0T 7.2G 1017G 1% /mnt/nfs/k8slog
    192.168.1.216:/mnt/nfs/k8sapp 1.2T 8.6G 1.2T 1% /nfs/k8sapp
    192.168.1.216:/mnt/nfs/k8slog 1.0T 7.2G 1017G 1% /nfs/k8slog

至此通过存储设备分配给主机的存储卷通过SAS SAN线缆连接到主机HBA设备中被正常识别与使用。


  • 案例2.FC SAN 存储直链
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    # 1.检查用户登录信息 & 同步服务器时间 为了与存储上的时间对应
    $id && ntpdate 10.10.6.101
    uid=0(root) gid=0(root) groups=0(root)
    23 May 21:55:37 ntpdate[72045]: step time server 10.10.6.101 offset 448.347362 sec
    $ hwclock -w
    $ date


    # 2.查看存储映射到主机的光纤卡标识(此标识也可以帮助我们在多条FC 光纤接到主机时区分绑定的主机是否对应主机上的HBA卡标识)
    $cat /sys/class/fc_host/host15/port_name
    0x100000109b341bc8
    $cat /sys/class/fc_host/host16/port_name
    0x100000109b341bc4


    # 3.对光纤交换机进行授权实际上是进行scsi设备进行热备添加到主机上而不用重启
    echo '- - -' > /sys/class/scsi_host/host16/scan
    echo '- - -' > /sys/class/scsi_host/host15/scan


    # 4.查看linux磁盘分区
    lvmdiskscan
    fdisk -l


    # 5.多路径multipathd配置文件生成(手动编译安装)
    nano /usr/share/doc/device-mapper-multipath-0.4.9/multipath.conf
    multipaths {
    multipath {
    wwid 3600a09803830447967244c61626d6e2f
    alias o3db
    path_grouping_policy multibus #failover
    #path_checker readsector0 #决定路径状态的方法
    path_selector "round-robin 0"
    failback immediate
    }
    multipath {
    wwid 3600a09803830447967244c61626d6e59
    alias o3app
    path_grouping_policy multibus #failover
    #path_checker readsector0
    path_selector "round-robin 0"
    failback immediate
    }
    multipath {
    wwid 3600a09803830447967244c61626d6e63
    alias fbapp
    path_grouping_policy multibus #failover
    #path_checker readsector0
    path_selector "round-robin 0"
    failback immediate
    }
    }

    # 将此文件复制到修改后的文件复制到 /etc
    cp /usr/share/doc/device-mapper-multipath-0.4.9/multipath.conf /etc

    # 6.初始化DM并检查mathconf服务是否开启 /sbin/mpathconf
    modprobe dm-multipath
    modprobe dm-round-robin
    systemctl restart multipathd

    # 7.进到/dev/mapper进行查看映射成功的LUN名称
    ls -ltr /dev/mapper
    crw------- 1 root root 10, 236 Jan 3 14:04 control
    lrwxrwxrwx 1 root root 7 Jan 3 14:04 rhel-var_log_audit -> ../dm-3
    lrwxrwxrwx 1 root root 7 Jan 3 14:04 rhel-var_log -> ../dm-2
    lrwxrwxrwx 1 root root 7 Jan 3 14:04 rhel-var -> ../dm-1
    lrwxrwxrwx 1 root root 7 Jan 3 14:04 rhel-swa p -> ../dm-5
    lrwxrwxrwx 1 root root 7 Jan 3 14:04 rhel-root -> ../dm-6
    lrwxrwxrwx 1 root root 7 Jan 3 14:04 rhel-tmp -> ../dm-0
    lrwxrwxrwx 1 root root 7 Jan 3 14:04 rhel-home -> ../dm-4
    lrwxrwxrwx 1 root root 7 May 23 22:37 vgo3app-lvo3app -> ../dm-7 # 关键点

    # 8.vgo3app-lvo3app
    vgchange -an vgo3db


  • 案例3.多路径ISCSI磁盘的存储池配置
    测试环境: Ubuntu 14.04
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # 1.安装需要软件: 
    apt-get install multipath-tools tgt open-iscsi

    # 2.创建裸磁盘(RAW):
    qemu-img -f raw testmul.raw 5G
    # 或者
    dd if=/dev/zero of=testmul.raw bs=1M count=0 seek=5120

    # 3.挂载RAW磁盘文件
    losetup -f --show testmul.raw

创建ISISC盘:

1
2
3
4
5
6
7
8
9
10
11
12
# 1.添加tgt配置文件(/etc/tgt/targets.conf) : /dev/loop0 为第三步挂载的loop设备
<target iqn.2013-10.cn.openstack:cinder-volume.target>
backing-store /dev/loop0
</target>

# 2.重启tgt
service tgt restart

# 3.查看ISISC信息 (192.168.1.3本机ip地址;默认端口为3260;iptables开启,可以关闭或者定义允许规则)
iscsiadm -m discovery -t st -p 192.168.1.3:3260
# 输出信息:
# 192.168.1.3:3260,1 iqn.2013-10.cn.openstack:cinder-volume.target

配置多路径 (multipath) :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# 1.路径配置 iface0为路径名,wlan0为网卡 (此处只配置了单路径需要配置多路自行配置。 )
iscsiadm -m iface -I iface0 –op=new
iscsiadm -m iface -I iface0 –op=update -n iface.net_ifacename -v wlan0
iface0 路径具体配置信息: /etc/iscsi/ifaces/iface0

# 2.登陆ISISC磁盘
iscsiadm -m node -T iqn.2013-10.cn.openstack:cinder-volume.target -p 192.16.1.3:3260 -I iface0 -l

# 3.查看新增磁盘
fdisl -l #可以看到增加的磁盘: /dev/sdb
# Disk /dev/sdb: 5368 MB, 5368709120 bytes
# 166 heads, 62 sectors/track, 1018 cylinders, total 10485760 sectors
# Units = 扇区 of 1 * 512 = 512 bytes
# Sector size (logical/physical): 512 bytes / 512 bytes
# I/O size (minimum/optimal): 512 bytes / 512 bytes
# Disk identifier: 0x00000000
# Disk /dev/sdb doesnt contain a valid partition table

# 4.multipath配置文件
# a.配置文件修改 (/etc/multipath.conf),并重启动multipath-tools服务
blacklist {
devnode "^sda"
}
defaults {
user_friendly_names yes
}


# b.运行mulpath
$multipath -ll
# 输出信息:
iscsidisk1 (33000000100000001) dm-0 IET ,VIRTUAL-DISK
size=5.0G features='1 queue_if_no_path' hwhandler='0' wp=rw
`-+- policy='round-robin 0' prio=1 status=active
`- 6:0:0:1 sdb 8:16 active ready running

# 备注:如果执行上述命令,没有信息输出执行 multipath -v3 输出如下信息
# 把 /dev/sdb的uuid 添加到 /etc/multipath/wwids 中,这样multipath就不会过滤掉设备 /dev/sdb 并重启multipath-tools服务。
===== paths list =====
uuid hcil dev dev_t pri dm_st chk_st vend/prod/rev
33000000100000001 6:0:0:1 sdb 8:16 1 undef ready IET ,VIRTUAL-DISK
Apr 10 19:59:27 | params = 1 queue_if_no_path 0 1 1 round-robin 0 1 1 8:16 1000
Apr 10 19:59:27 | status = 2 0 0 0 1 1 A 0 1 0 8:16 A 0


# c. 添加 multipath 信息/etc/multipath.conf
multipaths {
multipath {
wwid "33000000100000001"
alias iscsidisk1
}
}

# 5.重启multipath-tools服务执行
systemctl restart multipath-tools
$lsblk
sdb 8:16 0 5G 0 disk
└─iscsidisk1 (dm-0) 252:0 0 5G 0 mpath


补充parted磁盘分区与格式化挂载:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 1.多路径识别的设备用parted工具来做分区格式化
parted /dev/sdb
(parted) mklabel gpt # 把硬盘转换成GPT分区
(parted) mkpart primary 1 # 创建主分区注意需要`选择分区的文件系统类型ext4,ext3,xfs`
(parted) print

# 2.主分区文件系统XFS格式化
mkfs.xfs -f /dev/sdc1 #格式化成xfs
mkfs.xfs -f -i size=512 -l size=128m,lazy-count=1 -d agcount=64 /dev/mapper/mpathbp1 #>=20T时候

# 3.手动挂载
mount /dev/sdc1 /home/

# 4.开机自动挂载
/dev/sdb1(磁盘) /home(挂载点) xfs(文件格式) defaults 0 0
df -h查看挂载点文件名
/dev/sdb1 16T 33M 16T 1% /home


multipath 命令 - 设备映射器目标自动配置
描述: 该命令主要作用是设备进行映射器目标自动配置,即用于检测和合并到设备的多条路径,以用于故障转移或性能原因。

语法参数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# 帮助说明
man multipath

# SYNOPSIS | 大纲
multipath [-v level] [-B|-d|-i|-q|-r] [-b file] [-p policy] [device]
multipath [-v level] [-R retries] -f device
multipath [-v level] [-R retries] -F
multipath [-v level] [-l|-ll] [device]
multipath [-v level] [-a|-w] device
multipath [-v level] -W
multipath [-v level] [-i] [-c|-C] device
multipath [-v level] [-i] [-u|-U]
multipath [-h|-t|-T]

# ARGUMENTS | 命令行参数
# 设备参数将multipath的操作限制为与给定表达式匹配的设备,参数可以引用多路径映射或其组件(“路径”)
device node # 设备节点的文件名,例如/dev/dm-10或/dev/sda.如果节点引用表示多路径映射的现有设备映射器设备,则根据操作模式选择映射或其路径。否则它选择路径设备。
device ID # 由主设备号指定的内核设备号:副设备号例如lsblk中MAJ:MIN属性值65:16,此格式只能用于路径设备
WWID # 要列出系统中存在的设备的WWIDs,可以使用命令"multipath -d -v3 2>/dev/null"
# device action limited to:
# . multipath named 'device' (ex: mpath0)
# . multipath whose wwid is 'device' (ex: 60051...)
# . multipath including the path named 'device' (ex: /dev/sda or/dev/dm-0)
# . multipath including the path with maj:min 'device' (ex: 8:0)


# 运行模式
# 默认的操作模式是从系统中找到的设备中检测并设置多路径映射。使用以下命令行开关选择其他操作模式:
-f #如果多路径设备未使用,则刷新(删除)指定为参数的多路径设备映射
-F #刷新(删除)所有未使用的多路径设备映射
-l #从系统文件和设备映射器中获取的信息中显示(“列表”)当前的多路径拓扑
-ll #从所有可用的信息(sysfs,设备映射器,路径检查器…)显示(“列表”)当前的多路径拓扑
-a #将指定设备的WWID添加到WWIDs文件中
-w #从WWIDs文件中删除指定设备的WWID
-W #将WWIDs文件重置为只包含当前的多路径设备
-c #检查一个块设备是否应该是多路径设备中的一个路径
-C #检查多路径设备是否有可用的路径。这可以用来测试该设备上的I/O是否可能成功。命令本身不尝试在设备上执行I/O。
-u #检查程序环境中指定的设备是否应该是多路径设备中的路径
-U #检查程序环境中指定的设备是否是具有可用路径的多路径设备与-C效果一致
-h #打印使用文本(帮助)
-t #显示当前使用的默认多路径配置
-T #显示当前使用的multipathd配置,将输出限制为系统中实际出现的设备。这可以用作创建multipath.conf的模板。


# 选项
-v level #在默认和“列表”操作模式下打印到stdout的冗长信息。默认的级别是- v2。
0 #Nothing is printed. 没有打印
1 #在列表模式下,打印所有多路径映射的WWIDs。
2 #在默认模式下,打印创建或修改的多路径映射的拓扑。(在列表模式下,。)
3 #打印所有检测到的路径和所有多路径映射的拓扑。 (包含多路径详情blacklist、whitelist和设备wwid等等信息)
#冗余级别还控制打印到stderr的日志和调试消息的级别。默认的级别对应于LOG_NOTICE(在正常运行中不应该错过的重要消息)。

-d #预演,不要创建或更新devmap。
-i #处理设备时忽略WWIDs文件。如果find_multipaths严格或在multipath中设置find_multipaths no。conf, multipath只考虑WWIDs文件中列出的设备。这种选择凌驾于行为之上。对于find_multipaths的其他值,此选项不起作用。
-B #将绑定文件视为只读。
-b file #设置user_friendly_names绑定文件位置。The default is /etc/multipath/bindings.
-q #不要为多路径映射取消设置设备映射器 queue_if_no_path 功能。通常如果multipathd不运行multipath会这样做,因为只有运行中的多路径守护进程保证不可用的路径在再次可用时被恢复。
-p policy #强制所有映射到指定的路径分组策略,策略的可能值与multipath.conf(5)中的path_grouping_policy的值相同,可选策略策略;
# . failover 每个优先级组一个路径
# . multibus 所有路径在一个优先级组中
# . group_by_serial 每个串行一个优先级组
# . group_by_prio 每个优先级lvl有一个优先级组
# . group_by_node_name 每个目标节点一个优先级组

-r #强制重新加载所有现有的多路径映射。如果multipathd守护进程正在运行,则将此命令委托给它
-R retries #重试刷新正在使用的多路径设备的次数。默认值是0。

基础示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# (1) 常用命令
multipath -F # 刷新(删除)所有未使用的多路径设备映射
multipath -v2 # 打印创建或修改的多路径映射的拓扑或打印所有多路径映射的拓扑
multipath -r # 强制重新加载所有现有的多路径映射,即修改multipath.conf配置文件之后采用其可以热加载

# (2) 列举所多路径设备中所有wwids信息、设备id号以及MAJ:MIN属性值信息
multipath -v3 2>/dev/null
# ===== paths list =====
# uuid hcil dev dev_t pri dm_st chk_st vend/prod
# 36000d3100366e6000000000000000021 4:0:1:1 sdd 8:48 50 undef undef COMPELNT,
# 36000d3100366e6000000000000000020 4:0:1:2 sde 8:64 50 undef undef COMPELNT,
# 36000d3100366e6000000000000000021 4:0:2:1 sdb 8:16 1 undef undef COMPELNT,
# 36000d3100366e6000000000000000020 4:0:2:2 sdc 8:32 1 undef undef COMPELNT,

# (3) 缺省以及当前多路径软件配置信息
multipath -t | more
multipath -T
defaults {
verbosity 2
polling_interval 5
max_polling_interval 20
.....
marginal_pathgroups "no"
}
blacklist {
devnode "^sda"
devnode "^hd[a-z]"
devnode "^(ram|raw|loop|fd|md|dm-|sr|scd|st)[0-9]*"
devnode "^dcssblk[0-9]*"
}
blacklist_exceptions {
property "(SCSI_IDENT_|ID_WWN)"
}
devices {
device {
vendor "NVME"
product ".*"
uid_attribute "ID_WWN"
path_checker "none" #决定路径状态的方法
retain_attached_hw_handler "no"
}
}


multipath.conf - 配置详解

配置多路径文件 /etc/multipath.conf 参数说明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
$multipath -T
defaults {
verbosity 2
polling_interval 5
max_polling_interval 20
reassign_maps "no"
multipath_dir "//lib/multipath"
path_selector "service-time 0" #选择那一条路径进行下次IO操作
path_grouping_policy "multibus" #路径组策略
uid_attribute "ID_SERIAL"
prio "const"
prio_args ""
features "0"
path_checker "tur" # 决定路径状态的方法
alias_prefix "mpath"
failback "immediate" #故障恢复的模式
rr_min_io 1000 # 在当前的用户组中,在切换到另外一条路径之前的IO请求的数目
rr_min_io_rq 1
max_fds "max"
rr_weight "uniform"
no_path_retry "fail" #默认fail,在disable queue之前系统尝试使用失效路径的次数的数值
queue_without_daemon "no"
flush_on_last_del "no"
user_friendly_names "yes"
fast_io_fail_tmo 5
bindings_file "/etc/multipath/bindings"
wwids_file "/etc/multipath/wwids"
prkeys_file "/etc/multipath/prkeys"
log_checker_err always
all_tg_pt "no"
retain_attached_hw_handler "yes"
detect_prio "yes"
detect_checker "yes"
force_sync "no"
strict_timing "no"
deferred_remove "no"
config_dir "/etc/multipath/conf.d"
delay_watch_checks "no"
delay_wait_checks "no"
san_path_err_threshold "no"
san_path_err_forget_rate "no"
san_path_err_recovery_time "no"
marginal_path_err_sample_time "no"
marginal_path_err_rate_threshold "no"
marginal_path_err_recheck_gap_time "no"
marginal_path_double_failed_time "no"
find_multipaths "on"
uxsock_timeout 4000
retrigger_tries 0
retrigger_delay 10
missing_uev_wait_timeout 30
skip_kpartx "no"
disable_changed_wwids ignored
remove_retries 0
ghost_delay "no"
find_multipaths_timeout -10
enable_foreign ""
marginal_pathgroups "no"
}

# 后端设备(不包含以下设备节点)
blacklist {
devnode "^sda"
devnode "^hd[a-z]"
devnode "^(ram|raw|loop|fd|md|dm-|sr|scd|st)[0-9]*"
devnode "^dcssblk[0-9]*"
devnode "^(ram|zram|raw|loop|fd|md|dm-|sr|scd|st|dcssblk)[0-9]"
devnode "^(td|hd|vd)[a-z]"
devnode "^cciss!c[0-9]d[0-9]*"
}
device {
vendor "SGI" #厂商名称,可通过multipath –v3获取到
product "Universal Xport" #产品型号
getuid_callout "/sbin/scsi_id -g -u -s /block/%n" #获得唯一设备号使用的默认程序
}
device {
vendor "^DGC"
product "LUNZ"
}
device {
vendor "EMC"
product "LUNZ"
}
device {
vendor "DELL"
product "Universal Xport"
}
device {
vendor "IBM"
product "Universal Xport"
}
device {
vendor "IBM"
product "S/390"
}
device {
vendor "LENOVO"
product "Universal Xport"
}
device {
vendor "(NETAPP|LSI|ENGENIO)"
product "Universal Xport"
}
device {
vendor "STK"
product "Universal Xport"
}
device {
vendor "SUN"
product "Universal Xport"
}
device {
vendor "(Intel|INTEL)"
product "VTrak V-LUN"
}
device {
vendor "Promise"
product "VTrak V-LUN"
}
device {
vendor "Promise"
product "Vess V-LUN"
}
}
blacklist_exceptions {
property "(SCSI_IDENT_|ID_WWN)"
}
devices {
device {
vendor "COMPELNT"
product "Compellent Vol"
path_grouping_policy "multibus"
no_path_retry "queue"
}
}

overrides {
...
}

multipaths {
multipath {
wwid "36000d3100366e6000000000000000021" #磁盘的WWID
alias "k8sapp"
}
multipath {
wwid "36000d3100366e6000000000000000020"
alias "k8slog"
}
}


bindings - 多路径缺省绑定的别名

描述:/etc/multipath/bindings文件是在multipath.conf中定义了user_friendly_names属性时候,默认采用以下友好的别名名称;

1
2
3
4
5
$cat /etc/multipath/bindings
# Format:
# alias wwid
mpatha 36000d3100366e6000000000000000020
mpathd 36000d3100366e6000000000000000021


Windows - MPIO

描述: 在Windows下也自带多路径管理软件它叫MPIO,Windows MPIO集成在Windows的系统中,默认情况下不会安装,需要手动安装起来。

Step 1.打开“Server Manager-服务器管理”,选择“Feature”,选择右键菜单中的“Add Features-添加功能”

Step 2.添加“MultiPath I/O”在弹出的Features选择框中,选择“MultiPath I/O”

WeiyiGeek.MultiPath I/O

WeiyiGeek.MultiPath I/O

Step 3.需要对MPIO多路径进行配置才能让其接管存储系统。Windows 2008及后续版本的操作系统提供mpclaim多路径命令可以用于查询磁盘信息;

1
2
3
4
5
6
# 查询设备VID和PID,此处举例所用,实际配置的时候需要以现场环境的显示为准。
VID:Vendor ID,厂商ID。例如HUAWEI等。
PID:Product ID,产品ID。例如S5500T、S5600T。

# 查询磁盘信息
mpclaim -e

Step 4.运行MPIO管理控制台%windir%\system32\mpiocpl.exe也可在管理工具找到它,进行添加待管理存储设备的信息
在“MPIO Device”中点击“Add”添加存储设备。

  • 如果对iSCSI initiator使用MPIO,则要求在“Discover Multi-Paths”菜单中开启“Add Support for iSCSI device”选项。
  • 大多数型号的设备可以在“Discover MultiPaths”选项下的Others选项中自动识别,此时只需点击 Add将其加入即可。
    WeiyiGeek.

    WeiyiGeek.

Step 5.重启主机使多路径生效,然后查看MPIO策略。重启主机后将重新扫描磁盘。磁盘数量与映射给主机的LUN的数量一致。右键单击磁盘,选择“Properties”可以看到属性中MPIO选项,一般来说如无特别要求,优先使用默认MPIO策略。
不同情况下默认的策略是不同的,常用操作系统的默认策略如表1-1所示。

操作系统 存储系统 默认MPIO策略 说明
Windows Server 2008 开启ALUA Round Robin With Subset
关闭ALUA Fail over only
Windows Server 2008 R2 开启ALUA Round Robin With Subset
关闭ALUA Round Robin
Windows Server 2012 DC 开启ALUA Round Robin With Subset
关闭ALUA Round Robin

Step 6.修改路径状态某些特定场景或需求,需对路径状态重新配置。

例如:对于“Fail Over Only”策略,只允许一条路径为Activate状态,其余路径必须编辑成Standby状态;对于Windows 2008,需要将连接到归属控制器的路径状态设置为“Active/Optimized”,将连接到其他控制器的路径状态设置为“Active/Unoptimized”。

Step 7. 保存路径状态配置

磁盘的所有路径状态修改完成后在界面上并不会立刻更新,需要单击MPIO策略配置界面“OK”按钮保存配置,并重新打开MPIO策略配置界面查看更改是否生效。


mpclaim 命令

描述:在cmd下面也可以对MPIO进行管理在使用前

1
2
3
4
5
6
7
8
# 查看当前安装的features
dism /online /get-features

# 激活MPIO
dism /online /enable-feature:MultipathIo

# 取消激活MPIO
dism /online /disable-feature:MultipathIo

基础示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 查看Microsoft DSM 管理的存储设备
mpclaim -r
# 查看系统发现的存储设备
mpclaim -e

# 使用MPIO管理所有存储设备
mpclaim.exe -r -i -a ""
# 去掉MPIO对所有设备的管理
mpclaim.exe -r -u -a ""

# 使用MPIO管理光纤通道设备
mpclaim.exe -r -i -d <_VendorID> <_ProductID>
# 去除MPIO对光纤通道设备的管理
mpclaim.exe -r -u -d <_VendorID> <_ProductID>

# 使用MPIO管理 iSCSI 设备
mpclaim -r -i -d "MSFT2005iSCSIBusType_0x9"
#去掉MPIO对iSCSI设备的管理
mpclaim.exe -r -u -d "MSFT2005iSCSIBusType_0x9"

# 修改负载平衡策略
mpclaim.exe –L –M <_num>


注意事项:

  • Windows MPIO多路径软件支持每个Lun的最大路径数为32个(建议每个Lun的路径数不大于32条),大于32条路径会导致Windows 主机系统蓝屏。

  • 对于不支持ALUA的存储,请按照“关闭ALUA”的方式来配置MPIO策略。

  • VendorID需要为8位字节,ProductID为16位字节,不足的以空格填充。

  • 修改负载平衡策略命令中的num参数代表的意思见表
Parameter Definition
0 Clear the Policy - 明确的政策
1 Failover Only - 故障转移
2 Round Robin - 循环
3 Round Robin with Subset - 子集循环
4 Least Queue Depth - 至少队列深度
5 Weighted Paths -加权路径
6 Least Blocks - 至少块
7 Vendor Specific - 特定于供应商的

0x02 入坑解决

问题1.在未进行多路径设备挂载时候显示ailed ready running

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$multipath -ll
# k8slog (36000d3100366e6000000000000000020) dm-1 COMPELNT,Compellent Vol
# size=1.0T features='1 queue_if_no_path' hwhandler='1 alua' wp=rw
# `-+- policy='service-time 0' prio=25 status=active
# |- 5:0:0:2 sdc 8:32 failed ready running # 关键点
# `- 5:0:1:2 sde 8:64 active ready running

# 解决办法
$mount /dev/mapper/k8slog /mnt/nfs/k8slog/ # 关键点
$multipath -ll
# k8slog (36000d3100366e6000000000000000020) dm-1 COMPELNT,Compellent Vol
# size=1.0T features='1 queue_if_no_path' hwhandler='1 alua' wp=rw
# `-+- policy='service-time 0' prio=25 status=active # 关键点
# |- 5:0:0:2 sdc 8:32 active ready running
# `- 5:0:1:2 sde 8:64 active ready running


0x03 参考连接