1. iscsi和多路径基础概念
1.1 scsi&iscsi
iscsi是由scsi协议发展而来,简单来讲,iscsi是对scsi的封装,并通过以太网来进行scsi指令的传输. 传统的scsi存储设备,通过总线连接到主机,供主机使用. 通过iscsi,主机可以直接通过以太网(TCP/IP)连接使用scsi存储设备,这也是通常所说的NAS存储的一种,它提供的是块级存储服务.
1.2 多路径的形成
通过iscsi连接的存储设备,由于中间经过了交换机等网络设备,从主机到同一个存储设备,可能会存在多条路径. 每条路径在linux系统上都会被识别成一个设备,如果把每条路径都当成独立设备去处理的话,不同路径之间的读写操作就可能会造成数据的紊乱.
1.3 multipathd
multipathd可以解决上述的多路径问题,其主要原理包括:
a. 每一个scsi设备都有唯一的scsi_id,multipathd通过探测scsi_id来判断不同路径后面是不是同一个存储设备.
b. 通过内核device-mapper功能,将多条路径映射为单一的块设备,提供给文件系统使用.
c. 由于多路径的存在,multipathd可以提供负载均衡和高可用的服务.
2. iscsi存储和multipathd实例演示
整个环境通过两台虚拟机搭建,一台虚拟机作为iscsi存储服务器,另一台作为客户端. 两台虚拟机都配置了两张网卡,从客户端到iscsi服务器,可以形成两条路径.
2.1 iscsi存储服务器搭建
通过openfiler搭建iscsi存储服务器,openfiler镜像包及部署手册,具体参考openfiler官网.
https://www.openfiler.com/community/download
部署完成后,创建了2个iscsi target:
2.2 iscsi&multipath使用
需要安装如下软件包:
iscsi-initiator-utils:提供iscsid服务,及iscsi管理工具iscsiadm
device-mapper-multipath&device-mapper-multipath-libs:提供multipathd服务及multipath管理工具
2.2.1 探测iscsi target
通过iscsiadm命令探测openfiler服务器上的iscsi target,具体如下:
[root@localhost iscsi]# iscsiadm -m discovery -t sendtargets -p 192.168.122.168:3260
192.168.122.168:3260,1 iqn.2006-01.com.openfiler:disk02
172.16.10.78:3260,1 iqn.2006-01.com.openfiler:disk02
192.168.122.168:3260,1 iqn.2006-01.com.openfiler:disk01
172.16.10.78:3260,1 iqn.2006-01.com.openfiler:disk01
可以看到,openfiler返回了2个target,每个target 2条路径. 执行命令后,在/var/lib/iscsi/目录生成了如下文件:
[root@localhost ~]# ll /var/lib/iscsi/send_targets/
总用量 0
drw------- 2 root root 301 Apr 6 21:49 192.168.122.168,3260
[root@localhost ~]# ll /var/lib/iscsi/nodes/
总用量 0
drw------- 4 root root 63 Apr 6 21:49 iqn.2006-01.com.openfiler:disk01
drw------- 4 root root 63 Apr 6 21:49 iqn.2006-01.com.openfiler:disk02
2.2.2 Login to target
对iscsi target执行login操作后,系统才能识别到设备并使用,login命令如下:
[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0 11:0 1 1024M 0 rom
vda 252:0 0 30G 0 disk
├─vda1 252:1 0 1G 0 part /boot
└─vda2 252:2 0 29G 0 part
├─nlas-root 253:0 0 26G 0 lvm /
└─nlas-swap 253:1 0 3G 0 lvm [SWAP]
vdb 252:16 0 1G 0 disk
├─vdb1 252:17 0 200M 0 part
│ └─wan-lv01 253:2 0 300M 0 lvm
├─vdb2 252:18 0 200M 0 part
│ └─wan-lv01 253:2 0 300M 0 lvm
├─vdb3 252:19 0 200M 0 part
└─vdb4 252:20 0 423M 0 part
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]# iscsiadm -m node -T iqn.2006-01.com.openfiler:disk01 -p 192.168.122.168 -l
Logging in to [iface: default, target: iqn.2006-01.com.openfiler:disk01, portal: 192.168.122.168,3260] (multiple)
Login to [iface: default, target: iqn.2006-01.com.openfiler:disk01, portal: 192.168.122.168,3260] successful.
[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 4G 0 disk
sr0 11:0 1 1024M 0 rom
vda 252:0 0 30G 0 disk
├─vda1 252:1 0 1G 0 part /boot
└─vda2 252:2 0 29G 0 part
├─nlas-root 253:0 0 26G 0 lvm /
└─nlas-swap 253:1 0 3G 0 lvm [SWAP]
vdb 252:16 0 1G 0 disk
├─vdb1 252:17 0 200M 0 part
│ └─wan-lv01 253:2 0 300M 0 lvm
├─vdb2 252:18 0 200M 0 part
│ └─wan-lv01 253:2 0 300M 0 lvm
├─vdb3 252:19 0 200M 0 part
└─vdb4 252:20 0 423M 0 part
[root@localhost ~]# iscsiadm -m node -T iqn.2006-01.com.openfiler:disk02 -p 192.168.122.168 -l
Logging in to [iface: default, target: iqn.2006-01.com.openfiler:disk02, portal: 192.168.122.168,3260] (multiple)
Login to [iface: default, target: iqn.2006-01.com.openfiler:disk02, portal: 192.168.122.168,3260] successful.
[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 4G 0 disk
sdb 8:16 0 4G 0 disk
sr0 11:0 1 1024M 0 rom
vda 252:0 0 30G 0 disk
├─vda1 252:1 0 1G 0 part /boot
└─vda2 252:2 0 29G 0 part
├─nlas-root 253:0 0 26G 0 lvm /
└─nlas-swap 253:1 0 3G 0 lvm [SWAP]
vdb 252:16 0 1G 0 disk
├─vdb1 252:17 0 200M 0 part
│ └─wan-lv01 253:2 0 300M 0 lvm
├─vdb2 252:18 0 200M 0 part
│ └─wan-lv01 253:2 0 300M 0 lvm
├─vdb3 252:19 0 200M 0 part
└─vdb4 252:20 0 423M 0 part
[root@localhost ~]# iscsiadm -m node -T iqn.2006-01.com.openfiler:disk01 -p 172.16.10.78 -l
Logging in to [iface: default, target: iqn.2006-01.com.openfiler:disk01, portal: 172.16.10.78,3260] (multiple)
Login to [iface: default, target: iqn.2006-01.com.openfiler:disk01, portal: 172.16.10.78,3260] successful.
[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 4G 0 disk
sdb 8:16 0 4G 0 disk
sdc 8:32 0 4G 0 disk
sr0 11:0 1 1024M 0 rom
vda 252:0 0 30G 0 disk
├─vda1 252:1 0 1G 0 part /boot
└─vda2 252:2 0 29G 0 part
├─nlas-root 253:0 0 26G 0 lvm /
└─nlas-swap 253:1 0 3G 0 lvm [SWAP]
vdb 252:16 0 1G 0 disk
├─vdb1 252:17 0 200M 0 part
│ └─wan-lv01 253:2 0 300M 0 lvm
├─vdb2 252:18 0 200M 0 part
│ └─wan-lv01 253:2 0 300M 0 lvm
├─vdb3 252:19 0 200M 0 part
└─vdb4 252:20 0 423M 0 part
[root@localhost ~]# iscsiadm -m node -T iqn.2006-01.com.openfiler:disk02 -p 172.16.10.78 -l
Logging in to [iface: default, target: iqn.2006-01.com.openfiler:disk02, portal: 172.16.10.78,3260] (multiple)
Login to [iface: default, target: iqn.2006-01.com.openfiler:disk02, portal: 172.16.10.78,3260] successful.
[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 4G 0 disk
sdb 8:16 0 4G 0 disk
sdc 8:32 0 4G 0 disk
sdd 8:48 0 4G 0 disk
sr0 11:0 1 1024M 0 rom
vda 252:0 0 30G 0 disk
├─vda1 252:1 0 1G 0 part /boot
└─vda2 252:2 0 29G 0 part
├─nlas-root 253:0 0 26G 0 lvm /
└─nlas-swap 253:1 0 3G 0 lvm [SWAP]
vdb 252:16 0 1G 0 disk
├─vdb1 252:17 0 200M 0 part
│ └─wan-lv01 253:2 0 300M 0 lvm
├─vdb2 252:18 0 200M 0 part
│ └─wan-lv01 253:2 0 300M 0 lvm
├─vdb3 252:19 0 200M 0 part
└─vdb4 252:20 0 423M 0 part
执行login命令后,识别到了sda、sdb、sdc、sdd 4个设备,查看它们的scsi_id;可以看到sda、sdc是同一设备的不同路径,sdb、sdd是同一设备的不同路径.
[root@localhost ~]# udevadm info /sys/class/block/sda |grep SCSI
E: ID_SCSI=1
E: ID_SCSI_SERIAL=H2QdDr-iEIo-5mYB
[root@localhost ~]# udevadm info /sys/class/block/sdb |grep SCSI
E: ID_SCSI=1
E: ID_SCSI_SERIAL=IkmR3y-ATBf-4QW6
[root@localhost ~]# udevadm info /sys/class/block/sdc |grep SCSI
E: ID_SCSI=1
E: ID_SCSI_SERIAL=H2QdDr-iEIo-5mYB
[root@localhost ~]# udevadm info /sys/class/block/sdd |grep SCSI
E: ID_SCSI=1
E: ID_SCSI_SERIAL=IkmR3y-ATBf-4QW6
2.2.3 启动multipathd
启动multipathd服务后,multipathd会自动识别多路径,并自动在/dev/mapper/目录下创建多路径映射后的设备.
[root@localhost ~]# systemctl start multipathd.service
[root@localhost ~]# systemctl status multipathd.service
● multipathd.service - Device-Mapper Multipath Device Controller
Loaded: loaded (/usr/lib/systemd/system/multipathd.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2022-04-06 22:28:10 CST; 7s ago
Process: 28350 ExecStart=/sbin/multipathd (code=exited, status=0/SUCCESS)
Process: 28347 ExecStartPre=/sbin/multipath -A (code=exited, status=0/SUCCESS)
Process: 28344 ExecStartPre=/sbin/modprobe dm-multipath (code=exited, status=0/SUCCESS)
Main PID: 28355 (multipathd)
Tasks: 8
CGroup: /system.slice/multipathd.service
└─28355 /sbin/multipathd
Apr 06 22:28:10 192.168.122.82 systemd[1]: Starting Device-Mapper Multipath Device Controller...
Apr 06 22:28:10 192.168.122.82 systemd[1]: Started Device-Mapper Multipath Device Controller.
Apr 06 22:28:10 192.168.122.82 multipathd[28355]: mpathb: load table [0 8388608 multipath 0 0 2 1 service-time 0 1 1 8:0 1 service-time 0 1 1 8:32 1]
Apr 06 22:28:10 192.168.122.82 multipathd[28355]: mpatha: load table [0 8388608 multipath 0 0 2 1 service-time 0 1 1 8:16 1 service-time 0 1 1 8:48 1]
Apr 06 22:28:10 192.168.122.82 multipathd[28355]: mpathb: event checker started
Apr 06 22:28:10 192.168.122.82 multipathd[28355]: mpatha: event checker started
Apr 06 22:28:10 192.168.122.82 multipathd[28355]: path checkers start up
[root@localhost ~]# ll /dev/mapper/
总用量 0
crw------- 1 root root 10, 236 Apr 6 13:39 control
lrwxrwxrwx 1 root root 7 Apr 6 22:28 mpatha -> ../dm-4
lrwxrwxrwx 1 root root 7 Apr 6 22:28 mpathb -> ../dm-3
lrwxrwxrwx 1 root root 7 Apr 6 13:39 nlas-root -> ../dm-0
lrwxrwxrwx 1 root root 7 Apr 6 13:39 nlas-swap -> ../dm-1
lrwxrwxrwx 1 root root 7 Apr 6 13:39 wan-lv01 -> ../dm-2
[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 4G 0 disk
└─mpathb 253:3 0 4G 0 mpath
sdb 8:16 0 4G 0 disk
└─mpatha 253:4 0 4G 0 mpath
sdc 8:32 0 4G 0 disk
└─mpathb 253:3 0 4G 0 mpath
sdd 8:48 0 4G 0 disk
└─mpatha 253:4 0 4G 0 mpath
sr0 11:0 1 1024M 0 rom
vda 252:0 0 30G 0 disk
├─vda1 252:1 0 1G 0 part /boot
└─vda2 252:2 0 29G 0 part
├─nlas-root 253:0 0 26G 0 lvm /
└─nlas-swap 253:1 0 3G 0 lvm [SWAP]
vdb 252:16 0 1G 0 disk
├─vdb1 252:17 0 200M 0 part
│ └─wan-lv01 253:2 0 300M 0 lvm
├─vdb2 252:18 0 200M 0 part
│ └─wan-lv01 253:2 0 300M 0 lvm
├─vdb3 252:19 0 200M 0 part
└─vdb4 252:20 0 423M 0 part
查看multipathd工作模式,命令multipath -ll
[root@localhost ~]# multipath -ll
mpathb (14f504e46494c45524832516444722d6945496f2d356d5942) dm-3 OPNFILER,VIRTUAL-DISK
size=4.0G features='0' hwhandler='0' wp=rw
|-+- policy='service-time 0' prio=1 status=active
| `- 11:0:0:0 sda 8:0 active ready running
`-+- policy='service-time 0' prio=1 status=enabled
`- 13:0:0:0 sdc 8:32 active ready running
mpatha (14f504e46494c4552496b6d5233792d415442662d34515736) dm-4 OPNFILER,VIRTUAL-DISK
size=4.0G features='0' hwhandler='0' wp=rw
|-+- policy='service-time 0' prio=1 status=active
| `- 12:0:0:0 sdb 8:16 active ready running
`-+- policy='service-time 0' prio=1 status=enabled
`- 14:0:0:0 sdd 8:48 active ready running
从上面输出可以看到,multipathd默认的策略是两条路径一主一备.
2.2.4 multipathd 主/备模式测试
使用dd往/dev/mapper/mpathb中写入数据,数据从sda写入,sdc处于备用状态
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 1505.50 6022.00 0.00 12044 0
sdc 0.00 0.00 0.00 0 0
dm-3 1505.50 6022.00 0.00 12044 0
avg-cpu: %user %nice %system %iowait %steal %idle
0.00 0.00 0.77 23.30 0.51 75.42
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 1018.50 4074.00 0.00 8148 0
sdc 0.00 0.00 0.00 0 0
dm-3 1018.50 4074.00 0.00 8148 0
将sda网络断开,过几秒后,切换到sdc写数据
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 0.00 0.00 0.00 0 0
sdc 1175.50 4702.00 0.00 9404 0
dm-3 1175.50 4702.00 0.00 9404 0
avg-cpu: %user %nice %system %iowait %steal %idle
0.52 0.00 1.30 22.41 1.42 74.35
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 0.00 0.00 0.00 0 0
sdc 1327.50 5310.00 0.00 10620 0
dm-3 1327.50 5310.00 0.00 10620 0
再查看sda、sdc主备情况如下:
mpathb (14f504e46494c45524832516444722d6945496f2d356d5942) dm-3 OPNFILER,VIRTUAL-DISK
size=4.0G features='0' hwhandler='0' wp=rw
|-+- policy='service-time 0' prio=0 status=enabled
| `- 11:0:0:0 sda 8:0 failed faulty running
`-+- policy='service-time 0' prio=1 status=active
`- 13:0:0:0 sdc 8:32 active ready running
2.2.5 multipathd 轮询模式测试
修改multipathd path_grouping_policy、path_selector(路径选择策略),在/etc/multipath.conf配置文件中,加入如下配置修改mpathb的工作模式.
multipaths {
multipath {
wwid 14f504e46494c45524832516444722d6945496f2d356d5942
alias mpathb
path_grouping_policy multibus
path_selector "round-robin 0" #路径轮询
failback manual
rr_weight priorities
no_path_retry 5
}
重启multipathd服务后,查看multipathd工作模式,可以看到sda sdc都处于active状态:
[root@192 ~]# multipath -ll
mpathb (14f504e46494c45524832516444722d6945496f2d356d5942) dm-3 OPNFILER,VIRTUAL-DISK
size=4.0G features='1 queue_if_no_path' hwhandler='0' wp=rw
`-+- policy='round-robin 0' prio=1 status=active
|- 11:0:0:0 sda 8:0 active ready running
`- 13:0:0:0 sdc 8:32 active ready running
mpatha (14f504e46494c4552496b6d5233792d415442662d34515736) dm-4 OPNFILER,VIRTUAL-DISK
size=4.0G features='0' hwhandler='0' wp=rw
|-+- policy='service-time 0' prio=1 status=active
| `- 12:0:0:0 sdb 8:16 active ready running
`-+- policy='service-time 0' prio=1 status=enabled
`- 14:0:0:0 sdd 8:48 active ready running
dd测试mpathb写入数据时的情况如下,sda sdc轮询写入,所以吞吐量一样:
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 646.00 2584.00 0.00 5168 0
sdc 646.00 2584.00 0.00 5168 0
dm-3 1291.50 5168.00 0.00 10336 0
avg-cpu: %user %nice %system %iowait %steal %idle
0.13 0.00 1.43 22.29 1.30 74.84
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 812.50 3250.00 0.00 6500 0
sdc 812.00 3248.00 0.00 6496 0
dm-3 1625.00 6498.00 0.00 12996 0
3. 常用命令
3.1 清除iscsi记录
iscsiadm -m node --logoutall=all #sessison logout
iscsiadm -m node -o delete -T iqn.2006-01.com.openfiler:disk02 -p 192.168.122.168 #删除target记录
iscsiadm -m node -o delete -T iqn.2006-01.com.openfiler:disk01 -p 192.168.122.168
iscsiadm -m node -o delete -T iqn.2006-01.com.openfiler:disk01 -p 172.16.10.78
iscsiadm -m node -o delete -T iqn.2006-01.com.openfiler:disk02 -p 172.16.10.78
rm -rf /var/lib/iscsi/send_targets/*
3.2 target容量调整后,客户端更新
iscsiadm -m session -R