Linux的multipath for ASM

之前做过rac的存储级别配置,这里主要涉及到的是asm共享磁盘的配置,裸设备等,一般在linux上面配置asm 共享存储都会选用asmlib或者udev,小鱼个人更倾向于用udev来构造asm disk,而还可以用多路径软件来构造asm disk,接下来用linux自带的multipath构造asm disk。

简单叙述下多路径的原理:一般个人pc都是主机和存储在一起,都是硬盘直接挂接到一个总线上,此时都是一对一的关系,而到光纤组成的san环境、或者iscsi组成的ipsan环境,由于主机和存储通过光纤交换机或者多块网卡及IP来连接,此时主机到存储可以有多条路径可以选择。而且在操作系统级别(linux unix系统只会关注逻辑设备,win上不清楚)管理的都是虚拟的设备,此时os就会认为存在多个设备,而实际上只是一块物理磁盘路径不同导致,为了解决这种问题多路径软件也就产生了。
1故障的切换和恢复
2 IO流量的负载均衡
3 磁盘的虚拟化

接下来用mulitpath固化磁盘设备构造一个单实例的asm实例。
1 验证linux的multipath软件是否安装和启动,系统默认是会安装multipath相关的rpm包
[root@dg01 etc]# rpm -qa|grep mapper
device-mapper-1.02.67-2.el5
device-mapper-multipath-0.4.9-23.0.9.el5
device-mapper-1.02.67-2.el5
device-mapper-multipath-libs-0.4.9-23.0.9.el5
device-mapper-event-1.02.67-2.el5

默认是不会自动启动multipath服务的,这里可以chkconfig设置开机自启动。而且multipath模块默认页不会自动加载到内核模块中,可以手动或设置开机自启动到加载内核模块中。
[root@dg01 etc]# modprobe dm-multipath
[root@dg01 etc]# modprobe dm-round-robin
[root@dg01 etc]# chkconfig --level 2345 multipathd on
[root@dg01 etc]# service multipathd start
Starting multipathd daemon: [ OK ]
上面的chkconfig可以指定开机自启动的服务,而如果要自动加载模块到内核中,直接将modprobe dm-multipath写到开机自启动的文件下例如/etc/init.d下

2 配置multipath,multipath主要是需要配置/etc/multipath.conf文件
[root@dg01 ~]# cat /etc/multipath.conf

blacklist {
devnode "sda"
devnode "sdb"
}

multipaths {
multipath {
wwid SATA_VBOX_HARDDISK_VB78bccd4d-d0b1841b_
alias mpath1
}
}

这里排除了 /dev/sda和/dev/sdb磁盘,其余的系统能检测的磁盘都会根据多路径规则生成对应的多路径磁盘,由于这里小鱼是测试环境只有sda、sdb、sdc三块磁盘,所以也就只有sdc这块磁盘用来生成多路径磁盘了。

需要注意的是wwid SATA_VBOX_HARDDISK_VB78bccd4d-d0b1841b_这个是设备唯一标示符,大家如果用udev绑定disk构造asm有过经验,至于如何去找到这个wwid,方法如下:(linux 6需要去掉-s参数)
Linux 5:
[root@dg01 ~]# scsi_id -g -u -s /block/sdc
SATA_VBOX_HARDDISK_VB78bccd4d-d0b1841b_

3 根据multipath.conf配置文件生成多路径磁盘。
[root@dg01 ~]# multipath –F (清除multipath磁盘)
[root@dg01 ~]# multipath -v2 (格式化multipath磁盘)
create: mpath1 (SATA_VBOX_HARDDISK_VB78bccd4d-d0b1841b_) undef ATA,VBOX HARDDISK
size=4.0G features='0' hwhandler='0' wp=undef
`-+- policy='round-robin 0' prio=1 status=undef
`- 2:0:0:0 sdc 8:32 undef ready running
[root@dg01 ~]# multipath –ll (列出multipath磁盘)
mpath1 (SATA_VBOX_HARDDISK_VB78bccd4d-d0b1841b_) dm-0 ATA,VBOX HARDDISK
size=4.0G features='0' hwhandler='0' wp=rw
`-+- policy='round-robin 0' prio=1 status=active
`- 2:0:0:0 sdc 8:32 active ready running

关于multipath的三个文件和文件夹:
/dev/mapper/mpathn 是软件虚拟出来的多路径设备,这个可以被我们用来挂载使用。
/dev/mpath/mpathn 这个是udev设备管理器创建的,不能用来挂载。
/dev/dm-n 这个是软件自身使用的,不能被软件以外使用。不可挂载。

