ASM的failgroup的含义

大家问到过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之间的联系了。         
所以此文仅仅叫做“探索方法”,点到为止。       

上一篇:MongoDB


下一篇:Mongodb副本集存储回收