本文详细介绍如何利用Linux自带的Devicemapper multipathing (DM-Multipath)功能模拟多路径聚合。
当服务器可以通过多条路径访问LUN时,Linux系统会为每条路径创建一个SCSI设备,这就意味着,如果服务器有两条路径访问LUN时,这个LUN在服务器上可能会映射成/dev/sdd和 /dev/sdf两个设备。
为了解决这个问题,DM-Multipath会聚合所有路径,在/dev/mapper/ 为这个LUN下创建一个设备.例如,/dev/mapper/360a9800043346852563444717a513571就是聚合/dev/sddand /dev/sdf产生的多路径设备。
使用DM-Multipath后, 应该使用/dev/mapper/下的设备来创建文件系统,然后再挂载。
一、实验环境
1.网络拓扑
2.服务器环境
(1)测试服务器的环境
u一台Centos6.4服务器作为客户端,用于挂载iSCSI存储
u为了模拟多路径的环境,服务器配置了两块网卡,分别接在VMnet9和VMnet10上
u网络配置如下
eth0:192.168.137.100/24
eth1:172.16.1.2/24
(2)Openfiler iSCSI服务器环境
u增加一块30G的虚拟硬盘,模拟磁盘阵列
u增加一块网卡,模拟阵列的第二个控制器,两块网卡分别接在VMnet9和VMnet10上
u网络配置如下
eth0:192.168.137.50/255.255.255.0
eth1:172.16.1.1/255.255.255.0
二、配置测试服务器
服务器安装Centos 6.4的过程略过
1.配置测试服务器网络参数
(1)关闭NetworkManager
[root@linux ~]#service NetworkManager stop [root@linux ~]#chkconfig NetworkManager off
(2)关闭防火墙
[root@linux ~]# iptables –F [root@linux ~]#chkconfig iptables off
(3)关闭Selinux
[root@linux ~]# vi /etc/selinux/config
将文件中的:SELINUX=enforcing
改为:SELINUX= disabled
存盘退出。
(4)添加网卡
将虚拟机关闭后,添加一块网卡,绑定到VMnet10,如下图所示
点击“确定”,然后重启服务器。执行如下命令:
[root@ linux ~]#ifconfig –a
可见,系统已经识别到两块网卡。
进入/etc/sysconfig/network-scripts/目录:
[root@linux~]# cd /etc/sysconfig/network-scripts [root@linux ~]# ls
如下图所示:
除了第一块网卡,并没有其他网卡的配置文件,需要手工创建:
[root@linux ~]# cd/etc/sysconfig/network-scripts [root@linux network-scripts]#cp ifcfg-eth0 ifcfg-eth1
修改新创建的配置文件中的IP地址、MAC地址和UUID以及其他网络参数
那么如何获得eth1的MAC地址和UUID呢?
[root@linux network-scripts]# ifconfig eth1
从中可以得到MAC地址,另外执行下面命令,可以新生成一个UUID
[root@linux network-scripts] uuidgen 4d487f45-4d27-4663-a93f-71903608a8bd
开始编辑ifcfg-eth1文件
[root@rac-1 network-scripts]# vi ifcfg-eth1
修改后的结果如下所示:
存盘退出后,重启网路服务
[root@rac-1 network-scripts]# service network restart
再此查看网卡信息:
可见两块网卡工作都正常。
2.安装所需的软件
(1)安装iSCSI探测器
[root@linux~]# yum -y install iscsi-initiator-utils
(2)安装multipath软件包:
[root@linux ~]#yum -y installdevice-mapper [root@linux ~]# yum -y install device-mapper-multipath
(3)启动mutipath服务
[root@linux ~]# servicemultipathd start Starting multipathd daemon:[OK] [root@linux ~]# chkconfigmultipathd on
二、配置OpenFiler服务器
1.安装Openfiler服务器
Openfiler软件可以从http://www.openfiler.com/community/download下载,它是一个包含linux系统的安装光盘,最新版本是2.99。在VM9中创建新虚拟机,具体过程省略
2.添加iSCSI磁盘
首先将openfiler服务器关机,然后编辑stor属性,如下图所示:
单击“Add”,弹出窗口如下图所示:
选择“Hard Disk”,然后单击“Next”,如下图所示:
选择“Create a new virtual disk” 然后单击“Next”,如下图所示:
在“Virtual disk type”中选择“SCSI(Recommanded)”,
在Mode中选择“Independent”以及“Persistent”
然后单击“Next”,如下图所示:
磁盘大小设为30G,勾选“All all disk space now”,并选择“Storevirtual disk as a single file”, 然后单击“Next”,如下图所示:
单击“Finish”完成磁盘添加工作
3.配置Openfiler服务器
在宿主机的浏览器中输入:
https://192.168.137.50:446
即可访问并配置Openfile,如下图所示:
(1)配置允许访问的网络
单击菜单“system”,在Network Access Configuration中输入下面内容:
Name:SAN1
Network/Host:192.168.137.0
Netmask:255.255.255.0
Type:share
上面的配置允许192.168.137.0网段的服务器可以访问iSCSI
然后单击“Update”保存修改。
(2)配置物理磁盘
可以理解成把物理硬盘格式化
单击菜单中的“Volumn”,进入原始设备配置界面,如下图所示:
单击图片下方中的链接“create new physical volumes.”,如下图所示:
可以看出,/dev/sda是opefiler服务器的系统盘,/dev/sdb是我们计划用来为RAC服务的iSCSI磁盘。
单击“/dev/sdb”链接,如下图所示:
单击“Create”,创建iSCSI磁盘,如下图所示:
到此,原始设备的配置完成,下面开始为iSCSI配置卷组
(3)配置iSCSI卷组
卷组的作用是把几个物理硬盘组合成一个逻辑大硬盘。
单击右侧菜单中的“VolumnGroup”,如下图所示
在“Volumn groupname”中输入:rac-shared-disk
并勾选“/dev/sdb”
然后单击“Add VolumnGroup”,创建完成后,结果如下所示:
(4)配置iSCSI逻辑卷
上一步创建了逻辑硬盘后,对这个硬盘进行分区,就是我们所说的创建逻辑卷
Openfiler对磁盘的管理与Linux的LVM概念类似,在卷组上还需要创建一个或多个逻辑卷,系统才能使用。
单击右侧菜单中的“AddVolumn”,如下图所示:
在”Volume Name”中输入:ocrvdisk1
在“Volumn Space”中输入:5000
“FileSystem/VolumnType”选择::Block(iSCSI、FC)
然后单击“Create”,创建一个逻辑卷。如下图所示:
重复上面的步骤,继续增加下面的逻辑卷:
名字:ocrvdisk2大小:14000M,类型:Block(iSCSI、FC)
注意不要将所有磁盘空间用完,最好保留一点。
创建完成后,单击右侧菜单中的”ManagerVolumn“可以查看所有逻辑卷,如下图所示:
(5)创建iSCSI Target
逻辑卷创建后,数据库服务器是无法直接将逻辑卷挂载到本地,需要通过iSCSI探测器探测Openfiler服务器上的iSCSI Target设备后,才能挂载。
注意:每个逻辑卷都需要创建一个iSCSI Target
下面开始创建iSCSITarget。
在openfiler的菜单上,单击”Services“,如下图所示:
目前iSCSI Target状态是未启动,系统引导时不自动启动。
单击iSCSI Target的”Enable“和”start“,启动iSCSITarget服务,同时设置为引导时自动启动。
然后单击菜单中的”Volumn“,在右侧选择”iSCSI Target“,如下图所示
为了便于识别,我喜欢用更具含义的字串来替换这个默认目标 IQN 最后一段。对于第一个 iSCSI 目标(ocrvdisk1),我将这样来修改默认的目标 IQN:将字符串“tsn.ddd42559ac4f”替换为“ocrvdisk1”,然后单击”Add“,添加一个iSCSI Target,如下图所示:
增加iSCSI Target后的界面如下所示
(6)磁盘映射到iSCSI Target
需要将9.3.4中创建的逻辑磁盘ocrvdisk1映射到iSCSI Target上。
单击上图中的”LUNMapping“,然后点击ocrvdisk逻辑盘后面的”Map“按钮
单击“Network ACL“,如下图所示
修改“Access“的值为”Allow“,然后单击“Update”
重复上面的步骤,继续创建另一个iSCSITarget,并将剩下的逻辑磁盘映射到iSCSI Target上。并将Target的Network ACL都设为Allow
至此完成了iSCSI的搭建工作。
三、挂载iSCSI存储
(1)查看iSCSI存储
在测试服务器上,执行下面命令探测Openfiler服务器的iSCSI Target
[root@linux init.d]# iscsiadm -m discovery-t sendtargets -p 192.168.137.50:3260
返回如下内容:
192.168.137.50:3260,1 iqn.2006-01.com.openfiler:ocrvdisk2
172.16.1.1:3260,1 iqn.2006-01.com.openfiler:ocrvdisk2
192.168.137.50:3260,1 iqn.2006-01.com.openfiler:ocrvdisk1
172.16.1.1:3260,1 iqn.2006-01.com.openfiler:ocrvdisk1
表明iSCSI客户端已经正确识别到共享存储,
在openfiler存储上配置的是两个盘,但是这里却显示了4块硬盘,这是有多路径造成的。
(2)挂载iSCSI磁盘
根据上面探测的结果,执行下面命令,挂载共享磁盘:
[root@linux ~]# iscsiadm -m node -T iqn.2006-01.com.openfiler:ocrvdisk1 -p192.168.137.50 -l
iqn.2006-01.com.openfiler:ocrvdisk1是步骤1探测iscsi target返回的结果
返回信息如下:
Loggingin to [iface: default, target: iqn.2006-01.com.openfiler:ocrvdisk1, portal:192.168.137.50,3260] (multiple) Login to[iface: default, target: iqn.2006-01.com.openfiler:ocrvdisk1, portal:192.168.137.50,3260] successful.
显示挂载成功
重复上面的步骤,将第二块共享磁盘都挂载到本地。
(3)查看挂载的iSCSI磁盘
[root@linux ~]#lsblk NAMEMAJ:MIN RMSIZE RO TYPE MOUNTPOINT sr011:014.1G0 rom sda8:0040G0 disk ?..sda18:10200M0 part /boot ?..sda28:205.9G0 part [SWAP] ?..sda38:305.9G0 part /tmp ?..sda48:401K0 part ?..sda58:50 28.1G0 part / sdc8:3204.9G0 disk sdb8:1604.9G0 disk sdd8:480 13.7G0 disk sde8:640 13.7G0 disk
可以看出有四块磁盘被挂载到服务器上
四、配置multipath
(1)启动multipath
加载multipath模块:
[root@linux ~]#modprobedm-multipath
启动multipath服务
[root@linux ~]#servicemultipathd start [root@linux ~]#chkconfigmultipathd on
(2)查看磁盘的SCSI_ID
本地磁盘的SCSI_ID
[root@linux ~]#scsi_id-gud /dev/sda 36000c291dbf53ab43ebd016f89a85989
在三.3中看到有四个设备 /dev/sdb、/dev/sdc、/dev/sdd、/dev/sde,查看他们的SCSI_ID:
[root@linuxdev]# scsi_id -gud /dev/sdb 14f504e46494c45524b46564346362d6b416e422d654b3154 [root@linuxdev]# scsi_id -gud /dev/sdc 14f504e46494c45524b46564346362d6b416e422d654b3154 [root@linuxdev]# scsi_id -gud /dev/sdd 14f504e46494c45526142456132662d396b6c792d55493975 [root@linuxdev]# scsi_id -gud /dev/sde 14f504e46494c45526142456132662d396b6c792d55493975
可见/dev/sdb和sdc的ID号一致,说明他们其实是一个LUN。sdd和sde的ID一致。
(3)配置文件的目录
DM-Multipath的配置文件是 /etc/multipath.conf。
如果/etc/multipath.conf 不存在,默认是所有设备都不会被聚合。
在目录/usr/share/doc/device-mapper-multipath-0.4.9/ 下有一个简单的multipath.conf示例文件,可以拷贝到/etc下编辑使用
如果/etc/multipath.conf文件不存在,可以使用以下命令创建multipath.conf文件:
mpathconf--enable
(4)配置参数
#建议user_friendly_names设为no。如果设定为 no,即指定该系统应使用WWID 作为该多路径的别名。如果将其设为 yes,系统使用文件 #/etc/multipath/mpathn 作为别名。
#当将 user_friendly_names 配置选项设为 yes 时,该多路径设备的名称对于一个节点来说是唯一的,但不保证对使用多路径设备的所有节点都一致。也就是说,
在节点一上的mpath1和节点二上的mpath1可能不是同一个LUN,但是各个服务器上看到的相同LUN的WWID都是一样的,所以不建议设为yes,而是设为#no,用WWID作为别名。
defaults { user_friendly_names no path_grouping_policy failover } #先将所有的设备列入到blacklist中,也就是说先使得所有设备不能聚合 blacklist { devnode "^(ram|raw|loop|fd|md|dm-|sr|scd|st)[0-9]*" devnode "^(hd|xvd|vd)[a-z]*" wwid "*" } # 将想要聚合的设备列入blacklist_exceptions. blacklist_exceptions{ wwid "14f504e46494c45526142456132662d396b6c792d55493975" wwid "14f504e46494c45524b46564346362d6b416e422d654b3154" } multipaths{ multipath { wwid"14f504e46494c45526142456132662d396b6c792d55493975" alias cvdisk2 # 由于是通过wwid来设置别名,所以在多节点情况下,各个节点的别名能够保持一致. } multipath { wwid"14f504e46494c45524b46564346362d6b416e422d654b3154" alias cvdisk1 } }
配置完成后,重启服务。
[root@linux~]#service multipathd restart
(5)查看multipath工作模式
[root@linuxetc]# multipath -ll cvdisk2(14f504e46494c45526142456132662d396b6c792d55493975) dm-1 OPNFILER,VIRTUAL-DISK size=14G features='0' hwhandler='0' wp=rw |-+- policy='round-robin 0' prio=1 status=active | `- 6:0:0:0 sdd 8:48 active ready running `-+- policy='round-robin 0' prio=1 status=enabled `- 5:0:0:0 sde8:64 active ready running cvdisk1(14f504e46494c45524b46564346362d6b416e422d654b3154) dm-0 OPNFILER,VIRTUAL-DISK size=4.9G features='0' hwhandler='0' wp=rw |-+- policy='round-robin 0' prio=1 status=active | `- 3:0:0:0 sdb 8:16 active ready running `-+- policy='round-robin 0' prio=1 status=enabled `- 4:0:0:0 sdc8:32 active ready running
从上可以看出每个LUN的两条路径,一个是ACTIVE,一个是ENABLED,表明此时multipath工作模式是主/备
将配置文件中的path_grouping_policyfailover改成
path_grouping_policymultibus
然后重启服务,再次观察,结果如下
[root@linuxetc]# multipath -ll cvdisk2 (14f504e46494c45526142456132662d396b6c792d55493975)dm-1 OPNFILER,VIRTUAL-DISK size=14G features='0' hwhandler='0' wp=rw `-+- policy='round-robin 0' prio=1 status=active |- 6:0:0:0 sdd8:48 active ready running `- 5:0:0:0 sde8:64 active ready running cvdisk1(14f504e46494c45524b46564346362d6b416e422d654b3154) dm-0 OPNFILER,VIRTUAL-DISK size=4.9G features='0' hwhandler='0' wp=rw `-+- policy='round-robin 0' prio=1 status=active |- 3:0:0:0 sdb8:16 active ready running `- 4:0:0:0 sdc8:32 active ready running
从上可以看出每个LUN的两条路径都是ACTIVE,表明此时multipath工作模式是主/主
(6)查看multipath设备别名工作模式
[root@linuxetc]# .cd /dev [root@linuxdev]# cd mapper [root@linuxmapper]# ls controlcvdisk1cvdisk2
从上可见,在/dev/mapper中两个设备的名字是配置文件中设置的别名。
将配置文件中的aliascvdisk1、alias cvdisk2注释掉。
重启服务,再次观察:
[root@linuxmapper]# ls 14f504e46494c45524b46564346362d6b416e422d654b3154control 14f504e46494c45526142456132662d396b6c792d55493975
此时设备名称变成了WWID名称。
(7)挂载multipath设备
格式化多路径设备
fdisk /dev/mapper/cvdisk1 fdisk /dev/mapper/cvdisk2
创建文件系统
mkfs.ext4 /dev/mapper/cvdisk1 mkfs.ext4 /dev/mapper/cvdisk2
挂载
[root@linux /]# cd /mnt [root@linux /]# mkdir cvdisk1 [root@linux /]# mkdir cvdisk2 mount /dev/mapper/cvdisk1p1 ./cvdisk1 mount /dev/mapper/cvdisk2p1 ./cvdisk2
(8)multipath常用命令
multipath -v3 -d-ll
multipath -ll
卸载所有的LUN文件系统
清除DM-Multipathdevices : multipath -F
停止服务:servicemultipathd stop
五、挂载文件系统
格式化设备
fdisk /dev/mapper/ cvdisk1
分区后在/dev/mapper下会生成一个新的设备cvdisk1p1
创建文件系统
mkfs.ext4 /dev/mapper/ cvdisk1p1
挂载设备
mount /dev/mapper/ cvdisk1p1 /u01
最后把挂载信息写入/etc/fstab,系统启动后自动挂载:
/dev/mapper/cvdisk1p1/u01ext4defaults0 0
执行df –h 查看磁盘信息
六、multipath测试
1.负载均衡测试
使用dd命令来对设备进行写操作,并同时通过iostat来查看I/0状态,命令及输出如下:
# dd if=/dev/zero of=/dev/mapper/cvdisk1
开启另外一个终端用以下命令查看IO情况
# iostat 1
通过上述输出,我们看到,在对/dev/mapper/cvdisk1读写时,实际上是通过对/dev/dm-1包含的当前active的所有设备,即/dev/sdd1,/dev/sde这2条路径来完成对实际的LUN的写过程。
2.冗余测试
将服务器的一个网卡禁用,再继续上述测试过程:
此时看到有一个链路断开,处于faulty状态。
执行:
# ddif=/dev/zero of=/dev/mapper/cvdisk1
开启另外一个终端用以下命令查看IO情况,大约2分钟后,可以看到sde在工作
将网卡恢复后,几秒钟恢复正常