ramadan-光纤接入
Device-Mapper Multipath
一
DM-
Multipath
概述
DM-
Multipath
能够使服务器与存储控制器间
multiple I/O
路径变成一个单一的设备。
I/O
路径是由线
缆、交换机、控制器组成的物理
SAN
。
DM-Multipath
能够创建一个由
I/O
路径
聚集组成的新设备。
在不配置
DM-Multipath
的
情况下,盘阵的一个
LUN
从控制器主机端口映射到服务器,<
/p>
在操作系统里被识别成一个独立的设备,这样就会造成同一个
LU
N
通过盘阵不同的主机端
口映射到服务器被识别成不同的设备。
作为一种解决方案,
DM-Multipath
通过在物理设备
上创建一个单独的多路径设备,
提供了一种在逻辑上管理
I/O
路径的机制,
这样盘阵的
LUN
从控制器主机端口映射到服务器,在操作系统里被识别成一个多路径设
备。
每个多路径设备拥有一个唯一标识的
World Wide I
dentifier
(
全球识别号,
W
WID
)
,
默认
情况下,多路径设备的名称被设置成它的
WWID
。通过修改
文件中的
user_friendly
_names
选项参数
,
可以设置多路
径设备的别名为
mpathn
。
例如如
下的配置环境:
一个拥有两个
HBA
的
服务器通过一个未配置
zone
的
FC
交换机连接到有两个主机端口的盘
阵控制器(盘阵仅有一个
p>
LUN
)上,在操作系统里能够看到四个设备:
/dev/sda,
/dev/sdb,
dev/sdc,
和
/dev/sd
d
。
通过配置
文件,
DM-Multipath
就会创建一个拥有
WWID
的多路径设备,多路径设备受控于
DM-
Multipath
,我们可以在三个不同目录查看多路径设
备
:
/dev/
目录;
/dev/map
per/mpathn,/dev/mpath/mpathn
;
/dev/dm-n.
。使用
/dev/mapper
目录中
的设备名对多路径设备进行管理,如创建逻辑卷,创建文件系统
等。
/dev/mpath
将所有的多
路径设备放到该目录下,
只是便于查看,
不要使用该目录下的设
备进行创建逻辑卷,
创建文
件系统等操作。
/dev/dm-n
只是用于系统内部的使用,不要使用这里面的设备。
二
DM-Multipath
功能
DM-Multipath
能够提供:
冗余
在
ac
tive/passive
模式中,
DM-Multipath
提供失效转移功能。
active/passive
环境
中,在任何时间内只有一半的
I/O
路径被使用。如果一个
I/O
路径内的元素例如
线缆、交
换机、控制器失效,
DM-
Multipath
切换到轮换的路径。
提高性能
DM-
Multipath
能够被配置在
active/
active
模式下,在这种模式下,
I/O
p>
路径处于
round-
robin
方式。
DM-Multipath
< br>能够动态的平衡
I/O
负荷。
三
DM-
Multipath
应用环境示例
①
Active
/
Passive
Multipath Configuration with One RAID Device
该配置里服务器有两个
HBA
,
< br>两个
SAN
交换机和两个控制器。
从服务器到一个
RAID
存在
两个<
/p>
I/O
路径。如下图:
该配置中,第一条
I/O
路径通过
hba1
,
SA
N
1
和
controller1
p>
。第二条
I/O
路径
通过
hba2,SAN2
和
cont
roller2
。这个配置中存在多种潜在的失效因素:
HBA failure
FC
cable failure
SAN switch
failure
Array controller
port failure
如果出现以上任何一个失效点,
DM-
Multipath
会切换到轮换的路径。
②
Active/Active
Multipath Configuration with One RAID Device
该配置里服务器有两个
HBA
,一个
SAN
交换机和两个控制器,如下图:
该配置中,
从服务器到一个存储存在
四条
I/O
路径:
hba1 to controller1
hba1 to controller2
hba2 to controller1
hba2 to controller2
配置
DM-
Multipath
后,
DM-Multipath
能够监测每条
I/O
路径的负载,动态的平衡
p>
I/O
负荷。
四
Setting Up DM-Multipath
在系统准备
DM-Multipath
之前,
请确保系统包含
device-mapper-mult
ipath
包,
操作系统安装
光盘内包
含该
rpm
包。
①编辑
/etc/
< br>f
文件,将以下内容的注释移除,使
multipath
ing
功能开启。
blacklist {
devnode
}
修改完应如下
# blacklist {
#
devnode
# }
②保存配置
③
modprobe dm-multipath
service multipathd start
multipath
–
v2
// multipath
–
v2<
/p>
命令输出多路径设备,
如果没有任何输出,
确保
SAN
正确
连接。
④
chkconfig multipathd
on
//
确保
multipath
daemon
开机自动启动
⑤本地的硬盘设备不建议使用
DM-Multipath
,需要将本地硬盘从多路径设备中忽略。有两种方
式,方式一:
vi /etc/
将
blacklist {
devnode
}
修改成
blacklist {
devnode
//
扫描除本地硬盘的多路径设备
}
方式二:
/etc/
文件中添加
blacklist{
wwid SIBM-ESXSST336732LC___
_F3ET0EP0Q000072428BX1(
该值为本地硬盘的
< br>WWID)
}
然后再运行
multipath
–
F
multipath
–
v2
[root@rh4cluster1 ~]# multipath
–
F
//
移除多路径设备
[root@rh4cluster1 ~]#
multipath -v2
create:
3600a0b80001327d80000006d43621677
[size=12 GB][features=
_
round-robin 0
_ 2:0:0:0 sdb 8:16
_ 3:0:0:0 sdf 8:80
create: 3600a0b80009a436215ec
[size=12 GB][features=
_
round-robin 0
_ 2:0:0:1 sdc 8:32
_ 3:0:0:1 sdg 8:96
create: 3600a0b80001327d816b3
[size=12 GB][features=
_
round-robin 0
_ 2:0:0:2 sdd 8:48
_ 3:0:0:2 sdh 8:112
create: 3600a0b80009b4362163e
[size=12 GB][features=
_
round-robin 0
_ 2:0:0:3 sde 8:64
_ 3:0:0:3 sdi 8:128
⑥
大多数的磁盘阵列型号支持
DM-M
ultipath
,
如果要添加的设备不是
/etc/
文件
里默认支持的设备,可以参照默认配置添加
设备情况,例如添加一个如下的设备:
devices {
device {
vendor
product
getuid_callout
/block/%n
}
}
附:北大某学院项目实际案例:
<
/p>
项目实施过程中由于要实现光纤链路的多路径,由于
DS6310
FE
没有提供
LINUX
下的
多路径冗余软件,所以采用了
LINUX
系统下
的
device mapper
multipath
解决方案。
SAN
组织结构如下:
DS6
310FE
:
双控制器,
每个控制器<
/p>
2
个
4G FC
主机端口,
全部连接到
FC
交换机。<
/p>
4
组
RAID,
其中一个
LUN
同时映射给三个主机,其它三个
LUN
分别映射给各自的主机。
Brocade 200E FC Switch
Serve
r
:每个配置一个
Qlogic QLE2460
HBA
卡,连接交换机
这样
LUN
到主机的光纤链路存在多个。
以下为配置步骤
①
# rpm -qa | grep device-
mapper
5
5
如果显示如上说明系统已经安装了
device-
mapper-multipath
,如果未安装,在安装光盘可
以找到该
rpm
包进行安装
# rpm -ivh
Preparing...
##################### [100%]
1:device-
mapper-multipath##################### [100%]
#
②配置
/
etc/
文件
进行备份,
cp /etc/ /etc/
vi /etc/
将
devnode_blacklist {
devnode
}
修改成
devnode_blacklist {
devnode
//
扫描除本地硬盘的多路径设备
}
③执行
#
multipath -v3
load path identifiers
cache
#
# all paths in cache
:
#
222770001551df74d
6:0:0:0 sdb 8:16 1 [active]
Dawning /Diskarray DS6310/0330
222f5000155f4aab4
6:0:0:1 sdc 8:32 1 [active] Dawning
/Diskarray DS6310/0330
222770001551df74d
6:0:1:0 sdd 8:48 1 [active] Dawning
/Diskarray DS6310/0330
222f5000155f4aab4
6:0:1:1 sde 8:64 1 [active] Dawning
/Diskarray DS6310/0330
222770001551df74d
6:0:2:0 sdf 8:80 1 [active] Dawning
/Diskarray DS6310/0330
222f5000155f4aab4
6:0:2:1 sdg 8:96 1 [active] Dawning
/Diskarray DS6310/0330
222770001551df74d
6:0:3:0 sdh 8:112 1 [active] Dawning
/Diskarray DS6310/0330
222f5000155f4aab4
6:0:3:1 sdi 8:128 1 [active] Dawning
/Diskarray DS6310/0330
sda blacklisted
===== path info sdb (mask 0x1f) =====
bus = 1
dev_t = 8:16
size = 5847653376
vendor =
Dawning
product = Diskarray
DS6310
rev = 0330
h:b:t:l =
6:0:0:0
tgt_node_name =
serial = 495345200000972AA3D84BF39EF4
path checker = readsector0 (internal
default)
state = 2
getprio =
(null) (internal default)
prio = 1
uid = 222770001551df74d
(cache)
===== path info sdc (mask 0x1f)
=====
bus = 1
dev_t = 8:32
size = 1949217792
vendor =
Dawning
product = Diskarray
DS6310
rev = 0330
h:b:t:l =
6:0:0:1
tgt_node_name =
serial = 4953452000006B1ED98B16A2FB26
path checker = readsector0 (internal
default)
state = 2
getprio =
(null) (internal default)
prio = 1
uid = 222f5000155f4aab4 (cache)
===== path info sdd (mask 0x1f) =====
bus = 1
dev_t = 8:48
size = 5847653376
vendor =
Dawning
product = Diskarray
DS6310
rev = 0330
h:b:t:l =
6:0:1:0
tgt_node_name =
serial = 495345200000972AA3D84BF39EF4
path checker = readsector0 (internal
default)
state = 2
getprio =
(null) (internal default)
prio = 1
uid = 222770001551df74d (cache)
===== path info sde (mask 0x1f) =====
bus = 1
dev_t = 8:64
size = 1949217792
vendor =
Dawning
product = Diskarray
DS6310
rev = 0330
h:b:t:l =
6:0:1:1
tgt_node_name =
serial = 4953452000006B1ED98B16A2FB26
path checker = readsector0 (internal
default)
state = 2
getprio =
(null) (internal default)
prio = 1
uid = 222f5000155f4aab4 (cache)
===== path info sdf (mask 0x1f) =====
bus = 1
dev_t = 8:80
size = 5847653376
vendor =
Dawning
product = Diskarray
DS6310
rev = 0330
h:b:t:l =
6:0:2:0
tgt_node_name =
serial = 495345200000972AA3D84BF39EF4
path checker = readsector0 (internal
default)
state = 2
getprio =
(null) (internal default)
prio = 1
uid = 222770001551df74d (cache)
===== path info sdg (mask 0x1f) =====
bus = 1
dev_t = 8:96
size = 1949217792
vendor =
Dawning
product = Diskarray
DS6310
rev = 0330
h:b:t:l =
6:0:2:1
tgt_node_name =
serial = 4953452000006B1ED98B16A2FB26
path checker = readsector0 (internal
default)
state = 2
getprio =
(null) (internal default)
prio = 1
uid = 222f5000155f4aab4 (cache)
===== path info sdh (mask 0x1f) =====
bus = 1
dev_t = 8:112
size = 5847653376
vendor =
Dawning
product = Diskarray
DS6310
rev = 0330
h:b:t:l =
6:0:3:0
tgt_node_name =
serial = 495345200000972AA3D84BF39EF4
path checker = readsector0 (internal
default)
state = 2
getprio =
(null) (internal default)
prio = 1
uid = 222770001551df74d (cache)
===== path info sdi (mask 0x1f) =====
bus = 1
dev_t = 8:128
size = 1949217792
vendor =
Dawning
product = Diskarray
DS6310
rev = 0330
h:b:t:l =
6:0:3:1
tgt_node_name =
serial = 4953452000006B1ED98B16A2FB26
path checker = readsector0 (internal
default)
state = 2
getprio =
(null) (internal default)
prio = 1
uid = 222f5000155f4aab4 (cache)
#
# all paths :
#
222770001551df74d
6:0:0:0 sdb 8:16 1 [active][ready]
Dawning /Diskarray DS631
222f5000155f4aab4
6:0:0:1 sdc 8:32 1 [active][ready]
Dawning /Diskarray DS631
222770001551df74d
6:0:1:0 sdd 8:48 1 [active][ready]
Dawning /Diskarray DS631
222f5000155f4aab4
6:0:1:1 sde 8:64 1 [active][ready]
Dawning /Diskarray DS631
222770001551df74d
6:0:2:0 sdf 8:80 1 [active][ready]
Dawning /Diskarray DS631
222f5000155f4aab4
6:0:2:1 sdg 8:96 1 [active][ready]
Dawning /Diskarray DS631
222770001551df74d
6:0:3:0 sdh 8:112 1 [active][ready]
Dawning /Diskarray DS63
222f5000155f4aab4
6:0:3:1 sdi 8:128 1 [active][ready]
Dawning /Diskarray DS63
params = 0 0 4
1 round-robin 0 1 1 8:32 1000 round-robin 0 1 1
8:64 1000 round-robin 0 1 1 8:96
1000
round-robin 0 1 1 8:128 1000
status = 1 0 0 4 1 A 0 1 0 8:32 A 0 E 0
1 0 8:64 A 0 E 0 1 0 8:96 A 0 E 0 1 0 8:128 A 0
params = 0 0 4 1 round-
robin 0 1 1 8:16 1000 round-robin 0 1 1 8:48 1000
round-robin 0 1 1 8:80
1000 round-robin
0 1 1 8:112 1000
status = 1
0 0 4 1 A 0 1 0 8:16 A 0 E 0 1 0 8:48 A 0 E 0 1 0
8:80 A 0 E 0 1 0 8:112 A 0
Found matching wwid [222770001551df74d]
in bindings file.
Setting alias to
mpath0
pgpolicy = failover (internal
default)
selector = round-robin 0
(internal default)
features = 0
(internal default)
hwhandler = 0
(internal default)
rr_weight = 1
(internal default)
rr_min_io = 1000
(config file default)
no_path_retry =
NONE (internal default)