说明:

整理文档时发现自己在2010年写的一个RAC容灾方案,觉得有一些用,分享出来。当时为了验证此方案,做了很多PoC。方案相对比较复杂,但是也提供了一种思路,读者需要对RAC的架构有一定了解。本方案为当年个人测试验证,不代表任何官方观点。方案环境为:Oracle 11.2.3+AIX 6.1.7。存储使用IBM DS8800,启用同步复制MetroMirror。本方案的核心点是如何保证在出现站点故障时,RAC voting device票数大于半数,以便恢复CRS。


1.方案介绍

生产环境有两个站点,主站点和备站点,主站点有节点Node1, 备站点有Node2、Node3。三个节点配置Oracle RAC。主站点和备站点各有一个NFS服务器,提供voting device的NFS Quorum。主站点存储和备站点存储分别配置一个LUN,映射给本站点的NFS服务器。两个LUN配置MetroMirror关系。主NFS将识别的LUN创建vg(vgnfs)和文件系统(/vote1),将此文件系统作为NFS文件系统,而RAC节点的voting device的NFS Quorum文件位于此NFS文件系统上。

 

当主站点故障后,Node1,NFS服务器分区及主站点的存储均出现故障,备站点Node2,Node3因为只能访问本地一个voting disk,因此Oracle CRS也会异常终止。

 

此时,在备NFS服务器上将vgnfs导入并挂在/vote1文件系统。然后在node2和node3上mount备NFS服务器上的/vote1文件系统后,重新启动两个节点的CRS服务。此时由于node2和node3可以识别到两个vote设备,因此可以启动成功。

Oracle11g RAC双NFS仲裁容错方案_java

2   配置步骤

2.1环境介绍

主站点的RAC节点为:

node1172.16.69.225


主站点NFS服务器:

node1172.16.58.157


备站点的RAC节点为:

node2172.16.69.226

node3172.16.69.227

 

备站点的nfs服务器

node2172.16.58.158

 

2.2配置NFS

2.2.1 配置NFS服务器

在两个NFS服务器上,首先创建grid用户和oinstall组,用户和组的ID号需要与三个RAC节点相同。将grid归属到oinstall组里。

#mkgroup id='1000' adms='root'oinstall

#mkuser id='1100' pgrp='oinstall'groups='asmadmin,asmdba,asmoper,dba' home='/home/grid' grid


在主备站点的两个DS8K上分别配置两个LUN,分别映射给主NFS server和备NFS server。在两个DS8K上,LUN ID分别为04001400。两个LUN之间配置Metro MirrorPPRC关系:


 dscli> lspprc 0400

ID        State       Reason Type         SourceLSS Timeout (secs) Critical ModeFirst Pass Status

===============================================================================     0400:1400 Full Duplex -      Metro Mirror 04        60             Disabled      Invalid

 

NFS服务器识别0400的盘符为hdisk12,备NFS服务器识别的1400的盘符为hdisk38PPRC的关系为0400->1400MetroMirror关系。

 

在主NFS上用hdisk12创建vg—vgnfs,并创建文件系统/vote1

smit mkvg->Add an Original Volume Group

Oracle11g RAC双NFS仲裁容错方案_java_02

vg创建成功以后,创建文件系统/vote1
root@node1[/]#smit jfs2à Add an Enhanced JournaledFile System-> vgnfs

Oracle11g RAC双NFS仲裁容错方案_java_03

文件系统创建成功以后,在主NFSmount该文件系统:

#mount /vote1

将RAC三个节点的IP地址和主机名加入到两个NFS服务器的/etc/hosts文件中:

172.16.69.225   node1

172.16.69.226   node2

172.16.69.227   node3

 

