存储拓扑如下(点击看大图):

emc-storage
emc-storage

一、需求

站点 集群名称 主机名 WWWN 存储阵列/空间需求
主站点03 irrac03 irora11 10000090fa07c5fa 10000090fa07c5fb EMC VMAX10K RAID10/2000G (20*100GB)
irora12 10000090fa07c5ea 10000090fa07c5eb
irora13 10000090fa07c66c 10000090fa07c66d

如上表,这里是一套oracle RAC数据库的三个节点,及其对应的主机端HBA卡的wwwn号,此次需求是从存储上划分2T的数据(20个LUN)给这套数据库 ---数据库之前的数据需要保留。

二、磁盘信息备份

变更操作前,可以通过如下命令将现已存在的磁盘信息进行备份:

 1mkdir diskinfo_`date +%y%m%d`
 2cd diskinfo_`date +%y%m%d`
 3cat /sys/class/fc_host/host*/port_name > wwwn
 4fdisk -l > fdisk
 5cat /proc/scsi/scsi > procscsi
 6multipath -ll > multipath
 7powermt display > powermt
 8powermt display dev=all >>powermt
 9emcpadm export_mappings -x -f map.xml
10lsscsi > lsscsi
11ls -l /dev > dev
12ls -l /dev/asmdisk > asmdisk
13ls -l /dev/mapper/ > mapper
14for i in `ls /dev/disk`;do
15ls -l /dev/disk/$i >>devdisk
16done
17cp /etc/udev/rules.d/*asmdisk*  .

三、存储上划LUN

存储划LUN可以进行浏览器图形操作,也可以通过命令方的方式进行配置 。先说图形配置,通过浏览器打开https://存储IP:8443 ,输入用户名密码后进入如下界面:

storage
storage

storage下会有很多选项,我们选择volumes ,再点virtual volume ,双击打开TDEV ,如下:

volumes
volumes

最下面点击Create就会弹出划LUN配置界面,如下:

create-lun
create-lun

选择最下面的run now后,就会开始创建lun,lun创建好后,会弹出一个successfully created volumes的框 。

当然也可以通过命令进行lun的创建 ,具体命令如下:

1symconfigure -sid 0082 -cmd "set symmetrix auto_meta_member_size=27307;" commit
2symconfigure -sid 0082 -cmd "create dev count=20,  size=109928cyl, emulation=FBA, config=TDEV, binding to pool= VP_FC10_R10, preallocate size=all;" commit

四、将lun分配给主机组

LUN空间在存储端划好后,还需要将这部分LUN分配给主机组。在刚刚登录的web管理界面,依次通过点击:Storage > Storage Groups >sg_irrac03(对应的rac主机组),选择右边的volumes ,点击Add从volumes To Storage Group菜单里选取刚划分好的20个100GLUN,再点OK完成LUN的分配。如下图:

storage-group
storage-group

分配完成后,可以退回到上图中的sg_irrac03位置,分别点击右边的Associated With:后的MaskingViews-3 ,由于该rac有三台主机,所以进去后会看到三台主机。选择其中一台,再点下面的View details或View Connections ,可以看到该主机分配的所有存储LUN情况。确认刚刚创建的LUN都已经在其中,就证明分配的没问题。

五、主机扫盘

扫盘和保存配置命令如下:

1# cd /sys/class/scsi_host/host4/
2# echo '- - - ' > scan
34# echo "1" > /sys/class/fc_host/host4/issue_lip
5完成扫盘后保存配置
6#Powermt config
7#powermt save

不同型号的HBA,扫盘的时候命令也不同,有些是操作sys下的scan文件,另一些操作是issue_lip文件。扫盘完成后,就可以在系统下识别新增的盘了,具体可以通过powermt display对比前后总LUN的数目(powermt命令需要在安装EMC的多路径软件后才有,如果使用系统自带的multipath,需要使用multipath -ll查看)。

以上操作需要在三台RAC节点上分别执行。

六、存储主机加盘相关理论

storage-server
storage-server

数据库加盘操作主要涉及到三个概念:存储别名、scsi_id、askdisk别名。

1、存储别名:是由多路径软件聚合后生成的名称,无论是emcpower或者multipath 都可以通过特殊的命令或配置文件修改,变更该名称;

2、scsi_id:该id是唯一值,在存储划lun完成后就已经生成的,在主机上也可以通过scsi_id命令获取到,无论是存储别名还是asmdisk别名,最终都是跟此ID保持一致;

3、asmdisk别外:该名称是通过udev策略匹配scsi_id后通过触发生成的 ,该名称是便于数据库管理员维护使用;

4、以三节点的rac为例,理论上来说三台主机的存储别名与asmdisk不一定非要保持一致。如:某一scsi_id,在A主机上存储别名为emcpoweran,B主机上存储别名为emcpoweram,但通过udev策略修改过后,A、B两台主机上的asmdisk别名都为asm-data-an,这在数据库里加盘是没问题的。但出于后期维护的便利性和信息的统一性,强制要求同一个LUN在三台主机上这三个信息是一致的。

除以上提到的三个信息外,存储还会有Logical device ID这类唯一性信息存在,Logical device ID的作用和scsi_id的作用一样,也是唯一的。具体见下图:

lun-info
lun-info

scsi-info
scsi-info

七、对盘

1、同台主机增加前后对盘

1powermt display dev=all|grep 'Pseudo\|Logical' |awk '{if(NR%2==0){printf $0 "\n"}else{printf "%s\t",$0}}' > /tmp/powermt_new
2cat powermt|grep 'Pseudo\|Logical' |awk '{if(NR%2==0){printf $0 "\n"}else{printf "%s\t",$0}}' > /tmp/powermt_old
3diff /tmp/powermt_new /tmp/powermt_old |grep '<' |awk '{print $NF,$3}' > /tmp/1.txt

2、RAC主机间对盘(三台主机)

1# join -a1  <(sort 3.txt) <(sort 2.txt) | join - <(sort 1.txt)
2ID=0A72 name=emcpowerdq name=emcpowerbh name=emcpowerbh
3ID=0A76 name=emcpowerdr name=emcpowerdq name=emcpowergb
4ID=0A7A name=emcpowerds name=emcpowerdr name=emcpowergc
5………………省略

为了便于进一步处理时可以更好的生成修改的脚本,我也可以将以上输出的结果,使用sed命令处理,将其中的name=字段去掉 。如下:

1join -a1  <(sort 03s) <(sort 08s) | sed 's/name=//g' > join.txt

3、生成自动修改脚本

这里使用的是emcpadm命令进行的修改,这个之前在 linux下powerpath对盘与更改盘符名 。脚本内容如下:

 1#!/bin/bash
 2# author : write by yangbk < www.361way.com  >
 3# mail : [email protected]
 4# desc : gen file of change disk name
 5function emcmod(){
 6    while read line;do
 7        v1=`echo $line|awk '{print $'$1'}' `
 8        v2=`echo $line|awk '{print $'$2'}'`
 9        #echo $v1 $v2
10        pre=${v2:8:1}
11        suf=${v2:8:2}
12        nv=emcpower${pre}${suf}
13        if [ $v1 != $v2 ];then
14            echo "emcpadm renamepseudo –s $v2 –t $nv"
15        fi
16    done < join.txt
17}
18function emcmod2(){
19    while read line;do
20        v1=`echo $line|awk '{print $'$1'}' `
21        v2=`echo $line|awk '{print $'$2'}'`
22        #echo $v1 $v2
23        pre=${v2:8:1}
24        suf=${v2:8:2}
25        nv=emcpower${pre}${suf}
26        if [ $v1 != $v2 ];then
27            echo "emcpadm renamepseudo –s $nv –t $v1"
28        fi
29    done < join.txt
30}
31#result2=$(emcmod 2 3)
32#echo $result2
33echo '--------------------------------------'
34emcmod 2 3
35echo '--------------------------------------'
36emcmod2 2 3
37echo -e "\n\n\n"
38echo '--------------------------------------'
39emcmod 2 4
40echo '--------------------------------------'
41emcmod2 2 4

八、udev配置及触发

/etc/udev/rules.d下的asmdisk.rules里需要增加的内容,可以通过如下命令生成:

1for i in dm dn do dp dq dr ds dt du dv dw dx dy dz ea eb ec ed ee ef ;do
2echo "KERNEL==\"emcpower*\", SUBSYSTEM==\"block\", PROGRAM==\"/sbin/scsi_id --whitelisted --replace-whitespace --device=/dev/\$name\", RESULT==\"`/sbin/scsi_id --whitelisted --replace-whitespace --device=/dev/emcpower$i`\", NAME=\"asmdisk/asm-data-$i\", OWNER=\"grid\", GROUP=\"oinstall\", MODE=\"0660\""
3done

由于UDEV触发时,如果都所有的规则全部触发,会出现心跳网卡闪断或其他问题。所以这里选择逐条进行规则触发,这里也是使用全自动的操作,可以每2秒触发一条,如下:

1for i in `awk -F= '{print $NF}' 1.txt `;do udevadm trigger --subsystem-match=block --sysname-match=$i --verbose ;sleep 2 ;done

九、数据库加盘

1、加盘前检查

检查确定当前已在使用的磁盘最大编码。新增磁盘从该编码下一个开始编号。

1SQL> set linesize 160
2SQL> col path for a60
3SQL> set pagesize 100
4SQL> select group_number,disk_number,name,path,os_MB from v$asm_disk where path like '%asm-data-d%' order by group_number,disk_number;
5GROUP_NUMBER DISK_NUMBER NAME                           PATH                                                              OS_MB
6------------ ----------- ------------------------------ ------------------------------------------------------------ ----------
7 6          28 DATADG03_0028                  /dev/asmdisk/asm-data-do                                         102401
8 6          29 DATADG03_0029                  /dev/asmdisk/asm-data-dp                                         102401
916 rows selected.

2、加盘

需要注意,加盘有两种方式:一种是向已存在的磁盘组中加盘;一种是创建一个新的磁盘组,并将存储新划分的盘分配到该组里。

创建新的磁盘组:

1CREATE DISKGROUP datadg04  EXTERNAL REDUNDANCY DISK  '/dev/asmdisk/asm-data-dq','/dev/asmdisk/asm-data-dr','/dev/asmdisk/asm-data-ds','/dev/asmdisk/asm-data-dt','/dev/asmdisk/asm-data-du','/dev/asmdisk/asm-data-dv','/dev/asmdisk/asm-data-dw','/dev/asmdisk/asm-data-dx','/dev/asmdisk/asm-data-dy';

向已有磁盘组里增加磁盘:

1alter diskgroup datadg01 add disk '/dev/asmdisk/asm-data-cc', '/dev/asmdisk/asm-data-cd', '/dev/asmdisk/asm-data-ce','/dev/asmdisk/asm-data-cf','/dev/asmdisk/asm-data-cg','/dev/asmdisk/asm-data-ch','/dev/asmdisk/asm-data-ci','/dev/asmdisk/asm-data-cj','/dev/asmdisk/asm-data-ck' ;

十、检查

1、检查增加后的磁盘组信息(RAC 每个节点都要检查)grid 用户下,执行 asmcmd lsdg 命令,检查是否有新增加的磁盘组。如果没有,通过 crsctl stat res -t 检查对应的磁盘组资源在该节点是否处于 offline 状态,手动把该资源组启动即可;

2、检查磁盘组中的磁盘信息grid 用户下执行,asmcmd lsdsk 检查,新增加的磁盘是否增加到对应的磁盘组。

3、检查磁盘组数据平衡进度(向磁盘组中增加磁盘时,需要执行该检查)grid 用户下,连接到 ASM 实例下执行该操作:

1select  * from v$asm_operation;

十一、值守检查

1# 集群状态
2crs_stat t
3#日志应有相关
4Alert.log
5V$datafile
6Select checkpoint_time from v$datafile where rownum <= 1;
7#监控
8QMONITOR及Grid control 监控数据