一、ASM中的failure group介绍:

ASM提供了3种冗余方法。

external redundancy表示Oracle不帮你管理镜像,功能由外部存储系统实现,比如通过RAID技术。
normal redundancy(默认方式)表示Oracle提供2路镜像来保护数据。
high redundancy表示Oracle提供3路镜像来保护数据。

什么又是ASM failure group呢?

Oracle通过failure group来提供数据的高可用性。ASM使用的镜像算法并不是镜像整个disk,而是作extent级的镜像。所以很明显如果为各个failure group使用不同容量的disk是不明智的,因为这样在Oracle分配下一个extent的时候可能就会出现问题。在normal redundancy模式下,ASM环境中每分配一个extent都会有一个primary copy和一个second copy,ASM的算法保证了second copy和primary copy一定是在不同的failure group中,这就是failure group的意义。通过这个算法,ASM保证了即使一个failure group中的所有disk都损坏了,数据也是毫发无伤的。

Oracle在分配extent的时候,所有failure group中的这个将拥有相同数据的extent称为一个extent set,当Oracle将数据写入文件的时候,primary copy可能在任何一个failure group中,而second copy则在另外的failure group中,当Oracle读取数据的时候,除非是primary copy不可用,否则将优先从primary copy中读取数据,通过这种写入无序,读取有序的算法,Oracle保证了数据读取尽量分布在多个disk中。

因为公用一个硬件模块的磁盘很可能会同时损坏或者失效,所以通常我们在设计failure group时,应该把一个大的盘阵中在一个tray中的磁盘放在一个failure group中,这样我们就可以拿走一个tray,失效这个failure group,然后换上新的tray和磁盘,这跟RAID的思想是一样的。

ASM的冗余方式一经设定就无法更改,如果我们想把normal redundancy改为high redundancy就只能是创建一个新的failure group,然后把旧failure group中的文件通过RMAN或者DBMS_FILE_TRANSFER的方法移动到新failure group中去。

以上内容属于他山之石。

为了测试ASM的failgroup,这里用了8块10G的磁盘,四块是通过openfiler共享过来的,另外四块是vmware本地添加的。

控制器1 物理磁盘名 ASM对应的磁盘名
1 0 0 0 /dev/sdg VOL06
1 0 1 0 /dev/sdh VOL07
1 0 2 0 /dev/sdi VOL08
1 0 3 0 /dev/sdj VOl09
控制器2 物理磁盘名 ASM对应的磁盘名
2 0 0 0 /dev/sdk VOL10
2 0 1 0 /dev/sdl VOL11
2 0 2 0 /dev/sdm VOL12
2 0 3 0 /dev/sdn VOL13

这个控制器号,在系统上可以执行rescan-scsi-bus.sh程序和执行oracleasm scandisks。rescan-scsi-bus.sh程序属于sg3_utils软件包。

测试ASM的Failure Group功能_Failure

测试ASM的Failure Group功能_Failure_02 

二、创建ASM磁盘组:

创建之前,确保监听程序已经开启。

测试ASM的Failure Group功能_Group_03

这里将VOL10-VOL13加入controller2,VOL06-VOL09加入controller1里。完成之后,查看刚创建的卷组failover是否存在:

测试ASM的Failure Group功能_ASM_04

查看磁盘信息:

测试ASM的Failure Group功能_ASM_05

如果在创建ASM磁盘组时没有显式指定,failure groups也是始终会创建的。在这种情况下,每个disk都属于一个failure group,在创建磁盘组的时候,failure group也会默认创建,名称就是disk的名字。如上图所示。

接着,在failover上面创建一个数据库,待会用于测试。在创建的时候,数据文件的存放位置选择ASM的failover磁盘组。

测试ASM的Failure Group功能_休闲_06

测试ASM的Failure Group功能_ASM_07

测试ASM的Failure Group功能_ASM_08

测试ASM的Failure Group功能_ASM_09

创建数据库完成,当前db04实例已经启动,接着模拟磁盘故障,看对数据库会造成什么影响:

删除controller1上的一个磁盘,然后再扫描下磁盘。

测试ASM的Failure Group功能_休闲_10 

SCSI 1:0在系统中对应的是/dev/sdg,在asm中对应的是VOL06。完了后再执行sql语句查看磁盘状态是否有变化。

测试ASM的Failure Group功能_功能_11

使用oracleasm scandisks后,它自动清除了VOL06。

测试ASM的Failure Group功能_功能_12

看到了吧,VOL06的Path值为空了,测试下数据库是否还能读写:

测试ASM的Failure Group功能_Group_13

测试ASM的Failure Group功能_休闲_14 

数据库可读可写。

下来模拟整个failgroup坏掉。将controller2上的所有磁盘删掉:

测试ASM的Failure Group功能_休闲_15

Hard Disk 10至Hard Disk 13就是控制器2上的磁盘,对应系统中的/dev/sd{k,l,m,n},点击remove删除即可。

首先在系统中执行rescan-scsi-bus.sh程序,然后执行oracleasm scandisks。

结果:

测试ASM的Failure Group功能_Failure_16

然后再查看v$asm_disk视图:

测试ASM的Failure Group功能_休闲_17

接着测试数据库是否能读写:

测试ASM的Failure Group功能_Group_18

看到了吧,并没有对oracle数据库造成什么影响的。重启下ASM实例,然后在查看v$asm_disk视图:

测试ASM的Failure Group功能_休闲_19

测试ASM的Failure Group功能_功能_20

启动数据库实例:

测试ASM的Failure Group功能_ASM_21

启动么问题,数据库也可读可写。

总结:此实验的目的是假如两个盘柜中的一个down掉,不会影响应用的使用。