本文详细介绍如何利用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.网络拓扑

利用multipath实现多路径聚合_第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,如下图所示

利用multipath实现多路径聚合_第2张图片


点击“确定”,然后重启服务器。执行如下命令:

[root@ linux ~]#ifconfig –a

利用multipath实现多路径聚合_第3张图片

可见,系统已经识别到两块网卡。

进入/etc/sysconfig/network-scripts/目录:


[root@linux~]# cd /etc/sysconfig/network-scripts
[root@linux ~]# ls

如下图所示:

利用multipath实现多路径聚合_第4张图片

除了第一块网卡,并没有其他网卡的配置文件,需要手工创建:


[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

利用multipath实现多路径聚合_第5张图片

从中可以得到MAC地址,另外执行下面命令,可以新生成一个UUID


[root@linux network-scripts] uuidgen
4d487f45-4d27-4663-a93f-71903608a8bd


开始编辑ifcfg-eth1文件

[root@rac-1 network-scripts]# vi ifcfg-eth1


修改后的结果如下所示:

利用multipath实现多路径聚合_第6张图片

存盘退出后,重启网路服务

[root@rac-1 network-scripts]# service network restart

利用multipath实现多路径聚合_第7张图片

再此查看网卡信息:

利用multipath实现多路径聚合_第8张图片

可见两块网卡工作都正常。


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属性,如下图所示:

利用multipath实现多路径聚合_第9张图片

单击“Add”,弹出窗口如下图所示:

利用multipath实现多路径聚合_第10张图片

选择“Hard Disk”,然后单击“Next”,如下图所示:

利用multipath实现多路径聚合_第11张图片

选择“Create a new virtual disk” 然后单击“Next”,如下图所示:

利用multipath实现多路径聚合_第12张图片

在“Virtual disk type”中选择“SCSI(Recommanded)”,

在Mode中选择“Independent”以及“Persistent”

然后单击“Next”,如下图所示:

利用multipath实现多路径聚合_第13张图片

磁盘大小设为30G,勾选“All all disk space now”,并选择“Storevirtual disk as a single file”, 然后单击“Next”,如下图所示:

利用multipath实现多路径聚合_第14张图片


单击“Finish”完成磁盘添加工作

3.配置Openfiler服务器

在宿主机的浏览器中输入:

https://192.168.137.50:446

即可访问并配置Openfile,如下图所示:

利用multipath实现多路径聚合_第15张图片

(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”,进入原始设备配置界面,如下图所示:

利用multipath实现多路径聚合_第16张图片

单击图片下方中的链接“create new physical volumes.”,如下图所示:

利用multipath实现多路径聚合_第17张图片

可以看出,/dev/sda是opefiler服务器的系统盘,/dev/sdb是我们计划用来为RAC服务的iSCSI磁盘。

单击“/dev/sdb”链接,如下图所示:

利用multipath实现多路径聚合_第18张图片

单击“Create”,创建iSCSI磁盘,如下图所示:

利用multipath实现多路径聚合_第19张图片

到此,原始设备的配置完成,下面开始为iSCSI配置卷组

(3)配置iSCSI卷组

卷组的作用是把几个物理硬盘组合成一个逻辑大硬盘。

单击右侧菜单中的“VolumnGroup”,如下图所示

利用multipath实现多路径聚合_第20张图片

在“Volumn groupname”中输入:rac-shared-disk

并勾选“/dev/sdb”

然后单击“Add VolumnGroup”,创建完成后,结果如下所示:

利用multipath实现多路径聚合_第21张图片

     (4)配置iSCSI逻辑卷

上一步创建了逻辑硬盘后,对这个硬盘进行分区,就是我们所说的创建逻辑卷

Openfiler对磁盘的管理与Linux的LVM概念类似,在卷组上还需要创建一个或多个逻辑卷,系统才能使用。

单击右侧菜单中的“AddVolumn”,如下图所示:

利用multipath实现多路径聚合_第22张图片

在”Volume Name”中输入:ocrvdisk1

在“Volumn Space”中输入:5000

“FileSystem/VolumnType”选择::Block(iSCSI、FC)

然后单击“Create”,创建一个逻辑卷。如下图所示:

利用multipath实现多路径聚合_第23张图片

重复上面的步骤,继续增加下面的逻辑卷:

名字:ocrvdisk2大小:14000M,类型:Block(iSCSI、FC)

注意不要将所有磁盘空间用完,最好保留一点。

创建完成后,单击右侧菜单中的”ManagerVolumn“可以查看所有逻辑卷,如下图所示:

利用multipath实现多路径聚合_第24张图片

(5)创建iSCSI Target

逻辑卷创建后,数据库服务器是无法直接将逻辑卷挂载到本地,需要通过iSCSI探测器探测Openfiler服务器上的iSCSI Target设备后,才能挂载。

注意:每个逻辑卷都需要创建一个iSCSI Target

下面开始创建iSCSITarget。

在openfiler的菜单上,单击”Services“,如下图所示:

利用multipath实现多路径聚合_第25张图片

目前iSCSI Target状态是未启动,系统引导时不自动启动。

单击iSCSI Target的”Enable“和”start“,启动iSCSITarget服务,同时设置为引导时自动启动。

然后单击菜单中的”Volumn“,在右侧选择”iSCSI Target“,如下图所示

利用multipath实现多路径聚合_第26张图片

为了便于识别,我喜欢用更具含义的字串来替换这个默认目标 IQN 最后一段。对于第一个 iSCSI 目标(ocrvdisk1),我将这样来修改默认的目标 IQN:将字符串“tsn.ddd42559ac4f”替换为“ocrvdisk1”,然后单击”Add“,添加一个iSCSI Target,如下图所示:


增加iSCSI Target后的界面如下所示

利用multipath实现多路径聚合_第27张图片

(6)磁盘映射到iSCSI Target

需要将9.3.4中创建的逻辑磁盘ocrvdisk1映射到iSCSI Target上。

单击上图中的”LUNMapping“,然后点击ocrvdisk逻辑盘后面的”Map“按钮

利用multipath实现多路径聚合_第28张图片

单击“Network ACL“,如下图所示

利用multipath实现多路径聚合_第29张图片

修改“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

利用multipath实现多路径聚合_第30张图片

通过上述输出,我们看到,在对/dev/mapper/cvdisk1读写时,实际上是通过对/dev/dm-1包含的当前active的所有设备,即/dev/sdd1,/dev/sde这2条路径来完成对实际的LUN的写过程。

2.冗余测试

将服务器的一个网卡禁用,再继续上述测试过程:

利用multipath实现多路径聚合_第31张图片

此时看到有一个链路断开,处于faulty状态。

执行:

# ddif=/dev/zero of=/dev/mapper/cvdisk1

开启另外一个终端用以下命令查看IO情况,大约2分钟后,可以看到sde在工作

利用multipath实现多路径聚合_第32张图片

将网卡恢复后,几秒钟恢复正常