Multipath多路径冗余全解析
Multipath多路径冗余全解析
⼀、什么是multipath
普通的电脑主机都是⼀个硬盘挂接到⼀个总线上,这⾥是⼀对⼀的关系。⽽到了有光纤组成的SAN环境,由于主机和存储通过了光纤交换机连接,这样的话,就构成了多对多的关系。也就是说,主机到存储可以有多条路径可以选择。主机到存储之间的IO由多条路径可以选择。
既然,每个主机到所对应的存储可以经过⼏条不同的路径,如果是同时使⽤的话,I/O流量如何分配?其中⼀条路径坏掉了,如何处理?还有在的⾓度来看,每条路径,操作系统会认为是⼀个实际存在的物理盘,但实际上只是通向同⼀个物理盘的不同路径⽽已,这样是在使⽤的时候,就给⽤户带来了困惑。多路径软件就是为了解决上⾯的问题应运⽽⽣的。多路径的主要功能就是和存储设备⼀起配合实现如下功能:
1. 故障的切换和恢复
2. IO流量的负载均衡
3. 磁盘的虚拟化
⼆、为什么使⽤multipath
由于多路径软件是需要和存储在⼀起配合使⽤的,不同的⼚商基于不同的操作系统,都提供了不同的版本。并且有的⼚商,软件和硬件也不是⼀起卖的,如果要使⽤多路径软件的话,可能还需要向⼚商购买license才⾏。⽐如EMC公司基于下的多路径软件,就需要单独的购买license。
其中,EMC提供的就是PowerPath,HDS提供的就是HDLM,更多的存储⼚商提供的软件,可参考这⾥。
当然,使⽤系统⾃带的免费多路径软件包,同时也是⼀个⽐较通⽤的包,可以⽀持⼤多数存储⼚商的设备,即使是⼀些不是出名的⼚商,通过对配置⽂件进⾏稍作修改,也是可以⽀持并运⾏的很好的。
※请与IBM的RDAC、Qlogic的failover驱动区分开,它们都仅提供了Failover的功能,不⽀持Load Balance⽅式。但multipath根据选择的策略不同,可⽀持多种⽅式,如:Failover、Multipath等。
三、multipath的组成
我这⾥以红帽x86_64为例,虽然版本⽐较⽼,但下⾯的配置⽅式基本适⽤后⾯的所有版本。
# cat /etc/redflag-release
Red Flag DC Server release 5.0 (Trinity SP2)
# uname -a
localhost.localdomain 2.6.18-164.el5 #1 SMP Tue Aug 18 15:51:48 EDT 2009 x86_64 x86_64 x86_64 GNU/Linux
# rpm -qa|grep device
device-mapper-event-1.02.32-1.el5
device-mapper-1.02.32-1.el5
device-mapper-multipath-0.4.7-30.el5
device-mapper-1.02.32-1.el5
可见,⼀套完整的multipath由下⾯⼏部分组成:
1. device-mapper-multipath
提供multipathd和multipath等⼯具和f等配置⽂件。这些⼯具通过device mapper的ioctr的接⼝创建和配置multipath设备(调⽤device-mapper的⽤户空间库。创建的多路径设备会在/dev/mapp
er中);
2. device-mapper
device-mapper包括两⼤部分:内核部分和⽤户部分。
内核部分由device-mapper核⼼(multipath.ko)和⼀些target driver(dm-multipath.ko)构成。dm-mod.ko是实现multipath的基础,dm-multipath其实是dm的⼀个target驱动。核⼼完成设备的映射,⽽target根据映射关系和⾃⾝特点具体处理从mappered device 下来的i/o。同时,在核⼼部分,提供了⼀个接⼝,⽤户通过ioctr可和内核部分通信,以指导内核驱动的⾏为,⽐如如何创建mappered device,这些device的属性等。
⽤户空间部分包括device-mapper这个包。其中包括dmsetup⼯具和⼀些帮助创建和配置mappered device的库。这些库主要抽象,封装了与ioctr通信的接⼝,以便⽅便创建和配置mappered device。device-mapper-multipath的程序中就需要调⽤这些库;
3. scsi_id
其包含在udev程序包中,可以在f中配置该程序来获取scsi设备的序号。通过序号,便可以判断多个路径对应了同⼀设备。这个是多路径实现的关键。scsi_id是通过sg驱动,向设备发送EVP
D page80或page83 的inquery命令来查询scsi设备的标识。但⼀些设备并不⽀持EVPD 的inquery命令,所以他们⽆法被⽤来⽣成multipath设备。但可以改写scsi_id,为不能提供scsi设备标识的设备虚拟⼀个标识符,并输出到标准输出。
multipath程序在创建multipath设备时,会调⽤scsi_id,从其标准输出中获得该设备的scsi id。在改写时,需要修改scsi_id程序的返回值为0。因为在multipath程序中,会检查该直来确定scsi id是否已经成功得到。
四、配置multipath
原理看了⼀堆,实际配置还是⽐较简单的。配置⽂件只有⼀个:/f 。配置前,请⽤fdisk -l 确认已可正确识别盘柜的所有LUN,HDS⽀持多链路负载均衡,因此每条链路都是正常的;⽽如果是类似EMC CX300这样仅⽀持负载均衡的设备,则冗余的链路会出现I/O Error的错误。
1、编辑⿊名单
默认情况下,multipath会把所有设备都加⼊到⿊名单(devnode "*"),也就是禁⽌使⽤。所以,我们⾸先需要取消该设置,把配置⽂件修改为类似下⾯的内容:
devnode_blacklist {
#devnode "*"
devnode "hda"
wwid 3600508e000000000dc7200032e08af0b
}
这⾥禁⽌使⽤hda,也就是光驱。另外,还限制使⽤本地的sda设备,这个wwid,可通过下⾯的命令获得:
# scsi_id -g -u -s /block/sda
3600508e000000000dc7200032e08af0b
2、编辑默认规则
不同的device-mapper-multipath或操作系统发⾏版,其默认的规则都有点不同,以RedHat x86_64为例,其path_grouping_policy默认为failover,也就是主备的⽅式。这明显不符合我们的要求。(HDS
⽀持多路径负载均衡,EMC CX300等只⽀持Failover)。
所以,我们需要修改默认的规则:
defaults {
udev_dir /dev
path_grouping_policy multibus
failback immediate
no_path_retry fail
user_friendly_name yes
}
关键是path_grouping_policy⼀项,其他选项可参考说明⽂档。
3、启动服务及⽣成映射
# modprobe dm-multipath
# service multipathd start
# multipath -v0
4、查看复合后的设备
# multipath -ll
会看到类似下⾯的信息:
mpath0 (360060e80058e980000008e9800000007)
[size=20 GB][features="0"][hwhandler="0"]
\_ round-robin 0 [prio=1][active]
\_ 3:0:0:7 sdaa 65:160 [active][ready]
\_ round-robin 0 [prio=1][enabled]
\_ 4:0:0:7 sdas 66:192 [active][ready]
\_ round-robin 0 [prio=1][enabled]
\_ 5:0:0:7 sdbk 67:224 [active][ready]
\_ round-robin 0 [prio=1][enabled]
\_ 2:0:0:7 sdi 8:128 [active][ready]
这说明,已由四条链路sdaa/sdas/sdbk/sdi复合成⼀条链路,设备名为mpath0。
状态正常的话,把multipathd设置为⾃启动:
# chkconfig multipathd on
5、使⽤mpath设备
⽤multipath⽣成映射后,会在/dev⽬录下产⽣多个指向同⼀条链路的设备:
/dev/mapper/mpathn
/
dev/mpath/mpathn
/dev/dm-n
但它们的来源是完全不同的:
/dev/mapper/mpathn 是multipath虚拟出来的多路径设备,我们应该使⽤这个设备;
/dev/mpath/mpathn 是udev设备管理器创建的,实际上就是指向下⾯的dm-n设备,仅为了⽅便,不能⽤来挂载;/dev/dm-n 是软件内部⾃⾝使⽤的,不能被软件以外使⽤,不可挂载。
简单来说,就是我们应该使⽤/dev/mapper/下的设备符。对该设备即可⽤fdisk进⾏分区,或创建为pv。
etc被拉入黑名单了怎么办6、分区或创建lvm
以前,我考虑到从系统iostat看到的都是dm-n的设备,所以⼀直都是直接对dm-n操作。但这会产⽣⼀个问题,就是没法分区。⽽
对/dev/mapper/mpathn设备操作就没有这问题。只要要注意,⽤fdisk分区并保存后,必须刷新multipath的映射表,以便其创建分区对应的设备符,例如:
# fdisk -l /dev/mapper/mpath0
Disk /dev/mapper/mpath0: 214.7 GB, 214748364800 bytes
255 heads, 63 sectors/track, 26108 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/mapper/mpath0p1 1 26108 209712478+ 83 Linux
# multipath -F
# multipath -v0
# ll /dev/mapper/mpath0p1
brw-rw---- 1 root disk 253, 2 5⽉ 7 07:40 /dev/mapper/mpath0p1
同样的,mpathn或其分区都可⽤来做pv使⽤:
# pvcreate /dev/mapper/mpath0p1
# vgcreate test /dev/mapper/mpath0p1
# lvcreate -L 1g -n lv1 test
# lvdisplay
# 3 /dev/test/lv1
※注意:
根据⽹上的资料,有部分multipath版本存在与lvm兼容的问题。具体表现是,使⽤device-mapper设备创建lvm完成,重启后,虽然lvm仍存在,但/dev/mapper下的设备丢失。为了防⽌可能的意外,建议还是修改⼀下lvm的配置⽂件/etc/f,加⼊:
types=["device-mapper", 1]
7、其他
最简单的⽅法,是⽤dd往磁盘读写数据,然后⽤iostat观察各通道的流量和状态,以判断Failover或负
载均衡⽅式是否正常:
# dd if=/dev/zero of=/dev/mapper/mpath0
# iostat -k 2
另外,如果是在由多台服务器构建集环境中,为了让每台服务器识别的mpathn设备顺序⼀直,需进⾏wwid的绑定⼯作,请参考后⾯“⾃定义设备名称”中的内容。
五、答疑
1、为什么⿊名单中不直接使⽤devnode "sda" 呢?
因为按Linux对设备的编号,当设备从sda到sdz时,后⼀个设备应该是sdaa。⽽multipath对⿊名单的设置是以匹配的⽅式进⾏的,也就是说,如果你设置为devnode "sda",那么除了sda为,sdaa、sdab等的设备(通道)都会被加⼊到⿊名单中,⽽禁⽌使⽤。当然,你也可以参考配置⽂件中的样式,以正规表达式的形式进⾏描述:devnode "^sda$"。
但考虑到每次重启后,udev分配的盘符可能都不同(没有做udev绑定的情况),所以,我觉得以wwid的⽅式处理更可靠。
2、为存储定制特定的策略
在前⾯的配置中,我们已经在/f中配置了多路径的默认path_grouping_policy为multibus。但有时候,同⼀台机器上如果连接了⼀个以上的存储时,可能默认规则并不完全适⽤。这时,我们可以给特定的存储定制多路径符合的策略。
a、mulipath命令
该命令提供了⼀个-p的参数,可以修改默认策略,参数有:
-p policy force all maps to specified policy :
failover 1 path per priority group
multibus all paths in 1 priority group
group_by_serial 1 priority group per serial
group_by_prio 1 priority group per priority lvl
group_by_node_name 1 priority group per target node
例如,执⾏:
# multipath -F
# multipath -p failover -v0
有如下结果:
mpath18 (360060e8010463ef004f2b79f00000006)
[size=320 GB][features="0"][hwhandler="0"]
\_ round-robin 0 [prio=2][active]
\_ 5:0:0:6 sdaf 65:240 [active][ready]
\_ 4:0:0:6 sdv 65:80 [active][ready]
\_ round-robin 0 [enabled]
\_ 2:0:0:6 sdb 8:16 [active][ready]
\_ 3:0:0:6 sdl 8:176 [active][ready]
这说明,当你对mpath18设备读写时,sdaf、sdv 会处于active状态,都有数据流,但sdb、sdl 组成的链路是enabled,作为ready情况。这为Failover(主备)情况,仅当sdaf、sdv组成的链路出现问题时,才会切换到sdb、sdl 的链路上。
b、修改配置⽂件
可以在配置⽂件中为指定的存储定义策略。⾸先,可以⽤multipath -v3 -ll 看看存储的信息,例如,我这⾥的机器就同时连接了两个不同的存储:
===== path info sdaa (mask 0x5) =====
bus = 1
dev_t = 65:160
size = 10487040
vendor = HITACHI
product = OPEN-V
rev = 6006
h:b:t:l = 2:0:1:24

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。