大家问到过ASM的failgroup的含义,或者问到failgroup跟normal/high redundancy的关联。
1.是不是normal就一定是2个failgroup,high就一定是3个failgroup呢?
2.如果设定normal,我如果设定许多的failgroup(>2)能行么?
于是今天在搜索相关资料时,找到一篇不错的PPT,名字叫《A Closer Look inside Oracle ASM》,大家可以去google下。
先从最基本的概念讲起,什么是failgroup?
首先failgroup必须是diskgroup的一个子集,一个failgroup只能属于一个diskgroup。
当我们有mirror的要求时(例如normal redundancy),数据会被存两份,第一份假设存在failgroup A里,那么另一份就一定会存入非failgroup A的任意一个failgroup里。
所以,我们就知道了,当normal redundancy时(data copy=2),任意一个failgroup fail了,都没问题。
这样就回到了前面的问题1,答案就是No。normal的redundancy可以有>2个failgroup,high的redundancy可以有>3的failgroup。
2个或3个failgroup的只是他们的下限,而非上限。
从文档里只是说到:
A normal redundancy disk group must contain at least two failure groups.
A high redundancy disk group must contain at least three failure groups.
为什么说这个问题很迷惑人?
因为当redundancy=normal时,并且failgroup=2时,那么每一个failgroup都包含完全的一整套数据镜像,大家认为这是最合理的。
但当failgroup>2时,由于data copy=2,自然而然每一个failgroup就不能包含所有的数据了,但这也是合理的。
因为failgroup带来的好处是,丢失一个(normal redundancy)或者两个(high redundancy)failgroup的所有数据,没有任何问题。
这篇文章的目的是带来一种大家自己做实验来验证的方法,也其实带来的是一个x$表的用法。
它就是x$kffxp。
它提供的是ASM中每个文件的每个extent在disk上的mapping关系。
由于通常我们的AU是1MB,所以一个10MB的文件会被切成10个extents存放在不同的磁盘上以达到分散磁盘IO的目的。
它每个列的具体含义在我前面提到的PPT里有。
这里我简单的提一下重要的列的意思:
NUMBER_KFFXP:对应v$asm_file.FILE_NUMBER
XNUM_KFFXP:ASM文件的extent号。如果我们设定normal redundancy,那么一个extent会出现两份。high则出现三份。
DISK_KFFXP:对应v$asm_disk.DISK_NUMBER
LXN_KFFXP:0->primary extent, 1->mirror extent, 2->2nd mirror copy (high redundancy and metadata)
于是我做了个简单的小实验:
首先我是normal redundancy:
SQL> select type from v$asm_diskgroup;
TYPE
------------------
NORMAL
建立了一个4M大小的datafile:
SQL> create tablespace HAO datafile '+DATA' size 4M;
Tablespace created.
通过我自己的脚本找到这个datafile的file number=295:
> asm alias|grep HAO
DATA 295 +DATA/xxx/DATAFILE/HAO.295.729556673
于是我们查看这个4M大小的文件在disk上的分布情况:
select disk_kffxp disk#,
XNUM_KFFXP extent#,
case lxn_kffxp
when 0 then 'Primary Copy'
when 1 then 'Mirrored Copy'
when 2 then '2nd Mirrored Copy or metadata'
else 'Unknown' END TYPE
from x$kffxp
where
number_kffxp=295
and xnum_kffxp!=65534
order by 2;
DISK# EXTENT# TYPE
---------- ---------- ------------------------------
1 0 Primary Copy
2 0 Mirrored Copy
2 1 Primary Copy
1 1 Mirrored Copy
0 2 Primary Copy
1 2 Mirrored Copy
1 3 Primary Copy
0 3 Mirrored Copy
2 4 Primary Copy
0 4 Mirrored Copy
如上可以看到,每一个extent都被存了两份,这是期望的。
我们有3块disks。
由于在建diskgroup时我并没有指明failgroup,这里看到,
每个diskgroup的failgroup就是他自己本身,于是说明了当前我拥有3个failgroups,但我现在为normal redundancy。
说明其实failgroup的数量跟redundancy normal/high没有直接关系。只有下限的关系。
SQL> select name,FAILGROUP from v$asm_disk;
NAME FAILGROUP
---------- ----------
DATA01 DATA01
DATA02 DATA02
DATA03 DATA03
接着我们来到另一个external redundancy的磁盘组上看:
SQL> select TYPE from v$asm_diskgroup;
TYPE
------------------
EXTERN
同样的,由于我并没有显示指明failgroup,当前failgroup数量为磁盘数量为2。
但由于data copy=2,所以不用存第二份镜像,所以failgroup此时无含义。
SQL> select name,FAILGROUP from v$asm_disk;
NAME FAILGROUP
------------------------------ ------------------------------
DATA01 DATA01
DATA02 DATA02
SQL> create tablespace HAO datafile '+DATA' size 4M;
Tablespace created.
> asm alias|grep HAO
DATA 287 +DATA/xxx/DATAFILE/HAO.287.729561149
select disk_kffxp disk#,
XNUM_KFFXP extent#,
case lxn_kffxp
when 0 then 'Primary Copy'
when 1 then 'Mirrored Copy'
when 2 then '2nd Mirrored Copy or metadata'
else 'Unknown' END TYPE
from x$kffxp
where
number_kffxp=287
and xnum_kffxp!=65534
order by 2;
DISK# EXTENT# TYPE
---------- ---------- --------------------
1 0 Primary Copy
0 1 Primary Copy
1 2 Primary Copy
0 3 Primary Copy
1 4 Primary Copy
此时只有primary copy。
大家可以多用用这个视图做做实验就明白failgroup和redundancy之间的联系了。
所以此文仅仅叫做“探索方法”,点到为止。