[root@dg01 ~]# ls -l /dev/mapper/
total 0
crw------- 1 root root 10, 62 Jun 23 23:04 control
brw-rw---- 1 root disk 253, 0 Jun 23 23:15 mpath1
[root@dg01 ~]# ls -l /dev/mpath/
total 0
lrwxrwxrwx 1 root root 7 Jun 23 23:15 mpath1 -> ../dm-0
[root@dg01 ~]# ls -l /dev/dm-0
brw-rw---- 1 root root 253, 0 Jun 23 23:15 /dev/dm-0

4 对多路径磁盘分区
在对多路径磁盘进行分区时最好先运行pvcreate,pvcreate用于把物理磁盘分区生成物理卷。
[root@dg01 ~]# pvcreate /dev/mapper/mpath1
Writing physical volume data to disk "/dev/mapper/mpath1"
Physical volume "/dev/mapper/mpath1" successfully created

[root@dg01 ~]# fdisk /dev/mapper/mpath1
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel. Changes will remain in memory only,
until you decide to write them. After that, of course, the previous
content won't be recoverable.

Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)

Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-522, default 1): 1
Last cylinder or +size or +sizeM or +sizeK (1-522, default 522):
Using default value 522

Command (m for help): p

Disk /dev/mapper/mpath1: 4294 MB, 4294967296 bytes
255 heads, 63 sectors/track, 522 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System
/dev/mapper/mpath1p1 1 522 4192933+ 83 Linux

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.

WARNING: Re-reading the partition table failed with error 22: Invalid argument.
The kernel still uses the old table.
The new table will be used at the next reboot.
Syncing disks.

当对多路径磁盘分区后,发现此时生成的分区并没有在/dev下显示
[root@dg01 ~]# ls -l /dev/mapper/
total 0
crw------- 1 root root 10, 62 Jun 23 23:04 control
brw-rw---- 1 root disk 253, 0 Jun 23 23:27 mpath1
[root@dg01 ~]# ls -l /dev/dm-0
brw-rw---- 1 root root 253, 0 Jun 23 23:15 /dev/dm-0
[root@dg01 ~]# ls -l /dev/mpath/
total 0
lrwxrwxrwx 1 root root 7 Jun 23 23:15 mpath1 -> ../dm-0

此时需要重启ipscan或者fcsan也就是重启iscsi协议服务或者fcscan光纤服务。
[root@dg01 ~]# service iscsi restart
[root@dg01 ~]# start_udev

[root@dg01 ~]# ls -l /dev/mapper/
total 0
crw------- 1 root root 10, 62 Jun 23 23:04 control
brw-rw---- 1 root disk 253, 0 Jun 23 23:34 mpath1
brw-rw---- 1 root disk 253, 1 Jun 23 23:36 mpath1p1
[root@dg01 ~]# ls -l /dev/dm-*
brw-rw---- 1 root root 253, 0 Jun 23 23:33 /dev/dm-0
brw-rw---- 1 root root 253, 1 Jun 23 23:36 /dev/dm-1
[root@dg01 ~]# ls -l /dev/mpath/
total 0
lrwxrwxrwx 1 root root 7 Jun 23 23:15 mpath1 -> ../dm-0
lrwxrwxrwx 1 root root 7 Jun 23 23:36 mpath1p1 -> ../dm-1

5 还要修改multipath下的磁盘宿主
[root@dg01 ~]# vi /etc/udev/rules.d/99-asm-multipath.rules
PROGRAM="/bin/chown oracle:oinstall /dev/mapper/mpath1p1"

[root@dg01 ~]# start_udev
Starting udev: [ OK ]
[root@dg01 ~]# ls -l /dev/mapper/
total 0
crw------- 1 root root 10, 62 Jun 24 02:57 control
brw-rw---- 1 root disk 253, 0 Jun 24 02:58 mpath1
brw-rw---- 1 oracle oinstall 253, 1 Jun 24 03:50 mpath1p1