然后,分别在主备NFS上启动NFS服务(备NFS服务器上需要先执行#mkdir /vote1),设置/vote1为NFS文件:

root@node1[/]#smit mknfs

Oracle11g RAC双NFS仲裁容错方案_java_04

root@node1[/]#smit nfs-> Network FileSystem (NFS) -> Add a Directory to Exports List

Oracle11g RAC双NFS仲裁容错方案_java_05

在两个NFS服务器上查看:

root@node2[/]#exportfs

/vote1-public,sec=sys:krb5p:krb5i:krb5:dh,rw


root@node1[/]#exportfs

/vote1-public,sec=sys:krb5p:krb5i:krb5:dh,rw

 

2.2.2 配置NFS客户端(NFS客户端不能使用普通方式mount,需要先修改/etc/filesystems文件)

修改三个RAC节点的/etc/filesystems文件,增加mount选项:

/vote:

dev= "/vote"

vfs= nfs

nodename=172.16.58.157

mount= true

options=rw,bg,hard,intr,rsize=32768,wsize=32768,timeo=600,vers=3,proto=tcp,noac,sec=sys

account= false

 

然后在三个RAC节点上mount /vote1文件系统

# mount /vote1

# df -g

Filesystem    GB blocks      Free %Used    Iused %Iused Mounted on

172.16.58.157:/vote1     10.00     9.51    5%        8    1% /vote1


2.3配置voting device

在初始情况下,RACvoting device位于一块普通的磁盘上,只有一份:

 

$ crsctl query css votedisk

##  STATE   File Universal Id               File Name Disk group

--  -----   -----------------               --------- ---------

 1. ONLINE  5e27688ef35c4fc8bfb6d0e095faab57 (/dev/rhdisk2) [DATA1DG]

Located 1 voting disk(s).

 

需要将其替换到有包含两个磁盘,并且包含一个NFS Quorum设备、冗余属性为NormalDG上。

在两个站点的DS8K上分别创建一个LUNLUN ID均为1200,不配置PPRC,映射给三个RAC节点。


2.3.1 配置DG

RAC节点识别到的盘符为hdisk7hdisk9.

接下来,在三个节点上修改磁盘的属性

# cat /tmp/1.sh

## Change ownership to gridand oracle

for pv in `lsdev -Cc disk |grep -i mpio | awk '{print $1}'`

do

chdev -l $pv -areserve_policy=no_reserve -a algorithm=round_robin

chown grid:oinstall/dev/r$pv

chmod g+rw /dev/r$pv

done

 

#sh /tmp/1.sh

 

hdisk7hdisk9创建一个新的DGDGVOTE

 

#su – grid

$sqlplus / as sysasm

 

SQL> CREATE DISKGROUPDGVOTE NORMAL REDUNDANCY

FAILGROUP FG1 DISK'/dev/rhdisk8' SIZE 10G FAILGROUP FG2 DISK '/dev/rhdisk10' SIZE 10G;

 

#dd if=/dev/zero of=/vote1/qq bs=1M count=500

NFS server上进行操作:

#chown -R grid:oinstall/vote1

#chmod -R 777 /vote1

 

2.3.2 DG增加NFS quorum

#su - grid

$sqlplus / as sysasm

SQL> alter system setasm_diskstring='/dev/rhdisk*', '/vote/q*';

SQL>ALTER DISKGROUPDGVOTE ADD QUORUM DISK '/vote1/qq' SIZE 500M;

 

2.3.3 替换voting device

# crsctl replacevotedisk +DGVOTE

替换成功以后,进行确认:


# crsctl query css votedisk

##  STATE   File Universal Id               File Name Disk group

--  -----   -----------------               --------- ---------

 1. OFFLINE 28f0d723b4df4feabf93e6ab27831841 () []

 2. ONLINE  115be1be59734f6bbf6c4c9c3ecefd66 (/dev/rhdisk9) [DGVOTE]

 3. ONLINE  5af523cf33f04f64bff19de4b7c73b32 (/vote1/qq) [DGVOTE]

Located 3 voting disk(s).

 

3   故障处理

3.1站点故障发生

当主站点(主站点的服务器,主站点的存储)和主NFS server发生故障以后,RACnode2node3CRS会由于voting device数量不够而异常停止.

 

3.2数据库紧急恢复

首先在DS8K上对NFS文件系统所在的磁盘上进行failoverpprc的操作,以便备用NFS服务器可以导入vgnfs

dscli> failoverpprc-remotedev IBM.2107-75BGP81 -type mmir 1400:0400

CMUC00196I failoverpprc:Remote Mirror and Copy pair 1400:0400 successfully reversed.

 

在备用NFS服务器上importvg

Oracle11g RAC双NFS仲裁容错方案_java_06


在备用服务器上mount文件系统:

#mount /vote

 

RAC的三个节点上,将/etc/filesystems中主用NFS服务器的IP172.16.58.157改为备用NFS服务器的IP地址:172.16.58.158

sed"s/172.16.58.157/172.16.58.158/g" /etc/filesystems > /tmp/1;cp -Rp/tmp/1 /etc/filesystems

 

先重启node2node3NFS client服务:

#stopsrc-s rpc.mounted

#startsrc-s rpc.mounted

 

RACnode2node3mount文件系统:

#mount /vote1

 

node2node3上启动CRS

#crsctl stop crs -f

#crsctl start crs

 

此时由于vote票数为两票,node2node3crs和数据库实例可以正常启动:

# crsctl query css votedisk

##  STATE   File Universal Id               File Name Disk group

--  -----   -----------------               --------- ---------

 1. OFFLINE 28f0d723b4df4feabf93e6ab27831841 () []

 2. ONLINE  115be1be59734f6bbf6c4c9c3ecefd66 (/dev/rhdisk9) [DGVOTE]

 3. ONLINE  5af523cf33f04f64bff19de4b7c73b32 (/vote1/qq) [DGVOTE]

3.3站点故障恢复后

在站点故障恢复以后,首先启动RAC node1CRS服务:

#crsctl start crs

 

然后,恢复dgoffline的磁盘:

SQL> selectGROUP_NUMBER,NAME from v$asm_diskgroup;


GROUP_NUMBER NAME

-----------------------------------------

           2 DATA2DG

           4 DGVOTE

   

 

SQL> selectDISK_NUMBER,STATE,PATH,FAILGROUP from v$asm_disk where GROUP_NUMBER=4; 

 

DISK_NUMBER STATE    PATH                                                                                                                                                                                                                                                            FAILGROUP

----------- --------

          1 NORMAL   /dev/rhdisk9 DGVOTE_0001                                                                                                                                                                                                                                               

          3 NORMAL   /vote1/qq   DGVOTE_0003                                                                                                                                                                                                                                                  

          0 NORMAL                             DGVOTE_0000                                                                                                                                                                                                                                                

 

此时,需要将hdisk7的状态由offline变为online,以便voting device的数量恢复为3

SQL> alter diskgroupDGVOTE online disk DGVOTE_0000;

Diskgroup altered.

 

再次查看:

SQL> selectDISK_NUMBER,STATE,PATH,FAILGROUP from v$asm_disk where GROUP_NUMBER=4; 

 

DISK_NUMBER STATE    PATH                                                                                                                                                                                                                                                            FAILGROUP

----------- --------

          1 NORMAL   /dev/rhdisk9 DGVOTE_0001                                                                                                                                                                                                                                              

          3 NORMAL   /vote1/qq   DGVOTE_0003                                                                                                                                                                                                                                               

          0 NORMAL   /dev/rhdisk7 DGVOTE_0000     

 

 

$ crsctl query cssvotedisk 

##  STATE   File Universal Id               File Name Disk group

--  -----   -----------------               --------- ---------

 1. ONLINE  115be1be59734f6bbf6c4c9c3ecefd66 (/dev/rhdisk9) [DGVOTE]

 2. ONLINE  5af523cf33f04f64bff19de4b7c73b32 (/vote1/qq) [DGVOTE]

 3. ONLINE  46afbaaf3f094f56bf6dd2cdc1b73c9d (/dev/rhdisk7) [DGVOTE]

 

站点故障恢复以后,备用NFS服务器无需切换到主用NFS服务器,但需要需要恢复vgnfs所在磁盘的PPRC关系,即进行failback操作,以便做到数据一致:


dscli> failbackpprc-remotedev IBM.2107-75BGP81 -type mmir 1400:0400

CMUC00197I failbackpprc:Remote Mirror and Copy pair 1400:0400 successfully failed back.

dscli> lspprc 1400

ID        State       Reason Type         SourceLSS Timeout (secs) Critical ModeFirst Pass Status

============================================================================================

1400:0400 Full Duplex -      Metro Mirror 14        60             Disabled      Invalid