Linux Device Mapper Multipathing技术
在SAN存储网络中,冗余地访问存储设备是整个系统的关键技术之一,在Linux平台,开源的解决方案之一是DM-Multipath。
Device Mapper Multipathing ( DM-Multipath )允许在服务器节点和存储阵列之间配置多个I/O路径但仍视为一个单一存储设备。这些I/O路径是物理SAN连接,可以包含独立的数据线,交换机和控制 器。多路径集成了I/O路径,创建了包含集成多路径的一个新设备。
本文主体是基于Red Hat管理手册 Red HatEnterprise Linux 5 DM Multipath – DM Multipath Configuration and AdministrationEdition 3 结合项目实施过程中的实践撰写的。文档以Red Hat英文管理手册翻译为主,并完整经过实践。
DM-Multipath概述
DM-Multipath 可以提供:
· 冗余
DM-Multipath 可以在 active/passive 配置中提供failover。在一个active/passive 配置中,对于I/O任何时候只使用一半的路径。如果一个I/O路径的任何组成部分(数据线,交换机或控制器)出现故障, DM-Multipath将切换到一个替换路径上。
· 性能提高
DM-Multipath 可以配置为 active/active 模式,这样I/O采用round-robin 方式分摊到多路径上。在一些配置中,DM-Multipath 可以检测到I/O路径的负载并可以动态重平衡负载。
· Active/PassiveMulstipath Configuration with one RAID Devices
配置说明:
·
o 提供了HBA,FC cable,SAN switch和阵列控制器failover
o 不支持硬件存储阵列故障failover
· 更为复杂的Active/Passive Mulstipath Configuration with one RAID Devices
配置说明:
·
o 支持全冗余硬件failover
o 数据冗余需要通过软件来实现
存储阵列支持
默认情况 下,DM-Multipath 支持大多数支持 DM-Multipath 技术的常用存储。所有支持的存储设备可以在multipath.conf.defaults文件中查询。
如果所使用的存储阵列没有在默认配置文件中列出,可能需要添加到 DM-Multipath 配置文件 multipaht.conf中。
一些存储阵列需要处理特殊的I/O错误 和路径切换,这些请求需要特定的引见处理内核模块。
DM-Multipath 模块
组件 |
描述 |
dm-multipath内核模块 |
重 路由I/O和支持对路径和路径组的failover |
multipath命令 |
列出和配置多路径设备。通常使用 /etc/rc.sysinit 来启动,也可以使用 udev 程序在添加一个块设备时启动,或者通过 initramfs 文件系统来运行 |
multipathddaemon |
监 控路径;当路径失效或恢复, multipathd 服务会初始化路径组切换。提供对多路径的交互式修改。任何 /etc/multipath.conf 的配置修改都要重启该服务 |
kpatx |
创 建设备映射设备用于一个设备的分区,对于使用基于DOS分区的 DM-MP 是必要的命令。kpartx 基于自己的软件包,但是 device-mapper-multipath 软件包以来此软件包 |
DM-Multipath 设置概览
DM-Multipath 包括内编译( compiled-in )的默认设置,适合常规的多路径配置。设置 DM-Multipath 通常是一个简单的过程。
基本的 DM-Multipath 配置过程如下
· 安装 device-mapper-multipath 软件包
· 编辑multipath.conf 配置文件:
o 去掉默认的blacklist
o 修改需要的现有默认配置
o 保存配置文件
· 启动multipath服务
· 使用 multipath 命令创建多路径设备
多路径设备
当没有使用 DM-Multipath 时,任何从服务器节点到一个存储控制器的路径都会被视为系统一个独立的设备,甚至这些I/O路径连接相同的服务器节点到相同的存储控制器。 DM-Multipath 通过创建在底层设备上再一个多路径设备,提供了一个在逻辑上组织I/O路径的方法。
多路径设备标识
每个多路径设备都具备一个 全局标识(WWID,World Wide Identifir),这个标识生成后是全局唯一并且不能修改。默认情况下,一个多路径设备是设置为它的WWID。不过,也可以设置多路径配置文件中的user_friendly_names 参数,这样可以设置类似mpathn 这样的节点唯一别名。
例如,一个节点通 过一个单一的非区域光纤(FC)交换机使用双HBA卡连接诶到一个存储控制器的两个接口上,则服务器可以看到4个设备: /dev/sda , /dev/sdb , /dev/sdc , /dev/sdd 。 DM-Multipath 使用一个唯一的WWID创建一个单一设备,这样可以重路由I/O到这4个符合多路径配置的底层设备。当设置user_friendly_names 配置参数被设置为yes ,则多路径设备命名将设置为 mpathn 。
当一个信设备被连接到 DM-Multipath 控制,这个新设备可能被可以在 /dev 目录下3个不同的设备位置查看到:/dev/mapper/mpathn , /dev/mpath/mpathn 和 /dev/dm-n
· 位于/dev/mapper 的设备是最早在启动过程中创建的。这些设备用于multipathed设备访问,例如当创建逻辑卷。
· 位于/dev/mpath 的设备是便于所有多路径设备在统一目录下检查而提供的。这些设备由udev 设备管理器创建,并且可能在启动时不可用。不要使用这些设备来构建逻辑卷或者文件系统。
· 所有类似 /dev/dm-n的设备只能内部使用,不能由用户使用。
在一个群集中一致的多路径设备命名
当在配置文件中设置 user_friendly_names 配置参数为 yes ,这个多路径设备的命名将对一个节点将是唯一的,但是不能保证对所有节点这个命名也是唯一的。这样对于在多路径设备上使用LVM创建逻辑设备虽然不会导致 困难,但是如果要求群集所有节点都使用一致的命名来访问多路径设备,则需要执行以下步骤:
· 在多路径配置文件中的 multipaths 配置段使用alias 选项来设置多路径设备。这个多路径设备的 alias 命名对于一个群集的节点是完全一致的。
· 如果需要在系统定义的用户友好命名上对群集所有节点使用统一命名,则在一个主机上设置所有多路径设备。然后将/var/lib/multipath/binding 配置文件从这台服务器复制到群集的所有其他节点上。
多路径设备特性
在附加的 user_friendly_names 和 alias 选项,一个多路径设备具有数字属性。可以在多路径配置文件的multipaths 部分对一个特定的多路径设备创建一个设备项来修改这些属性。
在逻辑卷中使用多路径设备
在创建多路径设备后,可以使用多路径设 备作为一个物理设备命名来创建一个LVM逻辑卷管理。例如,如果/dev/mapper/mpath0 是一个多路径设备,则以下命令可以把 /dev/mapper/mpath0 作为一个物理卷。
1 |
pvcreate /dev/mapper/mpath0 |
可以在创建LVM卷组的时候像使用其他LVM物理卷设备以上使用以上LVM物理卷设备。
注意
如 果一个物理设备上已经配置了分区,则在整个设备上创建一个LVM物理卷, pvcreate 命令会失败。注意Anaconda和 Kickstart 安装程序会在每个没有标记的块设备上创建一个空的分区表。如果希望使用整个物理设备而不是一个分区,则需要在这个设备上删除所有存在的分区。可以使用kpartx -d 命令或 fdisk 命令来 现有分区。如果系统是哟给你大于 2Tb 的块设别,可以使用parted 命令来删除分区。
当创建一个LVM卷管理来使用active/passive 多路径存储作为底层物理设备,则需要在 lvm.conf 配置中包含过滤设置以去除这些多路径设备。这是因为无论何时LVM扫描到没有过滤的后备路径设备,则阵列就会在接收到故障失效信号时自动修改了活动路径到 后备路径。对于active/passive 阵列要求一个命令来使后备路径激活,LV<会在这个情况下打印一条告警信息。
要在LVM配置文件( lvm.conf )中过滤掉所有SCSI设备,则包含以下过滤到 devices 配置部分
1 |
filter = [ "r/disk/", "r/sd.*/", "a/.*/" ] |
注意在实际环境中,需要指定特定的SCSI设备
设置 DM-Multipath在设置系统的DM-Multipath之前,确保系统已经 升级并包括 device-mapper-mulipath 软件包。
使用以下过 程设置DM-Multipath 的一个基本failover配置
· 编辑/etc/multipath.conf 启用文件的头部配置,配置文件的部分,在初始状态,blacklist所有设备。必须先注释掉以下配置启用来激活multipath。
将
1 |
blacklist { |
2 |
devnode "*" |
3 |
} |
修改为
1 |
# blacklist { |
2 |
# devnode "*" |
3 |
# } |
· 默认的DM-Multipath配置已经编译到系统中并且不需要预先在 /etc/multipath.conf 配置中设置。
默认的 path_grouping_policy 已经设置了 failover ,所以在配置中不需要修改默认值。
配置文件中的初 始默认部分配置了系统的多路径设备格式 mpathn ,没有这个配置,那么多路径设备的名字将被设置为WWID的别名。
· 执行以下命令
1 |
modprobe dm-multipath |
2 |
service multipathd start |
3 |
multipath -v2 |
以上命令 multipath -v2 打印出具备多路径的设备。如果该命令没有输出任何信息,则要确认所有的SAN连接已经正确设置并且系统是 multipathed 的。
·
o 执行 multipath-v2 显示输出
1 |
multipath -v2 |
sdc: checker msg is "readsector0 checker reports path is down"sdd:checker msg is "readsector0 checker reports path is down"
此时,再使用 fdisk -l 命令,则原来显示的
Disk /dev/sda: 21.4 GB,21474836480 bytes255 heads, 63 sectors/track, 2610 cylindersUnits = cylindersof 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System/dev/sda1 * 1 2087 16763796 83 Linux/dev/sda2 2088 2609 4192965 82 Linux swap / SolarisDisk/dev/sdb: 577.4 GB, 577404665856 bytes255 heads, 63 sectors/track, 70198cylindersUnits = cylinders of 16065 * 512 = 8225280 bytes DeviceBoot Start End Blocks Id SystemDisk/dev/sdc: 2199.0 GB, 2199023255552 bytes255 heads, 63 sectors/track, 267349cylindersUnits = cylinders of 16065 * 512 = 8225280 bytesDisk /dev/sdc doesn'tcontain a valid partition tableDisk /dev/sdd: 2199.0 GB, 2199023255552 bytes255heads, 63 sectors/track, 267349 cylindersUnits = cylinders of 16065 * 512 =8225280 bytesDisk /dev/sdd doesn't contain a valid partition table
则在后面增加显示了
Disk /dev/dm-0: 577.4 GB,577404665856 bytes255 heads, 63 sectors/track, 70198 cylindersUnits = cylindersof 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id SystemDisk /dev/dm-1: 2199.0 GB,2199023255552 bytes255 heads, 63 sectors/track, 267349 cylindersUnits =cylinders of 16065 * 512 = 8225280 bytesDisk /dev/dm-1 doesn't contain a validpartition table
这表明默认情况下,所有没有分配的块设备都被识别为多路径设备。但是,需要注意的是
"readsector0checker reports path is down"
这表明SAN设备尚不能判断路径是否可用。
·
o 使用 multipath-l 检查设备
1 |
multipath -l |
mpath2 (360022a11000120094e3181b800000000)dm-1 HUAWEI,S5600[size=2.0T][features=0][hwhandler=0][rw]\_ round-robin 0[prio=0][active] \_ 3:0:0:0 sdc 8:32 [active][undef]\_ round-robin 0[prio=0][enabled] \_ 3:0:1:0 sdd 8:48 [active][undef]mpath1 (360026b90596a0f00134750591a3c2a3c) dm-0 DELL,PERC 6/i[size=538G][features=0][hwhandler=0][rw]\_round-robin 0 [prio=0][active] \_ 0:2:1:0 sdb 8:16 [active][undef]
其中,前者是华为SAN存储输出的多路径存储阵列,其中 /dev/sdc 和 /dev/sdd 是同一个设备(WWID相同)。后者是本地设备由Dell PERC 6内建的RAID1 SCSI存储。
单路径配置
有关如何显示 SCSI设备的UUID或WWID,参考 7.3.Configuring persistent storage in a Red Hat Enterprise Linux 5 environment
在不使用multipath的系统中,udev是一个实现LUN永久化的 好方法。
· 编辑/etc/scsi_id.config 配置文件,确保注释掉如下配置
1 |
# options=-b |
· 添加以下行到/etc/scsi_id.config
1 |
options=-g |
以上配置可以让udev假设所有连接的SCSI设备将返回UUID(唯一设备标识)。
· 通过执行以下命令scsi_id -g -s /block/sdc 来显示
类似
1 |
scsi_id -g -s /block/sdb |
360026b90596a0f00134750591a3c2a3c
可以看到就是前述使用 multipath -l 显示的WWID。
此外,对于multipath自动推 测并忽略的sda,也能够显示UUID
scsi_id -g -s /block/sda
这样,就可以在多路径配置中,通过设置WWID的blacklist来过滤掉本地SCSI磁盘。
另外,对于各种cluster群集, 如果要使用iSCSI等设备,为了能够固定映射名称,需要创建/etc/udev/rules.d/20-names.rules ,在其中添加命名规则类似
KERNEL="sd*",BUS="scsi", PROGRAM="/sbin/scsi_id -g -s", RESULT=UUID,NAME=devicename
将以上的规则中 UUID 替换为前面查询出来的指定设备UUID(例如/dev/sdb), 名称设置devicename 替换为需要指定的设备名称,如 asm1
这将迫使系统识 别所有相应的块设备(/dev/sd* )给出相应的UUID。当系统找到匹配的设备,将创建一个设备节点命名为 /dev/devicename。 例如,这个设备可以命名为 /dev/asm1 。
· 最后,添加命令行到/etc/rc.local
1 |
/sbin/start_udev |
多路径配置
在一个多路径环境中实现LUN永久化,需要定义多路径设备的别名。要标识一个设备的UUID或WWID则遵循上 述的单路径配置部分。多路径设备将创建在 /dev/mpath 目录下。例如,以下在 /dev/multipath.conf 配置中定义4个设备:
01 |
multipaths { |
02 |
multipath { |
03 |
wwid 3600805f30015987000000000768a0019 |
04 |
alias oramp1 |
05 |
} |
06 |
multipath { |
07 |
wwid 3600805f30015987000000000d643001a |
08 |
alias oramp2 |
09 |
} |
10 |
mulitpath { |
11 |
wwid 3600805f3001598700000000086fc001b |
12 |
alias oramp3 |
13 |
} |
14 |
mulitpath { |
15 |
wwid 3600805f300159870000000000984001c |
16 |
alias oramp4 |
17 |
} |
18 |
} |
则以上配置将创建4个LUN设备,分别命名为 /dev/mpath/oramp1,/dev/mpath/oramp2,/dev/mpath/oramp3 和/dev/mpath/oramp4 。系统重启后,这些新命名将持久化。
· 执行以下命令确保多路径服务在启动时启动
1 |
chkconfig multipathd on |
由于 user_friendly_name 设置为 yes ,所以多路径设备创建为/dev/mapper/mpathn 。
昵称: gunguymadman 时间: 2010-07-28 16:38:00
在 生成多路径设备时忽略本地磁盘
一些主机已经具备了本地SCSI磁盘作为内部磁盘。对于这些磁盘设备不建议使用 DM-Multipath。 以下过程展示如何修改多路径配置文件以忽略本地磁盘:
· 检查哪些磁盘是本地磁盘,并标记这些磁盘到blacklist中。例如, /dev/sda 是本地内部磁盘。注意,在默认的多路径配置中,
例 如,在本例中,上述multipath -l 命令输出的 WWID 360026b90596a0f00134750591a3c2a3c (即磁盘/dev/sdb) 就是本地磁盘,需要从多路径配置文件中排除。
在 /etc/multipath.conf 配置中添加
1 |
blacklist { |
2 |
wwid 360026b90596a0f0013475046191d4cdb |
3 |
wwid 360026b90596a0f00134750591a3c2a3c |
4 |
} |
· 配置完成后,需要手工通知 multipathd 服务重新加载配置文件。
1 |
service multipathd reload |
· 执行以下命令
1 |
multipath -F |
2 |
multipath -v2 |
create: mpath2 (360022a11000120094e3181b800000000) HUAWEI,S5600[size=2.0T][features=0][hwhandler=0][n/a]\_round-robin 0 [prio=1][undef] \_ 3:0:0:0 sdc 8:32 [undef][ready]\_round-robin 0 [prio=1][undef] \_ 3:0:1:0 sdd 8:48 [undef][ready]
可以看到,已经排除了本地磁盘 sda 和 sdb ,另外,非常奇特的是,也不再出现 "readsector0 checkerreports path is down" 报错信息。
注意,再次使用 multipath -v2 将不再有任何输出,这个命令只在初次使用时创建设备。后续要使用 multipath -l。
1 |
multipath -l |
mpath2 (360022a11000120094e3181b800000000)dm-0 HUAWEI,S5600[size=2.0T][features=0][hwhandler=0][rw]\_ round-robin 0[prio=0][active] \_ 3:0:0:0 sdc 8:32 [active][undef]\_ round-robin 0[prio=0][enabled] \_ 3:0:1:0 sdd 8:48 [active][undef]在Multipathing数据库中添加设备
默认情况下,DM-Multipath包含支持绝 大多数支持DM-Multipaht的存储设备。默认配置参数,包括支持的存储设备,可以在 multipath.conf.defaults文 件中找到。
如果需要添加的存储设备没有在默认的多路径设备列表中,则编辑 /etc/multipath.conf 文件加入相近的设备信息。
例如,添加 HP Open-V 系列:
1 |
devices { |
2 |
device { |
3 |
vendor "HP" |
4 |
product "OPEN-V." |
5 |
getuid_callout "/sbin/scsi_id -g -u -p0x80 -s /block/%n" |
6 |
} |
7 |
} |
DM-Multipath配置文件
默认的配置文件位于 /usr/share/doc/device-mapper-multipath-0.4.7/multipath.conf.defaults
可 以通过/etc/multipath.conf 配置来覆盖默认配置项。如果需要,也可以添加默认配置中没有支持的存储阵列。
有关配置文件的注释,参考/usr/share/doc/device-mapper-multipathd-0.4.7/multipath.conf.annotated
配 置文件概览
· blacklist
列出所有 不作为多路径的设备。默认情况下,所有设备都不启用多路径。
· blacklist_exceptions
列 出多路径设备候选清单
· defaults
DM-Multipath 默认设置
· multipaths
设置独立 的多路径设备的特性。这些设置选项覆盖在配置文件的 defaults 和 devices 段落部分的参数设置。
· devices
设 置独立的存储控制器。这些设置选项覆盖在配置文件的 defaults 段落部分的参数设置。如果使用的存储阵列没有在默认支持列表中,可能需要创建一个devices 项。
配置Blacklist
blacklist 部分设置多路径配置中需要忽略的存储设备。所有在blacklist中的设备不会包括在多路径设备中。
默认情况下,所有设备都是排除的,因为默认 配置中有
1 |
blacklist { |
2 |
devnode "*" |
3 |
} |
要激活多路径设备支持,首先需要把以上配置全部注释掉。
通过WWID屏蔽设备
可以通过存储设备的 World-Wide IDentification ( wwid )来设置多路径设备配置文件
1 |
blacklist { |
2 |
wwid 360026b90596a0f0013475046191d4cdb |
3 |
wwid 360026b90596a0f00134750591a3c2a3c |
4 |
} |
通过设备名来屏蔽设备
以下配置屏蔽所有SCSI设备
1 |
blacklist { |
2 |
devnode "^sd[a-z]" |
3 |
} |
可以使用 devnode 来设置指定 blacklist 中屏蔽的设备。但是,这不是推荐的方法,除非设备采用了udev 规则进行固定的映射,否则无法保证系统重启后设备命映射相同。
默认情况下,以下 devnode 被编译进默认的 blacklist ,这些设备不会设置为 DM-Multipath 。要激活以下设备的多路径设置,需要把这些设备添加到 blacklist_exceptions 部分
1 |
blacklist { |
2 |
devnode "^(ram|raw|loop|fd|md|dm-|sr|scd|st)[0-9]*" |
3 |
devnode "^hd[a-z]" |
4 |
} |
通过设备类型屏蔽设备
可以在参考以下方式在 device 部分屏蔽设备
01 |
blacklist { |
02 |
device { |
03 |
vendor "IBM" |
04 |
product "3S42" #DS4200 Product 10 |
05 |
} |
06 |
device { |
07 |
vendor "HP" |
08 |
product "*" |
09 |
} |
10 |
} |
Blacklist例外
可以使用 blacklist_exceptions 部分配置来设置屏蔽设备的例外情况。例如,默认情况下,具备 vendor = "IBM" 和 product = "S/390.*" 是被屏蔽的,因为这些用于本地的设备通常是DASD设备。如果需要激活这些设备的多路径特性,则配置
1 |
blacklist_exceptions { |
2 |
device { |
3 |
vendor "IBM" |
4 |
product "S/390.*" |
5 |
} |
6 |
} |
配置文件详细信息
参考 4.3.Configuration File Defaults
多路径设备配 置特性
参考 4.4.Multipaths Device Configuration Attributes
配 置文件设备
许多设备所支持的多路径特性在多路径配置文件中已经包含。可能不需要修改这些设备的参数,但是可以通过在配置文件中包含特定参数来覆 盖默认配置。
可以通过在 /sys/block/device_name/device/vender 等参数来产看设备情况
1 |
cat /sys/block/sdc/device/vendor |
HUAWEI
1 |
cat /sys/block/sdc/device/model |
S5600DM-Multipath管理和故障排除Resizing一个在线多路径设备
· 对物理设备resize
· 使用以下命令查询LUN的路径
1 |
multipath -l |
· resize 路径。对于SCSI设备,对 rescan 文件设置为1 可以使SCSI设备重新扫描。
1 |
echo 1 > /sys/block/device_name/device/rescan |
· resize 多路径设备
1 |
multipathd -k 'resize map mpath0' |
· resize 文件系统
1 |
resize2fs /dev/mapper/mpath0 |
multipath命令选项
参数 |
描述 |
-l |
显 示从sysfs中获取的当前多路径配置信息和设备映射 |
-ll |
示 从sysfs中获取的当前多路径配置信息和设备映射以及其他系统中可用的设备组件 |
-f device |
删除该命名 的多路径设备 |
-F |
删 除所有多路径设备 |
使用dmsetup命令检测设备映射项
可以使用 dmsetup 命令查找符合多路径设备的设备映射项。
1 |
dmsetup ls |
mpath2 (253, 0)使用交互控制台排除故障
命令 multipathd -k 命令是针对 multipathd 服务的交互接口。此命令会提供一个交互的多路径控制台,进入该控制台之后,可以使用help 命令来列出所有可用命令,退出使用 CTRL-D 。
1 |
multipathd -k |
multipathd>
1 |
show config |
以下控制台命令使multipath重新获取 multipath.conf 配置中变化。
1 |
reconfigure |
以下命令显示可用路径
1 |
show paths |
hcil dev dev_t pri dm_st chk_st next_check3:0:0:0 sdc 8:32 1 [active][ready] XXXXXXXXX. 18/203:0:1:0 sdd 8:48 1 [active][ready] XXXXXXXXX. 18/20