iscsi序列二、iscsi多路径配置方式
一、ISCSI多路径应用
如果存储服务器到交换机只有一条线路的时候,那么一条线路出线故障,整个就没法使用了,所以多线路可以解决这个问题,避免单点故障
如上图,如果SAN服务器与客户端交换机只有一条线路相连,那么如果交换机或者线路出现故障,那么整个通讯中断,
如图二,SAN服务器与我们的客户端有两条以上的线路相连,当然或许是一台交换机,也或许是两台交换机用冗余,那么其中一台交换机或者一条线路中断,我们的整个通讯依然正常,这就是多路径的作用!也就是实用多路径,避免了单点故障带给我们的损失!
通过VMware模拟多路径,使用下面的拓扑:
实验环境: xuegod63,xuegod64配置双网卡 。
服务端:xuegod63.cn IP:192.168.1.63 ens32 ; IP:192.168.2.63 ens35 , vmnet4
客户端:xuegod64.cn IP:192.168.1.64 ens32 ; IP:192.168.2.64 ens35 , vmnet4
将xuegod63配置成ip san,将xuegod63上的sdb1分区,通过ip san 共享出去。(查看搭建iscsi存储系统这节内容)
服务器端: target xuegod63
客户端: initiator xuegod64
配置网络环境:
服务端xuegod63 添加一块网卡:
生成ens35配置文件,配置IP ,192.168.2.63
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 | [root@xuegod63 ~] # vim /etc/sysconfig/network-scripts/ifcfg-ens35 TYPE= "Ethernet" PROXY_METHOD= "none" BROWSER_ONLY= "no" BOOTPROTO= "none" DEFROUTE= "yes" IPV4_FAILURE_FATAL= "yes" IPV6INIT= "yes" IPV6_AUTOCONF= "yes" IPV6_DEFROUTE= "yes" IPV6_FAILURE_FATAL= "no" IPV6_ADDR_GEN_MODE= "stable-privacy" NAME= "ens35" DEVICE= "ens35" NBOOT= "yes" IPADDR= "192.168.2.63" PREFIX= "24" IPV6_PRIVACY= "no" [root@xuegod63 Desktop] # systemctl restart network 或 ifdown ens35;ifup ens35 [root@xuegod63 ~] # ifconfig #查看网络 ens32: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.1.63 netmask 255.255.248.0 broadcast 192.168.7.255 inet6 fe80::5002:d1:8a0:7840 prefixlen 64 scopeid 0x20<link> ether 00:50:56:30:c6:51 txqueuelen 1000 (Ethernet) RX packets 7516 bytes 539083 (526.4 KiB) RX errors 0 dropped 4 overruns 0 frame 0 TX packets 303 bytes 36655 (35.7 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 ens35: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.2.63 netmask 255.255.255.0 broadcast 192.168.2.255 inet6 fe80::6f57:c34c:3709:2e72 prefixlen 64 scopeid 0x20<link> ether 00:0c:29:89:00:c2 txqueuelen 1000 (Ethernet) RX packets 9 bytes 779 (779.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 19 bytes 1370 (1.3 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 |
客户端xuegod64 也添加一块网卡
生成ens35配置文件,IP ,192.168.2.64
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | [root@xuegod64 ~] # vim /etc/sysconfig/network-scripts/ifcfg-ens35 TYPE= "Ethernet" PROXY_METHOD= "none" BROWSER_ONLY= "no" BOOTPROTO= "none" DEFROUTE= "yes" IPV4_FAILURE_FATAL= "yes" IPV6INIT= "yes" IPV6_AUTOCONF= "yes" IPV6_DEFROUTE= "yes" IPV6_FAILURE_FATAL= "no" IPV6_ADDR_GEN_MODE= "stable-privacy" NAME= "ens35" DEVICE= "ens35" NBOOT= "yes" IPADDR= "192.168.2.64" PREFIX= "24" IPV6_PRIVACY= "no" [root@xuegod64 ~] # systemctl restart network |
安装服务端target并配置(请参照搭建iscsi存储系统内容)
1 | [root@xuegod63 ~] # yum -y install targetcli |
增加双IP
1 2 3 | [root@xuegod63 ~] # targetcli /> iscsi /iqn .2018-04.cn.xuegod:server /tpg1/portals/ create 192.168.1.63 3260 /> iscsi /iqn .2018-04.cn.xuegod:server /tpg1/portals/ create 192.168.2.63 3260 |
配置客户端: xuegod64
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | 安装包 [root@xuegod64 ~] # yum install -y iscsi-initiator-utils 启动iscsi服务 [root@xuegod64 ~] # systemctl start iscsi 设置开机启动服务 [root@xuegod64 ~] # systemctl enable iscsi [root@xuegod64 ~] # systemctl enable iscsid 配置ISCSIInitiator名称 注:此处InitiatorName必须与服务端配置的ACL允许ISCSI客户机连接的名称一致。 [root@xuegod64 ~] # vim /etc/iscsi/initiatorname.iscsi InitiatorName=iqn.2018-04.cn.server:xugod64 重启服务 [root@xuegod64 ~] # systemctl restart iscsid 发现(查找)ISCSI设备 [root@xuegod64 ~] # iscsiadm -m discovery -t st -p 192.168.2.63 连接ISCSI设备 [root@xuegod64 ~] # iscsiadm -m node --login 查看系统磁盘信息 [root@xuegod64 ~] # ls /dev/sd* ….. /dev/sdb /dev/sdc |
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 | 格式化挂载(已格式化忽略) [root@xuegod64 ~] # mkfs.xfs /dev/sdb 测试挂载写数据 [root@xuegod64 ~] # mount /dev/sdb /opt [root@xuegod64 ~] # echo aabbcc >/opt/a.txt 挂载另一路径设备 root@xuegod64 ~] # mkdir /test [root@xuegod64 ~] # mount /dev/sdc /test 挂载报错了吧? [root@xuegod64 ~] #blkid /dev/sdc /dev/sdb #对比一下,发现UUID一样的, 相同id不能重复挂载 解决方法: [root@xuegod64 ~] #mount -t xfs -o nouuid /dev/sdc /test #跳过UUID挂载 [root@xuegod64 ~] # df -h Filesystem Size Used Avail Use% Mounted on /dev/sda2 9.7G 3.7G 5.5G 41% / tmpfs 569M 0 569M 0% /dev/shm /dev/sda1 194M 28M 157M 15% /boot /dev/sr0 3.4G 3.4G 0 100% /mnt /dev/sdc 5.0G 138M 4.6G 3% /test /dev/sdb 5.0G 138M 4.6G 3% /opt 在xuegod63服务端查看链接状态 [root@xuegod63 ~] # netstat -antup | grep 3260 查看连接结构: [root@xuegod64 ~] #yum –y install tree [root@xuegod64 ~] # tree /var/lib/iscsi/ /var/lib/iscsi/ ├── ifaces ├── isns ├── nodes │ └── iqn.2015-01.cn.xuegod.www:target_san1 │ ├── 192.168.1.63,3260,1 │ │ └── default │ └── 192.168.2.63,3260,1 │ └── default ├── send_targets │ ├── 192.168.1.63,3260 │ │ ├── iqn.2015-01.cn.xuegod.www:target_san1,192.168.1.63,3260,1,default -> /var/lib/iscsi/nodes/iqn .2015-01.cn.xuegod.www:target_san1 /192 .168.1.63,3260,1 │ │ └── st_config │ └── 192.168.2.63,3260 │ ├── iqn.2015-01.cn.xuegod.www:target_san1,192.168.2.63,3260,1,default -> /var/lib/iscsi/nodes/iqn .2015-01.cn.xuegod.www:target_san1 /192 .168.2.63,3260,1 │ └── st_config |
二、实战: 在存储客户端xuegod64上配置多路径
多路径软件Device Mapper Multipath(DM-Multipath)可以将服务器节点和存储阵列之间的多条I/O链路配置为一个单独的设备。这些I/O链路是由不同的线缆、交换机、控制器组成的SAN物理链路。Multipath将这些链路聚合在一起,生成一个单独的新的设备。
1.DM-Multipath概览:
(1)数据冗余
DM-Multipath可以实现在active/passive模式下的灾难转移。在active/passive模式下,只有一半的链路在工作,如果链路上的某一部分(线缆、交换机、控制器)出现故障,DM-Multipath就会切换到另一半链路上。
(2)提高性能
DM-Multipath也可以配置为active/active模式,从而I/O任务以round-robin的方式分布到所有的链路上去。通过配置,DM-Multipath还可以检测链路上的负载情况,动态地进行负载均衡。
2. 软件安装
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 安装多路经软件 [root@xuegod64 ~] # yum install device-mapper-multipath -y 使用默认配置文件启动 [root@xuegod64 ~] # cp /usr/share/doc/device-mapper-multipath-0.4.9/multipath.conf /etc/ [root@xuegod64 ~] # systemctl restart multipathd [root@xuegod64 ~] # multipath -ll #没有输出消息。 表示出错了。 解决:把正在使用中的sdb和sdbc卸载了 [root@xuegod64 ~] # umount /opt [root@xuegod64 ~] # umount /test [root@xuegod64 ~] # /etc/init.d/iscsi restart [root@xuegod64 ~] # systemctl restart multipathd [root@xuegod64 ~] # multipath –ll |
36001405f4ddd118ad384b69b30433220(远程存储设备id)dm-2 LTO-ORG(厂商) ,sun1(产品ID) size=5.0G features='0' hwhandler='0' wp=rw
|-+- policy='service-time 0' prio=1 status=active #默认使用active的链路
| `- 34:0:0:1 sdb 8:16 active ready running
`-+- policy='service-time 0' prio=1 status=enabled #有效的链路,但不是活动链路
`- 35:0:0:1 sdc 8:32 active ready running
#默认配置并不会实现负载均衡,只会实现高可用的效果。
# (36001405f4ddd118ad384b69b30433220) 远程存储设备的产品信息,由于sdb和sdc对应的都是远端同一个存储,所以产品信息是一样的,最后被多路经驱动发现,所以为他们生成了一个设备文件/dev/mapper/mpatha
1 2 | [root@xuegod64 ~] # ll /dev/mapper/mpatha* lrwxrwxrwx 1 root root 7 1月 13 09:02 /dev/mapper/mpatha -> .. /dm-2san |
三、实战2:修改配置文件,启动高可用负载均衡模式,并自定义多路经设备文件的名字
1 | [root@xuegod64 ~] # vim /etc/multipath.conf |
注销掉下面三行内容
请在此模版下写内容:
1 2 3 4 5 6 7 8 9 10 11 12 | 在74行以下插入以下内容:3600140510a3f0e98a0c4ec1a9a34f762 multipaths { multipath { wwid " 36001405f4ddd118ad384b69b30433220" #填写硬盘产品关键信息 alias webdata #映射后的别名,可以随便取 path_grouping_policy multibus #路径组策略 path_selector "round-robin 0" failback manual rr_weight priorities no_path_retry 5 } } |
重启服务multipathd,测试负载均衡:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | [root@xuegod64 ~] # systemctl restart multipathd [root@xuegod64 ~] # systemctl restart iscsi #需要重新识别一下存储 再次查看: [root@xuegod64 ~] # multipath -ll webdata (36001405f4ddd118ad384b69b30433220) dm-2 xuegod ,target1 size=5.0G features= '1 queue_if_no_path' hwhandler= '0' wp=rw `-+- policy= 'round-robin 0' prio=1 status=active |- 34:0:0:1 sdb 8:16 active ready running `- 35:0:0:1 sdc 8:32 active ready running 注:之前相当于主备,现在相当于负载均衡 。 测试: [root@xuegod64 ~] # ls /dev/mapper/webdata* webdata # webdata对应硬盘中的对应硬盘sdb [root@xuegod64 ~] # mount /dev/mapper/webdata /opt [root@xuegod64 ~] # cp /etc/hosts /opt [root@xuegod64 ~] # ls /opt lost+found passwd hosts |
四、故障模拟
断开一条链路。测试链路高可用,关闭其中一个网卡,多路经驱动需要约1分钟的时间,去识别链路故障
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 | [root@xuegod63 ~] # ifdown ens32 查看链路状态: [root@xuegod64 ~] # multipath -ll #多路经驱动需要约1分钟的时间,去识别链路故障 |- 12:0:0:1 sdb 8:16 active faulty running # 链接运行不正常 faulty故障 |- 13:0:0:1 sdc 8:32 active ready running #会卡在这个地方,大约一分钟后,检测故障结束 [root@xuegod64 ~] # multipath -ll |- 12:0:0:1 sdb 8:16 failed faulty running #1分钟后,显示链路连接失败。 |- 13:0:0:1 sdc 8:32 active ready running 测试写入数据: [root@xuegod64 ~] # cp -r /boot/grub/ /opt/ [root@xuegod64 ~] # ls /mnt/ grub lost+found passwd hosts 注:数据可以正常写入,说明,高可用成功。 打开链路,过一段时间再看: [root@xuegod63 ~] # ifup ens32 [root@xuegod64 ~] # multipath -ll |- 8:0:0:1 sdb 8:16 active ready running |- 9:0:0:1 sdc 8:32 active ready running #链路运行正常 |
五、实战:在应用服务器上使用udev规则为target创建固定名字的软链接
udev概述: udev 是Linux kernel 2.6系列的设备管理器。它主要的功能是管理/dev目录底下的设备节点。udev会根据用户添加/删除硬件的行为,自处理/dev目录下所有设备文件。
主配置文件:/etc/udev/udev.conf
设备文件名字规则目录:
[root@xuegod64 ~]# ls /lib/udev/rules.d/10-dm.rules
命名规律: 开头为数字, 结尾是 .rules
运行机制和注意事项:
1、udev按照规则文件名的数字顺序来查询全部规则文件,然后为匹配规则的设备,创建其设备文件或文件链接。
2、通常情况下,建议让自己想要的规则文件最先被解析。比如,创建一个名为 /etc/udev/rules.d/10-myrule.rules的文件,并把你的规则写入该文件,这样udev就会在解析系统默认的规则文件之前解析到你的文件。
3、在规则文件里,除了以“#”开头的行(注释),所有的非空行都被视为一条规则,但是一条规则不能扩展到多行。
4、规则都是由多个键值对(key-valuepairs)组成,并由逗号隔开,键值对可以分为条件匹配键值对(以下简称“匹配键”)和赋值键值对(以下简称“赋值键”),一条规则可以有多条匹配键和多条赋值键。
5、匹配键是匹配一个设备属性的条件,当一个设备的属性匹配了该规则里所有的匹配键,就认为这条规则生效,然后按照赋值键的内容,执行该规则的赋值。
说明:如果有一个设备被内核实别sdb1,则该条件生效,执行后面的赋值:在/dev下产生一个名为my_ disk的设备文件,并把设备文件的权限设为0666。
详细参数说明
udev规则的匹配键
- ACTION: 事件 (uevent) 的行为,例如:add( 添加设备 )、remove( 删除设备 )。
- KERNEL: 内核设备名称,例如:sda, cdrom。
- DEVPATH:设备的 devpath 路径。
- SUBSYSTEM: 设备的子系统名称,例如:sda 的子系统为 block。
- BUS: 设备在 devpath 里的总线名称,例如:usb。
- DRIVER: 设备在 devpath 里的设备驱动名称,例如:ide-cdrom。
- ID: 设备在 devpath 里的识别号。
- SYSFS{filename}: 设备的 devpath 路径下,设备的属性文件“filename”里的内容。
- ENV{key}: 环境变量。在一条规则中,可以设定最多五条环境变量的 匹配键。
- PROGRAM:调用外部命令。
- RESULT: 外部命令 PROGRAM 的返回结果。
udev重要的赋值键
- NAME:在 /dev下产生的设备文件名。只有第一次对某个设备的 NAME 的赋值行为生效,之后匹配的规则再对该设备的 NAME 赋值行为将被忽略。如果没有任何规则对设备的 NAME 赋值,udev 将使用内核设备名称来产生设备文件。
- SYMLINK:为 /dev/下的设备文件产生符号链接。由于 udev 只能为某个设备产生一个设备文件,所以为了不覆盖系统默认的 udev 规则所产生的文件,推荐使用符号链接。
- OWNER, GROUP, MODE:为设备设定权限。
- ENV{key}:导入一个环境变量
udev规则操作符
- “==”:比较键、值,若等于,则该条件满足;
- “!=”: 比较键、值,若不等于,则该条件满足;
- “=”: 对一个键赋值;
- “+=”:为一个表示多个条目的键赋值。
- “:=”:对一个键赋值,并拒绝之后所有对该键的改动。目的是防止后面的规则文件对该键赋值。
# KERNEL是匹配键,NAME和MODE是赋值键。
仅当操作符是“==”或者“!=”时,其为匹配键;若为其他操作符时,都是赋值键。
相关文章:http://www.361way.com/udev-disk-order/3954.html
实战:在应用服务器xuegod64上使用udev规则为每个target创建固定名字的软链接
对iscsi多路径共享的设备设备,让内核识别成:my_disk
在进行udev绑定的时候,可以是一个未分区的磁盘,也可以是磁盘的一个分区。
查看共享设备磁盘的UUID:
1 2 3 4 5 6 7 8 | [root@xuegod62 rules.d] # /usr/lib/udev/scsi_id -g -u /dev/sdb 36001405f4ddd118ad384b69b30433220 或执行: /lib/udev/scsi_id --whitelisted --replace-whitespace /dev/sdb [root@xuegod62 rules.d] # vim /etc/udev/rules.d/10-sda.rules #写入以下内容 KERNEL== "sdb" ,SUBSYSTEM== "block" ,PROGRAM= "/usr/lib/udev/scsi_id -g -u /dev/sdb" , RESULT== "36001405f4ddd118ad384b69b30433220" , SYMLINK+= "my-disk1" , MODE= "0660" |
注意不能有空格
参数:
# KERNEL是匹配键, SUBSYSTEM:设备的子系统名称,例如:sda 的子系统为block。udevadm info -a -p /sys/block
# PROGRAM:调用外部命令;
# RESULT: 外部命令 PROGRAM 的返回结果。
# SYMLINK:为/dev/下的设备文件产生符号链接。由于udev 只能为某个设备产生一个设备文件,所以为了不覆盖系统默认的udev 规则所产生的文件,推荐使用符号链接。
# MODE:为设备设定权限
通知内核磁盘信息的变化
[root@xuegod62]# /sbin/partprobe /dev/sdb 或者 systemctl restart systemd-udev-trigger
# /sbin/partprobe /dev/sd* 通常使用该命令让新的规则文件立即生效
# udev 的日志一般没有标准输出,所有的udev 相关信息都按照配置文件(udev.conf)的参数设置,由/var/log/messages记录。
查看:
[root@xuegod64 rules.d]# ll /dev/my_disk
lrwxrwxrwx 1 root root 4 1月 24 14:19 /dev/my-disk1 -> sdb
[root@xuegod64 rules.d]# mount /dev/my_disk /opt/
#如果无法挂载使用,请卸载multipath重启系统后再测试。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南