關於ASM的failgroup概念的探索方法

perfychi發表於2012-08-31

關於ASM的failgroup概念的探索方法

分類: ORACLE Studying 87人閱讀 評論(0) 舉報
 大家問到過的的含義,或者問到failgroup跟normal/high redundancy的關聯。

1.是不是normal就一定是2個failgroup,high就一定是3個failgroup呢?
2.如果設定normal,我如果設定許多的failgroup(>2)能行麼?

於是今天在搜尋相關資料時,找到一篇不錯的PPT,名字叫《A Closer Look inside Oracle ASM》,大家可以去下。

先從最基本的概念講起,什麼是failgroup?
首先failgroup必須是diskgroup的一個子集,一個failgroup只能屬於一個diskgroup。
當我們有mirror的要求時(例如normal redundancy),資料會被存兩份,第一份假設存在failgroup A裡,那麼另一份就一定會存入非failgroup A的任意一個failgroup裡。
所以,我們就知道了,當normal redundancy時( 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裡有。

這裡我簡單的提一下重要的列的意思:

 

uMaps file extents to allocation units
uOnly populated in ASM instance
uColumns include:

Column Name
Description
GROUP_KFFXP
Disk Group Number
NUMBER_KFFXP
File Number
COMPOUND_KFFXP
Disk Group Number || File Number
INCARN_KFFXP
Incarnation Number
PXN_KFFXP
Physical Extent Number (within file)
XNUM_KFFXP
Logical Extent Number (within file)
LXN_KFFXP
0=primary, 1=first mirror, 2=second mirror
DISK_KFFXP
Disk Number
AU_KFFXP
Allocation Unit Number (within disk)
SIZE_KFFXP
Size (# allocation units)

 


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之間的聯絡了。         
所以此文僅僅叫做“探索方法”,點到為止

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/27042095/viewspace-742323/,如需轉載,請註明出處,否則將追究法律責任。

相關文章