(1).配置ISCSI多路径实现磁盘挂载高可用
如果存储服务器到交换机只有一条线路的时候,那么一条线路出现故障,整个就没法使用了,所以多线路可以解决这个问题,避免单点故障。
1)实验环境
youxi1 192.168.5.101,1.1.5.129 服务端
youxi2 192.168.5.102,1.1.5.130 客户端
2)搭建target服务器
[[email protected] ~]# yum -y install targetcli
[[email protected] ~]# targetcli //进入交互配置
Warning: Could not load preferences file /root/.targetcli/prefs.bin.
targetcli shell version 2.1.fb46
Copyright 2011-2013 by Datera, Inc and others.
For help on commands, type 'help'.
/> /backstores/block create test1 /dev/sdb //使用/dev/sdb创建自定义存储对象test1
Created block storage object test1 using /dev/sdb.
/> /iscsi create iqn.2019-08.com.youxi1:server //创建ISCSI target
Created target iqn.2019-08.com.youxi1:server.
Created TPG 1.
Global pref auto_add_default_portal=true
Created default portal listening on all IPs (0.0.0.0), port 3260.
/> /iscsi/iqn.2019-08.com.youxi1:server/tpg1/acls create iqn.2019-08.com.youxi1:username //创建ACL规则列表名
Created Node ACL for iqn.2019-08.com.youxi1:username
/> /iscsi/iqn.2019-08.com.youxi1:server/tpg1/luns create /backstores/block/test1 //指定存储对象为target的逻辑单元,逻辑单元号为LUN0
Created LUN 0.
Created LUN 0->0 mapping in node ACL iqn.2019-08.com.youxi1:username
/> /iscsi/iqn.2019-08.com.youxi1:server/tpg1/portals/ delete 0.0.0.0 3260 //删除原有监听IP和端口
Deleted network portal 0.0.0.0:3260
/> /iscsi/iqn.2019-08.com.youxi1:server/tpg1/portals/ create 192.168.5.101 3260 //重新指定监听IP和端口
Using default IP port 3260
Created network portal 192.168.5.101:3260.
/> /iscsi/iqn.2019-08.com.youxi1:server/tpg1/portals/ create 1.1.5.129 3260
Using default IP port 3260
Created network portal 1.1.5.129:3260.
/> saveconfig //保存
Configuration saved to /etc/target/saveconfig.json
/> exit //退出
Global pref auto_save_on_exit=true
Last 10 configs saved in /etc/target/backup/.
Configuration saved to /etc/target/saveconfig.json
[[email protected] ~]# systemctl start target && systemctl enable target //启动并开机自启
Created symlink from /etc/systemd/system/multi-user.target.wants/target.service to /usr/lib/systemd/system/target.service.
[[email protected] ~]# yum -y install net-tools
[[email protected] ~]# ss -antup | grep 3260
tcp LISTEN 0 256 192.168.5.101:3260 *:*
tcp LISTEN 0 256 1.1.5.129:3260 *:*
[[email protected] ~]# firewall-cmd --permanent --zone=public --add-port=3260/tcp //防火墙添加端口号
success
[[email protected] ~]# firewall-cmd --reload
success
3)搭建客户端youxi2
[[email protected] ~]# yum -y install iscsi-initiator-utils //安装客户端
[[email protected] ~]# vim /etc/iscsi/initiatorname.iscsi //配置ACL规则列表名称
InitiatorName=iqn.2019-08.com.youxi1:username
[[email protected] ~]# systemctl start iscsid && systemctl enable iscsid //启动并设置开机自启
Created symlink from /etc/systemd/system/multi-user.target.wants/iscsid.service to /usr/lib/systemd/system/iscsid.service.
[[email protected] ~]# iscsiadm -m discovery -t st -p 192.168.5.101 //查找ISCSI设备
1.1.5.129:3260,1 iqn.2019-08.com.youxi1:server
192.168.5.101:3260,1 iqn.2019-08.com.youxi1:server
[[email protected] ~]# iscsiadm -m node --login //登录/连接ISCSI设备
Logging in to [iface: default, target: iqn.2019-08.com.youxi1:server, portal: 1.1.5.129,3260] (multiple)
Logging in to [iface: default, target: iqn.2019-08.com.youxi1:server, portal: 192.168.5.101,3260] (multiple)
Login to [iface: default, target: iqn.2019-08.com.youxi1:server, portal: 1.1.5.129,3260] successful.
Login to [iface: default, target: iqn.2019-08.com.youxi1:server, portal: 192.168.5.101,3260] successful.
[[email protected] ~]# ls /dev/sd* //可以看到出现了sdb和sdc,这两个是同一个硬盘
/dev/sda /dev/sda1 /dev/sda2 /dev/sdb /dev/sdc
[[email protected] ~]# mkfs.xfs /dev/sdb -f //格式化,只有第一次才需要,如果者服务器端或其他客户端已经格式化,无需操作
meta-data=/dev/sdb isize=512 agcount=4, agsize=1310720 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=5242880, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
[[email protected] ~]# mkdir /share //创建挂载目录
[[email protected] ~]# mount /dev/sdb /share/ //挂载
[[email protected] ~]# echo aabbcc > /share/a.txt
[[email protected] ~]# mkdir /share2
[[email protected] ~]# mount /dev/sdc /share2 //这是由于sdb和sdc是同一块盘,它们的UUID是相同的,不能重复挂载
mount: 文件系统类型错误、选项错误、/dev/sdc 上有坏超级块、
缺少代码页或助手程序,或其他错误
有些情况下在 syslog 中可以找到一些有用信息- 请尝试
dmesg | tail 这样的命令看看。
[[email protected] ~]# blkid /dev/sdb /dev/sdc //查看UUID
/dev/sdb: UUID="580a45fc-0957-45ee-bcbd-13ce85e11e59" TYPE="xfs"
/dev/sdc: UUID="580a45fc-0957-45ee-bcbd-13ce85e11e59" TYPE="xfs"
[[email protected] ~]# mount -t xfs -o nouuid /dev/sdc /share2 //跳过UUID进行挂载
[[email protected] ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/vg1-root 17G 1.2G 16G 8% /
devtmpfs 476M 0 476M 0% /dev
tmpfs 488M 0 488M 0% /dev/shm
tmpfs 488M 7.7M 480M 2% /run
tmpfs 488M 0 488M 0% /sys/fs/cgroup
/dev/sda1 1014M 130M 885M 13% /boot
tmpfs 98M 0 98M 0% /run/user/0
/dev/sdb 20G 33M 20G 1% /share
/dev/sdc 20G 33M 20G 1% /share2
4)查看连接结构
[[email protected] ~]# yum -y install tree
[[email protected] ~]# tree /var/lib/iscsi/
/var/lib/iscsi/
├── ifaces
├── isns
├── nodes
│ └── iqn.2019-08.com.youxi1:server
│ ├── 1.1.5.129,3260,1
│ │ └── default
│ └── 192.168.5.101,3260,1
│ └── default
├── send_targets
│ └── 192.168.5.101,3260
│ ├── iqn.2019-08.com.youxi1:server,1.1.5.129,3260,1,default -> /var/lib/iscsi/nodes/iqn.2019-08.com.youxi1:server/1.1.5.129,3260,1
│ ├── iqn.2019-08.com.youxi1:server,192.168.5.101,3260,1,default -> /var/lib/iscsi/nodes/iqn.2019-08.com.youxi1:server/192.168.5.101,3260,1
│ └── st_config
├── slp
└── static
12 directories, 3 files
5)回到服务器端查看连接状态
[[email protected] ~]# ss -antup | grep 3260
tcp LISTEN 0 256 192.168.5.101:3260 *:*
tcp LISTEN 0 256 1.1.5.129:3260 *:*
tcp ESTAB 0 0 1.1.5.129:3260 1.1.5.130:55902
tcp ESTAB 0 0 192.168.5.101:3260 192.168.5.102:40218
(2).在存储客户端上配置多路径设备
在以上基础下继续实验,将同一设备的多路径整合,只呈现出一个设备形式,通过使用。
1)多路径软件Device Mapper Multipath
多路径软件Device Mapper Multipath(DM-Multipath)可以将服务器节点和存储阵列之间的多条I/O链路配置为一个单独的设备。这些I/O链路是由不同的线缆、交换机、控制器组成的SAN物理链路。Multipath将这些链路聚合在一起,生成一个单独的新的设备。
特点:
数据冗余。DM-Multipath可以实现在active/passive(主动/被动)模式下的灾难转移。在active/passive模式下,只有一半的链路在工作,如果链路上的某一部分(线缆、交换机、控制器)出现故障,DM-Multipath就会切换到另一半链路上。
提高性能。DM-Multipath也可以配置为active/active模式,从而I/O任务以round-robin的方式分布到所有的链路上去。通过配置,DM-Multipath还可以检测链路上的负载情况,动态地进行负载均衡。
2)客户端安装多路径软件服务
[[email protected] ~]# yum -y install device-mapper-multipath
[[email protected] ~]# cp /usr/share/doc/device-mapper-multipath-0.4.9/multipath.conf /etc/
[[email protected] ~]# systemctl start multipathd.service //注意,一定要把配置文件拷贝到/etc/目录下,否则会报找不到配置文件
[[email protected] ~]# multipath -ll //没有输出信息表示出错
[[email protected] ~]# umount /share //卸载挂载点
[[email protected] ~]# umount /share2
[[email protected] ~]# systemctl restart iscsid //重启iscsid服务
[[email protected] ~]# systemctl restart multipathd.service //重启multipathd服务
[[email protected] ~]# multipath -ll //再次查看
//36001405179b62d3082e4604ae5326cd6远程存储设备id,dm-2 LIO-ORG厂商,test1产品ID(我们自己设置的)
mpatha (36001405179b62d3082e4604ae5326cd6) dm-2 LIO-ORG ,test1
size=20G features='0' hwhandler='0' wp=rw
|-+- policy='service-time 0' prio=1 status=active //默认使用主动模式的链路
| `- 33:0:0:0 sdb 8:16 active ready running
`-+- policy='service-time 0' prio=1 status=enabled //有效的链路,但不是活动链路
`- 34:0:0:0 sdc 8:32 active ready running
[[email protected] ~]# ll /dev/mapper/mpatha //查看生成的设备文件
lrwxrwxrwx 1 root root 7 8月 23 13:55 /dev/mapper/mpatha -> ../dm-2
每个多路径设备都具备一个全局标识(WWID,World Wide Identifir)。36001405179b62d3082e4604ae5326cd6就是WWID,远程存储设备的产品信息。由于sdb和sdc是同一个远端存储设备,所以产品信息一致,被多路径驱动发现后会生成一个设备文件/dev/mapper/mpatha。
3)启动高可用负载均衡模式
[[email protected] ~]# vim /etc/multipath.conf
//可以再第74行下面添加,也可以从第60行开始启用
multipaths {
multipath {
wwid 36001405179b62d3082e4604ae5326cd6 //指定实际的WWID
alias Web //映射后的别名,自定义
path_grouping_policy multibus //路径组策略
path_selector "round-robin 0" //轮询
failback manual
rr_weight priorities
no_path_retry 5
}
}
[[email protected] ~]# systemctl restart multipathd.service //重启multipathd服务
[[email protected] ~]# systemctl restart iscsid //重启iscsi,重新识别
[[email protected] ~]# multipath -ll //再次查看
Web (36001405179b62d3082e4604ae5326cd6) dm-2 LIO-ORG ,test1
size=20G features='1 queue_if_no_path' hwhandler='0' wp=rw
`-+- policy='round-robin 0' prio=1 status=active //可以看到采用轮询,并且两个都是running
|- 33:0:0:0 sdb 8:16 active ready running
`- 34:0:0:0 sdc 8:32 active ready running
[[email protected] ~]# ll /dev/mapper/Web //可以看到自定义的映射别名
lrwxrwxrwx 1 root root 7 8月 23 15:35 /dev/mapper/Web -> ../dm-2
[[email protected] ~]# mount /dev/mapper/Web /share //挂载可用
[[email protected] ~]# ls /share
a.txt
4)模拟故障
关闭服务器端的ens33(192.168.5.101)网卡
[[email protected] ~]# ifdown ens33
过一段时间查看,并进行测试
[[email protected] ~]# multipath -ll
Web (36001405179b62d3082e4604ae5326cd6) dm-2 LIO-ORG ,test1
size=20G features='1 queue_if_no_path' hwhandler='0' wp=rw
`-+- policy='round-robin 0' prio=1 status=active
|- 33:0:0:0 sdb 8:16 active ready running
`- 34:0:0:0 sdc 8:32 failed faulty running //可以看到sdcfailed
[[email protected] ~]# echo bbb > /share/b.txt
[[email protected] ~]# ls /share
a.txt b.txt
打开服务器端的ens33(192.168.5.101)网卡,可以发现sdc又恢复了正常
[[email protected] ~]# multipath -ll
Web (36001405179b62d3082e4604ae5326cd6) dm-2 LIO-ORG ,test1
size=20G features='1 queue_if_no_path' hwhandler='0' wp=rw
`-+- policy='round-robin 0' prio=1 status=active
|- 33:0:0:0 sdb 8:16 active ready running
`- 34:0:0:0 sdc 8:32 active ready running
(3).使用udev规则为每个target创建固定名字的软链接(了解)
1)udev
udev是Linux kernel 2.6系列的设备管理器。它主要的功能是管理/dev目录底下的设备节点。udev会根据用户添加/删除硬件的行为,自处理/dev目录下所有设备文件。主要配置文件为/etc/udev/udev.conf。设备文件名字规则目录/lib/udev/rules.d/。
[[email protected] ~]# ls /lib/udev/rules.d/ //命名规则开头数字,结尾.rules
10-dm.rules 70-touchpad.rules
11-dm-lvm.rules 70-uaccess.rules
11-dm-mpath.rules 71-biosdevname.rules
13-dm-disk.rules 71-seat.rules
40-redhat.rules 73-idrac.rules
......
运行机制和注意事项:
1、udev按照规则文件名的数字顺序来查询全部规则文件,然后为匹配规则的设备,创建其设备文件或文件链接。
2、通常情况下,建议让自己想要的规则文件最先被解析。比如,创建一个名为 /etc/udev/rules.d/10-myrule.rules的文件,并把你的规则写入该文件,这样udev就会在解析系统默认的规则文件之前解析到你的文件。
3、在规则文件里,除了以“#”开头的行(注释),所有的非空行都被视为一条规则,但是一条规则不能扩展到多行。
4、规则都是由多个键值对(key-valuepairs)组成,并由逗号隔开,键值对可以分为条件匹配键值对(以下简称“匹配键”)和赋值键值对(以下简称“赋值键”),一条规则可以有多条匹配键和多条赋值键。
5、匹配键是匹配一个设备属性的条件,当一个设备的属性匹配了该规则里所有的匹配键,就认为这条规则生效,然后按照赋值键的内容,执行该规则的赋值。
udev规则的匹配键:
1. ACTION: 事件 (uevent) 的行为,例如:add( 添加设备 )、remove( 删除设备 )。
2. KERNEL: 内核设备名称,例如:sda, cdrom。
3. DEVPATH:设备的devpath 路径。
4. SUBSYSTEM: 设备的子系统名称,例如:sda 的子系统为 block。
5. BUS: 设备在 devpath 里的总线名称,例如:usb。
6. DRIVER: 设备在 devpath 里的设备驱动名称,例如:ide-cdrom。
7. ID: 设备在 devpath 里的识别号。
8. SYSFS{filename}: 设备的 devpath 路径下,设备的属性文件“filename”里的内容。
9. ENV{key}: 环境变量。在一条规则中,可以设定最多五条环境变量的 匹配键。
1.PROGRAM:调用外部命令。
2.RESULT: 外部命令 PROGRAM 的返回结果。
udev重要的赋值键:
1. NAME:在 /dev下产生的设备文件名。只有第一次对某个设备的 NAME 的赋值行为生效,之后匹配的规则再对该设备的 NAME 赋值行为将被忽略。如果没有任何规则对设备的 NAME 赋值,udev 将使用内核设备名称来产生设备文件。
2. SYMLINK:为 /dev/下的设备文件产生符号链接。由于 udev 只能为某个设备产生一个设备文件,所以为了不覆盖系统默认的 udev 规则所产生的文件,推荐使用符号链接。
3. OWNER, GROUP, MODE:为设备设定权限。
4. ENV{key}:导入一个环境变量
udev规则操作符:
1. “==”:比较键、值,若等于,则该条件满足;
2. “!=”: 比较键、值,若不等于,则该条件满足;
3. “=”: 对一个键赋值;
4. “+=”:为一个表示多个条目的键赋值。
5.“:=”:对一个键赋值,并拒绝之后所有对该键的改动。目的是防止后面的规则文件对该键赋值。
说明:如果有一个设备被内核实别为sdb1,则该条件生效,执行后面的赋值:在/dev下产生一个名为my_ disk的设备文件,并把设备文件的权限设为0666。
2)在客户端上定义udev规则
查看共享磁盘的UUID
[[email protected] ~]# /usr/lib/udev/scsi_id -g -u /dev/sdb
36001405179b62d3082e4604ae5326cd6
添加一个新的udev规则
[[email protected] ~]# vim /etc/udev/rules.d/10-sda.rules //底下规则不能转行,这里转行是为了方便查看
KERNEL=="sdb",SUBSYSTEM=="block",PROGRAM="/usr/lib/udev/scsi_id -g -u /dev/sdb",
RESULT=="36001405179b62d3082e4604ae5326cd6",SYMLINK+="my-disk",MODE="0660"
说明:
KERNEL:匹配内核设备名称;
SUBSYSTEM:匹配设备的子系统名称,例如:sda 的子系统为block。udevadm info -a -p /sys/block;
PROGRAM:调用外部命令;
RESULT: 匹配外部命令PROGRAM的返回结果;
SYMLINK:为/dev/下的设备文件产生符号链接。由于udev 只能为某个设备产生一个设备文件,所以为了不覆盖系统默认的udev 规则所产生的文件,推荐使用符号链接。
MODE:设置设备的权限
告知内核,磁盘信息发生了变化,既可以查看
[[email protected] ~]# /sbin/partprobe /dev/sdb //命令二选一即可
[[email protected] ~]# systemctl restart systemd-udev-trigger
[[email protected] ~]# ll /dev/my-disk //查看my-disk
lrwxrwxrwx 1 root root 3 8月 23 17:04 /dev/my-disk -> sdb
使用方法
[[email protected] ~]# umount /share
[[email protected] ~]# mount /dev/my-disk /share //这是因为多路径软件正在使用
mount: /dev/sdb 已经挂载或 /share 忙
[[email protected] ~]# systemctl stop multipathd && systemctl disable multipathd
Removed symlink /etc/systemd/system/sysinit.target.wants/multipathd.service.
[[email protected] ~]# init 6 //重启
[[email protected] ~]# iscsiadm -m discovery -t st -p 192.168.5.101 //重新发现iscsi设备
1.1.5.129:3260,1 iqn.2019-08.com.youxi1:server
192.168.5.101:3260,1 iqn.2019-08.com.youxi1:server
[[email protected] ~]# iscsiadm -m node --login //重新登录iscsi设备
Logging in to [iface: default, target: iqn.2019-08.com.youxi1:server, portal: 1.1.5.129,3260] (multiple)
Logging in to [iface: default, target: iqn.2019-08.com.youxi1:server, portal: 192.168.5.101,3260] (multiple)
Login to [iface: default, target: iqn.2019-08.com.youxi1:server, portal: 1.1.5.129,3260] successful.
Login to [iface: default, target: iqn.2019-08.com.youxi1:server, portal: 192.168.5.101,3260] successful.
[[email protected] ~]# mount /dev/my-disk /share
[[email protected] ~]# ls /share
a.txt b.txt
说明:multipathd本身就可以给存储设备起一个名字了,有了multipathd就不需要udev来起名字了。所以两者是冲突的,只能同时使用一种方法给存储设备命名。所以一般情况,我们直接使用iscsi存储+多路径就可以了。