zoukankan      html  css  js  c++  java
  • 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之间的联系了。         
    所以此文仅仅叫做“探索方法”,点到为止。
           

  • 相关阅读:
    joomla allvideo 去掉embed share
    程序员高效开发的几个技巧
    分布式icinga2安装与使用
    Openstack Murano(kilo)二次开发之添加Volume
    autohotkey在运维中的应用
    快应用之我见
    目前微服务/REST的最佳技术栈
    2016 年终总结
    2015年终总结
    用TypeScript开发了一个网页游戏引擎,开放源代码
  • 原文地址:https://www.cnblogs.com/yaoyangding/p/12792546.html
Copyright © 2011-2022 走看看