Chinaunix首页 | 论坛 | 博客
  • 博客访问: 373991
  • 博文数量: 80
  • 博客积分: 1750
  • 博客等级: 上尉
  • 技术积分: 1380
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-13 11:35
文章分类
文章存档

2014年(3)

2013年(1)

2012年(54)

2011年(22)

分类: 服务器与存储

2012-05-21 19:49:31

DM多路径存储简单实现

什么是 multipath
普通的电脑主机都是一个硬盘挂接到一个总线上,这里是一对一的关系。而到了有光纤组成的SAN 环境,由
于主机和存储通过了光纤交换机连接,这样的话,就构成了多对多的关系。也就是说,主机到存储可以有多条
路径可以选择。主机到存储之间的IO 由多条路径可以选择。
既 然,每个主机到所对应的存储可以经过几条不同的路径,如果是同时使用的话,I/O 流量如何分配?其中一
条路径坏掉了,如何处理?还有在操作系统的角度来 看,每条路径,操作系统会认为是一个实际存在的物理
盘,但实际上只是通向同一个物理盘的不同路径而已,这样是在使用的时候,就给用户带来了困惑。多路径软
件就是为了解决上面的问题应运而生的。多路径的主要功能就是和存储设备一起配合实现如下功能:
       1) 故障的切换和恢复
       2) IO 流量的负载均衡
       3) 磁盘的虚拟化

一套完整的multipath 由下面几部分组成:
1) device-mapper-multipath
提 供multipathd 和multipath 等工具和multipath.conf 等配置文件。这些工具通过device mapper 的ioctr
的接口创建和配置multipath 设备(调用device-mapper 的用户空间库。创建的多路径设备会在/dev
/mapper 中);

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 程序包中,可以在multipath.conf 中配置该程序来获取scsi 设备的序号。通过序号,便可以
判断多个路径对应了同一设备。这个 是多路径实现的关键。scsi_id 是通过sg 驱动,向设备发送EVPD
page80 或page83 的inquery 命令来查询scsi 设备的标识。但一些设备并不支持EVPD 的inquery 命令,
所以他们无法被用来生成multipath 设备。但可以改写scsi_id,为不能提供scsi 设备标识的设备虚拟一个标
识符,并 输出到标准输出。
multipath 程序在创建multipath 设备时,会调用scsi_id,从其标准输出中获得该设备的scsi id。在改写
时,需要修改scsi_id 程序的返回值为0。因为在multipath 程序中,会检查该直来确定scsi id 是否已经成功
得到。

系统环境: RHEL6.0 SELINUX AND IPTABLES OFF
server1:eth0:192.168.0.2
               eth1:192.168.0.3
server2:eth0:192.168.0.4

####server1安装scsi-target-utils
yum install scsi-target-utils -y

####编辑server1端scsi-target-utils的文件
vim /etc/tgt/target.conf
....
#
#    backing-store /dev/LVM/somedevice
#


    backing-store /dev/sdb1
    initiator-address 192.168.0.4        #若省略此项,表示对所有用户可使用

 ....

/etc/init.d/tgtd start
tgtadm --lld iscsi --mode target --op show              #用此命令验证指定是否正确

####server2安装软件
yum install iscsi-initiator-utils device-mapper device-mapper-multipath -y

iscsiadm -m discovery -t st -p 192.168.0.2        #发现target上的卷
iscsiadm -m node -l -p 192.168.0.2                    #将target上发现的卷加入进来
iscsiadm -m discovery -t st -p 192.168.0.3
iscsiadm -m node -l -p 192.168.0.3

####便件DM文件(NEW)
vim /etc/multipath.conf
backlist {
    devnode "sda"                        #表示禁用此设备(系统信息通常在/dev/sda)
}
 
defaults {
    user_friendly_names    yes
    udev_dir               /dev
    path_grouping_policy   failover                #failover 为主备模式; multibus 为负载均衡模式 
    failback               immediate
    no_path_retry          fail
}

#multipath.conf配置参数,默认值,可参考:
/usr/share/doc/device-mapper-multipath-0.4.9/multipath.conf.annotated

/etc/init.d/mulipathd start

[root@server4 ~]# multipath -ll           #此为主备模式下链路状态
mpatha (1IET     00010001) dm-2 IET,VIRTUAL-DISK
size=2.0G features='0' hwhandler='0' wp=rw
|-+- policy='round-robin 0' prio=1 status=active
| `- 2:0:0:1 sdb 8:0   active ready  running
`-+- policy='round-robin 0' prio=1 status=enabled
  `- 3:0:0:1 sdc 8:16  active ready  running

注:可以看到sdb 和sdc 两条链路复合成一条链路mpath,此为Failover(主备)情况,当你对mpath 设备读写时,处于active 状态的sdb 链路有数据流,而处于enabled 状态的sdc 链路无数据流;当sdb 链路出现问题时,才会切换到sdc 链路上。

[root@server4 ~]# multipath -ll                   #此为负载均衡模式下链路状态
mpatha (1IET     00010001) dm-2 IET,VIRTUAL-DISK
size=2.0G features='0' hwhandler='0' wp=rw
`-+- policy='round-robin 0' prio=1 status=active
  |- 2:0:0:1 sdb 8:0  active ready running
  `- 3:0:0:1 sdc 8:16 active ready running

注:当你对mpath设备读写的时,处于active状态的链路都有数据流,通过两条链路并行写入设备

####在server4上测试
用dd 往磁盘读写数据,然后用iostat 观察各通道的流量和状态,以判断Failover 或负载均衡方式是否正常:
dd if=/dev/zero of=/dev/mapper/mpatha     #可将其打入后台

iostat -k 2                                #此为主备模式下通过一条链路写入
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.00    0.00    4.04   95.96    0.00    0.00
 Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
vda               0.00         0.00         0.00          0          0
dm-0              0.00         0.00         0.00          0          0
dm-1              0.00         0.00         0.00          0          0
sdb             341.92      1351.52      2068.69       2676       4096         #
sdc               0.00         0.00         0.00          0          0                           #
dm-2            341.92      1351.52      2068.69       2676       4096
dm-3              0.00         0.00         0.00          0          0


iostat -k 2                 #此模式为负载均衡模式下通链路写入数据的状态
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.51    0.00   19.49   80.00    0.00    0.00
 Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
vda               0.00         0.00         0.00          0          0
dm-0              0.00         0.00         0.00          0          0
dm-1              0.00         0.00         0.00          0          0
sdb             893.85      3542.56      4201.03       6908       8192                #
sdc             626.67      2473.85      4201.03       4824       8192                #
dm-2           1520.51      6016.41      8402.05      11732      16384
dm-3              0.00         0.00         0.00          0          0



....GOOD LUCK!
阅读(3017) | 评论(2) | 转发(2) |
0

上一篇:RHEL6 KVM

下一篇:LVS_DR实现

给主人留下些什么吧!~~

78922422012-05-23 11:32:41

恩恩,写的很好啊~~~学习了!!

weincheng2012-05-22 13:03:42