您的位置:首页 > 大数据 > 人工智能

关于ASM的failgroup概念的探索方法

2011-11-11 10:58 441 查看
大家问到过ASMfailgroup的含义,或者问到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之间的联系了。

所以此文仅仅叫做“探索方法”,点到为止。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: