多路径 -- 介绍
普通的电脑主机都是一个硬盘挂接到一个总线上,这里是一对一的关系。而到了有光纤组成的SAN环境,或者由iSCSI组成的IPSAN环境,由于主机和存储通过了光纤交换机或者多块网卡及IP来连接,这样的话,就构成了多对多的关系。也就是说,主机到存储可以有多条路径可以选择。主机到存储之间的IO由多条路径可以选择。每个主机到所对应的存储可以经过几条不同的路径,如果是同时使用的话,I/O流量如何分配?其中一条路径坏掉了,如何处理?还有在操作系统的角度来看,每条路径,操作系统会认为是一个实际存在的物理盘,但实际上只是通向同一个物理盘的不同路径而已,这样是在使用的时候,就给用户带来了困惑。多路径软件就是为了解决上面的问题应运而生的。
多路径 -- 功能
- 故障的切换和恢复
- IO流量的负载均衡
- 磁盘的虚拟化
- 查看当前 scsi 设备 .
suse1:~ # sfdisk -l
Disk /dev/sda: 5221 cylinders, 255 heads, 63 sectors/track
Units = cylinders of 8225280 bytes, blocks of 1024 bytes, counting from 0
Device Boot Start End #cyls #blocks Id System
/dev/sda1 0+ 261- 262- 2103296 82 Linux swap / Solaris
/dev/sda2 * 261+ 5221- 4960- 39838720 83 Linux
/dev/sda3 0 - 0 0 0 Empty
/dev/sda4 0 - 0 0 0 Empty
suse1:~ # more /proc/partitions
major minor #blocks name
8 0 41943040 sda
8 1 2103296 sda1
8 2 39838720 sda2
- 获取设备wwid .
for i in `cat /proc/partitions | awk {'print $4'} |grep sd`;
do echo "### $i: `/lib/udev/scsi_id --whitelist
--replace-whitespace /dev/$i`"; done
// 获取后,过滤本地磁盘及重复的wwid .
多路径 -- 配置使用
- 安装和加载多路径软件包 .
# yum –y install device-mapper device-mapper-multipath
# chkconfig --level 2345 multipathd on #设置成开机自启动multipathd
# lsmod |grep dm_multipath #来检查安装是否正常
# rpm -ql device-mapper-multipath | less # 生成的配置文件
- 模块没有加载成功使用下列命初始化DM、重启系统 .
// DM multipath kernel driver not loaded ----这个提示说明DM模块没有加载成功 !!
# modprobe dm-multipath
# modprobe dm-round-robin
# service multipathd start
# multipath –v2
- 校验多路径设备 .
# multipath -ll | grep mpath
// 设备的详细信息
# multipath -ll
# dmsetup ls |sort
#以下命令均可以用于校验多路径设备
# ll /dev/disk/by-id/
# ls -l /dev/dm-*
# ll /dev/mapper/
# /dev/dm-*下面的为动态名,即系统重启后会发生变化,此部分用于os 内部使用。
# /dev/mapper/下面查看到的内容为持久化名称,也即是我们在mulitpatch.conf文件中定义的
- multipath 基本操作命令 .
# /etc/init.d/multipathd start #开启mulitipath服务
# multipath -F #删除现有路径
# multipath -v2 #格式化路径
# multipath -ll #查看多路径
- 配置 multipath .
DM模块成功加载,但是/etc/下没有multipath.conf 配置文件,通过vi命令创建一个Multipath的配置文件路径是/etc/multipath.conf ,在配置文件中添加multipath正常工作的配置如下:
vi /etc/multipath.conf
blacklist {
devnode "^sda"
}
defaults {
user_friendly_names yes
path_grouping_policy multibus
failback immediate
no_path_retry fail
}
编辑完成后保存配置.
# /etc/init.d/multipathd start # 开启mulitipath服务
- multipath 高级配置
multipath.conf主要包括blacklist、multipaths、devices三部份的配置
blacklist配置
blacklist {
devnode "^sda"
}
Multipaths部分配置multipaths和devices两部份的配置。
multipaths {
multipath {
wwid **************** #此值multipath -v3可以看到
alias iscsi-dm0 #映射后的别名,可以随便取
path_grouping_policy multibus #路径组策略
path_checker tur #决定路径状态的方法
path_selector "round-robin 0" #选择那条路径进行下一个IO操作的方法
}
}
Devices部分配置
devices {
device {
vendor "iSCSI-Enterprise" #厂商名称
product "Virtual disk" #产品型号
path_grouping_policy multibus #默认的路径组策略
getuid_callout "/sbin/scsi_id -g -u -s /block/%n" #获得唯一设备号使用的默认程序
prio_callout "/sbin/acs_prio_alua %d" #获取有限级数值使用的默认程序
path_checker readsector0 #决定路径状态的方法
path_selector "round-robin 0" #选择那条路径进行下一个IO操作的方法
failback immediate #故障恢复的模式
no_path_retry queue #在disable queue之前系统尝试使用失效路径的次数的数值
rr_min_io 100 #在当前的用户组中,在切换到另外一条路径之前的IO请求的数目
}
}
- 完整的配置文件 .
blacklist {
devnode "^sda"
}
defaults {
user_friendly_names no
}
multipaths {
multipath {
wwid 14945540000000000a67854c6270b4359c66c272e2f356321
alias iscsi-dm0
path_grouping_policy multibus
path_checker tur
path_selector "round-robin 0"
}
multipath {
wwid 14945540000000000dcca2eda91d70b81edbcfce2357f99ee
alias iscsi-dm1
path_grouping_policy multibus
path_checker tur
path_selector "round-robin 0"
}
multipath {
wwid 1494554000000000020f763489c165561101813333957ed96
alias iscsi-dm2
path_grouping_policy multibus
path_checker tur
path_selector "round-robin 0"
}
multipath {
wwid 14945540000000000919ca813020a195422ba3663e1f03cc3
alias iscsi-dm3
path_grouping_policy multibus
path_checker tur
path_selector "round-robin 0"
}
}
devices {
device {
vendor "iSCSI-Enterprise"
product "Virtual disk"
path_grouping_policy multibus
getuid_callout "/sbin/scsi_id -g -u -s /block/%n"
path_checker readsector0
path_selector "round-robin 0"
}
}
- 获取wwid的方法 .
默认情况下,将使用 /var/lib/multipath/bindings 内的配置设定具体每个多路径设备名,如果在/etc/multipath.conf中有设定各wwid 别名,别名会覆盖此设定.
- 负载均衡测试 .
# dd if=/dev/zero of=/dev/mapper/iscsi-dm1p1
开启另外一个终端用以下命令查看IO情况
# iostat 10 10