6 dbca创建asm实例,由于比较简单就不列出了,重点看看asm的参数。
SQL> show parameter asm;

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
asm_diskgroups string MULTI
asm_diskstring string /dev/mapper/*
asm_power_limit integer 1

注意的是dbca创建asm时,那个asm disk的路径是/dev/mapper/,特别还需要注意权限问题。


前篇blog中 http://www.dbaxiaoyu.com/archives/1130 小鱼说到了linux下多路径绑定单实例的asm,当然一般而言单实例下我们还是会尽可能选择文件系统,而如果考虑到rac环境由于需要共享存储,而共享存储更多的需要固化物理磁盘,此时我们可以选择的是asmlib、udev、多路径,一般而言linux上用的较多的是asmlib和udev绑定,多路径在unix上面较多。

下面小鱼介绍下如何用linux自带的多路径软件mulitpath绑定共享存储来创建asm disk:
1 获取共享存储的wwid唯一设备号。
[root@rac01 ~]# scsi_id -g -u -s /block/sdd
SATA_VBOX_HARDDISK_VB3e724211-d3c035ee_
[root@rac01 ~]# scsi_id -g -u -s /block/sde
SATA_VBOX_HARDDISK_VB4ba68a09-6456b28e_
[root@rac01 ~]# scsi_id -g -u -s /block/sdf
SATA_VBOX_HARDDISK_VB487de809-4febb72d_
[root@rac01 ~]# scsi_id -g -u -s /block/sdg
SATA_VBOX_HARDDISK_VB4659564f-3030047e_

blacklist {

devnode "sd[a-c]"
}

2 配置共享存储的多路径
[root@rac01 ~]# cat /etc/multipath.conf
blacklist {

devnode "sd[a-c]"
}

multipaths {
multipath {
wwid SATA_VBOX_HARDDISK_VB3e724211-d3c035ee_
alias data_mpath1
}
multipath {
wwid SATA_VBOX_HARDDISK_VB4ba68a09-6456b28e_
alias data_mpath2
}
multipath {
wwid SATA_VBOX_HARDDISK_VB487de809-4febb72d_
alias back_mpath1
}
multipath {
wwid SATA_VBOX_HARDDISK_VB4659564f-3030047e_
alias back_mpath2
}
}
拷贝多路径配置文件到节点2
[root@rac01 ~]# scp /etc/multipath.conf 192.168.56.103:/etc/multipath.conf

3 生成多路径磁盘
分别在两个节点执行下面的命令。
[root@rac01 ~]# multipath -F
[root@rac01 ~]# multipath -v2
create: data_mpath1 (SATA_VBOX_HARDDISK_VB3e724211-d3c035ee_) undef ATA,VBOX HARDDISK
size=4.0G features='0' hwhandler='0' wp=undef
`-+- policy='round-robin 0' prio=1 status=undef
`- 3:0:0:0 sdd 8:48 undef ready running
create: data_mpath2 (SATA_VBOX_HARDDISK_VB4ba68a09-6456b28e_) undef ATA,VBOX HARDDISK
size=4.0G features='0' hwhandler='0' wp=undef
`-+- policy='round-robin 0' prio=1 status=undef
`- 4:0:0:0 sde 8:64 undef ready running
create: back_mpath1 (SATA_VBOX_HARDDISK_VB487de809-4febb72d_) undef ATA,VBOX HARDDISK
size=4.0G features='0' hwhandler='0' wp=undef
`-+- policy='round-robin 0' prio=1 status=undef
`- 5:0:0:0 sdf 8:80 undef ready running
create: back_mpath2 (SATA_VBOX_HARDDISK_VB4659564f-3030047e_) undef ATA,VBOX HARDDISK
size=2.0G features='0' hwhandler='0' wp=undef
`-+- policy='round-robin 0' prio=1 status=undef
`- 6:0:0:0 sdg 8:96 undef ready running
[root@rac01 ~]# multipath -ll
back_mpath2 (SATA_VBOX_HARDDISK_VB4659564f-3030047e_) dm-3 ATA,VBOX HARDDISK
size=2.0G features='0' hwhandler='0' wp=rw
`-+- policy='round-robin 0' prio=1 status=active
`- 6:0:0:0 sdg 8:96 active ready running
back_mpath1 (SATA_VBOX_HARDDISK_VB487de809-4febb72d_) dm-2 ATA,VBOX HARDDISK
size=4.0G features='0' hwhandler='0' wp=rw
`-+- policy='round-robin 0' prio=1 status=active
`- 5:0:0:0 sdf 8:80 active ready running
data_mpath2 (SATA_VBOX_HARDDISK_VB4ba68a09-6456b28e_) dm-1 ATA,VBOX HARDDISK
size=4.0G features='0' hwhandler='0' wp=rw
`-+- policy='round-robin 0' prio=1 status=active
`- 4:0:0:0 sde 8:64 active ready running
data_mpath1 (SATA_VBOX_HARDDISK_VB3e724211-d3c035ee_) dm-0 ATA,VBOX HARDDISK
size=4.0G features='0' hwhandler='0' wp=rw
`-+- policy='round-robin 0' prio=1 status=active
`- 3:0:0:0 sdd 8:48 active ready running

4对多路径磁盘进行规划(这里可以选择分区也可以选择不分区,注意如果分区最好对/dev/mapper 下的目录进行分区,例如fdisk /dev/mapper/back_mpath1)

分区完成后分别在两个节点重启下iscsi服务和udev规则检验
[root@rac01 ~]# service iscsi restart
[root@rac01 ~]# start_udev
[root@rac01 ~]# ls -l /dev/mapper/
total 0
brw-rw---- 1 root disk 253, 2 Jun 27 22:35 back_mpath1
brw-rw---- 1 root disk 253, 5 Jun 27 22:35 back_mpath1p1
brw-rw---- 1 root disk 253, 3 Jun 27 22:35 back_mpath2
brw-rw---- 1 root disk 253, 4 Jun 27 22:35 back_mpath2p1
crw------- 1 root root 10, 62 Jun 27 21:10 control
brw-rw---- 1 root disk 253, 0 Jun 27 22:54 data_mpath1
brw-rw---- 1 root disk 253, 6 Jun 27 22:55 data_mpath1p1
brw-rw---- 1 root disk 253, 1 Jun 27 22:54 data_mpath2
brw-rw---- 1 root disk 253, 7 Jun 27 22:55 data_mpath2p1

5 改变磁盘的宿主权限。
[root@rac01 oracle]# cat /etc/udev/rules.d/99-asm-multipath.rules
PROGRAM="/bin/chown oracle:oinstall /dev/mapper/back_mpath1p1"
PROGRAM="/bin/chown oracle:oinstall /dev/mapper/back_mpath2p1"
PROGRAM="/bin/chown oracle:oinstall /dev/mapper/data_mpath1p1"
PROGRAM="/bin/chown oracle:oinstall /dev/mapper/data_mpath2p1"
[root@rac01 oracle]# ls -l /dev/mapper/
total 0
brw-rw---- 1 root disk 253, 2 Jun 27 22:36 back_mpath1
brw-rw---- 1 oracle oinstall 253, 5 Jun 27 22:36 back_mpath1p1
brw-rw---- 1 root disk 253, 3 Jun 27 22:36 back_mpath2
brw-rw---- 1 oracle oinstall 253, 4 Jun 27 22:36 back_mpath2p1
crw------- 1 root root 10, 62 Jun 27 21:11 control
brw-rw---- 1 root disk 253, 0 Jun 27 22:36 data_mpath1
brw-rw---- 1 oracle oinstall 253, 6 Jun 27 23:09 data_mpath1p1
brw-rw---- 1 root disk 253, 1 Jun 27 22:36 data_mpath2
brw-rw---- 1 oracle oinstall 253, 7 Jun 27 23:09 data_mpath2p1

拷贝规则文件到另一个节点
[root@rac01 oracle]# scp /etc/udev/rules.d/99-asm-multipath.rules 192.168.56.103:/etc/udev/rules.d/99-asm-multipath.rules
[root@rac02 oracle]# start_udev
[root@rac02 oracle]# ls -l /dev/mapper/
total 0
brw-rw---- 1 root disk 253, 2 Jun 27 22:36 back_mpath1
brw-rw---- 1 oracle oinstall 253, 5 Jun 27 22:36 back_mpath1p1
brw-rw---- 1 root disk 253, 3 Jun 27 22:36 back_mpath2
brw-rw---- 1 oracle oinstall 253, 4 Jun 27 22:36 back_mpath2p1
crw------- 1 root root 10, 62 Jun 27 21:11 control
brw-rw---- 1 root disk 253, 0 Jun 27 22:36 data_mpath1
brw-rw---- 1 oracle oinstall 253, 6 Jun 27 23:09 data_mpath1p1
brw-rw---- 1 root disk 253, 1 Jun 27 22:36 data_mpath2
brw-rw---- 1 oracle oinstall 253, 7 Jun 27 23:09 data_mpath2p1

此时asm disk所需的盘符已经规定好了,接下来可以直接进行asm配置,需要注意的是asm_diskstring需要设置/dev/mapper/*设备,而不要设置/dev/dm-*形式的设备,/dev/dm-*设备是不固定的而且也是供内部使用的。

Asm实例的信息如下:
SQL> show parameter asm;

NAME TYPE
------------------------------------ ----------------------
VALUE
------------------------------
asm_diskgroups string
DATA, BACK
asm_diskstring string
/dev/mapper/*
asm_power_limit integer
1
SQL> select disk_number,path,name from v$asm_disk;

DISK_NUMBER PATH NAME
----------- ---------------------------------------- --------------------
1 /dev/mapper/data_mpath2p1 DATA_0001
0 /dev/mapper/data_mpath1p1 DATA_0000
0 /dev/mapper/back_mpath1p1 BACK_0000
1 /dev/mapper/back_mpath2p1 BACK_0001

请使用浏览器的分享功能分享到微信等