ASM 翻譯系列第四十彈:理解ASM中 REQUIRED_MIRROR_FREE_MB和USABLE_FILE_MB的含義

沃趣科技發表於2017-03-15

原作者:Harald van Breederode

譯者:    魏興華

稽核:    魏興華

DBGeeK社群聯合出品

原文連結:https://prutser.wordpress.com/2013/01/03/demystifying-asm-required_mirror_free_mb-and-usable_file_mb/


在我的課上一個經常被問到的問題是ASM如何計算磁碟組REQUIRED_MIRROR_FREE_MB和USABLE_FILE_MB的值,這個問題的答案跟很多複雜問題的答案一樣:要看情況。


簡單來說,檢視V$ASM_DISKGROUP中的REQUIRED_MIRROR_FREE_MB值代表瞭如果ASM磁碟或ASM磁碟組出現了故障,要重新滿足冗餘度的定義,要求有多少的空閒空間。USABLE_FILE_MB的值代表了在滿足冗餘度之後,還有多少的剩餘空間可以用。


問題是:ASM怎麼計算出這些值的?


問題的答案可以通過建立一些不同配置的磁碟組,然後觀察檢視V$ASM_DISKGROUP中的REQUIRED_MIRROR_FREE_MB 和 USABLE_FILE_MB。為了找到答案,我們僅僅只需要一些磁碟而已。


ASM> select label,os_mb from v$asm_disk
  2  where label like 'SAN%' order by label;

LABEL                                OS_MB
------------------------------- ----------
SAN01                                  255
SAN02                                  255
SAN03                                  255
SAN04                                  255
SAN05                                  255
SAN06                                  255

REQUIRED_MIRROR_FREE_MB and USABLE_FILE_MB in external redundancy disk groups

我們先從建立一個外部冗餘的磁碟組開始,這裡使用到了我們上面列出的6塊盤,每個盤的大小是255MB:


ASM> create diskgroup demo external redundancy
  2  disk 'ORCL:san01'
  3  disk 'ORCL:san02'
  4  disk 'ORCL:san03'
  5  disk 'ORCL:san04'
  6  disk 'ORCL:san05'
  7  disk 'ORCL:san06'
  8  attribute 'compatible.asm' = '11.2.0.0.0';

Diskgroup created.


我們查詢檢視V$ASM_DISKGROUP中的幾個列來獲得磁碟組的相關資訊:


ASM> select name, state, type, total_mb, free_mb, REQUIRED\_MIRROR\_FREE\_MB req_free, USABLE\_FILE\_MB use_mb
  2  from v$asm_diskgroup where name = 'DEMO';

NAME       STATE       TYPE     TOTAL_MB FREE_MB REQ_FREE USE_MB
---------- ----------- ------ ---------- ------- -------- ------
DEMO       MOUNTED     EXTERN       1530    1468        0   1468


以上輸出顯示了磁碟組的總大小為1530MB(TOTAL_MB),其中1468MB(FREE_MB)是空閒的空間,由於這是一個外部冗餘的磁碟組,因此所有的空閒空間都可以用來存放檔案,USABLE_FILE_MB列的值也顯示了這一點,REQUIRED_MIRROR_FREE_MB的值為0。

注意:缺少的62MB被使用來存放ASM的後設資料。

REQUIRED_MIRROR_FREE_MB and USABLE_FILE_MB in normal redundancy disk groups

接下來我們建立一個normal冗餘的磁碟組,磁碟組共有6塊磁碟,每一個盤是一個獨立的failgroup。


ASM> create diskgroup demo normal redundancy
  2  failgroup FG1 disk
  3  'ORCL:san01'
  4  failgroup FG2 disk
  5  'ORCL:san02'
  6  failgroup FG3 disk
  7  'ORCL:san03'
  8  failgroup FG4 disk
  9  'ORCL:san04'
 10  failgroup FG5 disk
 11  'ORCL:san05'
 12  failgroup FG6 disk
 13  'ORCL:san06'
 14  attribute 'compatible.asm' = '11.2.0.0.0';

Diskgroup created.


ASM在磁碟組內使用failgroup來提供資料的映象和冗餘,資料被儲存在一個failgroup的同時,會自另外的failgroup中儲存相同的資料副本,以此來保障資料的安全,在一個normal冗餘的磁碟組中,一個failgroup出現故障並不會影響整個磁碟組的可用性,ASM還可以根據映象資料讓磁碟組重新達到normal冗餘的要求,但是為了能做到這一點,需要磁碟組有足夠的剩餘空間,因此一個failgroup實際有多大就顯得非常的重要。


ASM> select failgroup,sum(total_mb) from v$asm_disk
  2  where label like 'SAN%' group by failgroup order by failgroup;

FAILGROUP                      SUM(TOTAL_MB)
------------------------------ -------------
FG1                                      255
FG2                                      255
FG3                                      255
FG4                                      255
FG5                                      255
FG6                                      255


上面輸出顯示每一個failgroup的的總大小都是255MB,我們看下它如何影響剩餘空間的要求以及它如何影響可用的檔案空間。


ASM> select name, state, type, total_mb, free_mb, REQUIRED\_MIRROR\_FREE\_MB req_free, USABLE\_FILE\_MB use_mb
  2  from v$asm_diskgroup where name = 'DEMO';

NAME       STATE       TYPE     TOTAL_MB FREE_MB REQ_FREE USE_MB
---------- ----------- ------ ---------- ------- -------- ------
DEMO       MOUNTED     NORMAL       1530    1365      255    555


上面輸出顯示了,為了能夠在磁碟組的一個failgroup出現故障後能夠重新滿足磁碟組冗餘度的要求,需要有255MB的剩餘空間(REQUIRED_MIRROR_FREE_MB)。255這個數值是磁碟組的一個failgroup的大小,如果磁碟組裡的failgroup的大小不等,那麼ASM會自動選擇具有最大空間的failgroup。


上面的輸出也顯示了我們還可以使用555MB的空間來存放檔案,這個值是按照如下公式計算出來的:


ASM> select trunc((free_mb - REQUIRED\_MIRROR\_FREE\_MB) / 2) as useable
  2  from v$asm_diskgroup where name='DEMO';

   USEABLE
----------
       555


上面的公式翻譯過來就是:總的可用空間等於總的剩餘空間減去REQUIRED_MIRROR_FREE_MB後的值再除以磁碟組的冗餘度,這裡normal冗餘也就是要除以2。REQUIRED_MIRROR_FREE_MB的含義我們上面已經提到過:為了能夠在磁碟組的一個failgroup出現故障後能夠重新滿足磁碟組冗餘度的要求而需要的空間。


由於可用空間的公式中的free_mb的值是動態變化的,例如新增了檔案或檔案做了resize等操作都會影響磁碟組的剩餘空間,因此磁碟組的可用空間也是動態變化的,這一點可用通過一個簡單的例子加以說明:


SQL> create tablespace foo datafile '+DEMO' size 200m;

Tablespace created.

ASM> select name, state, type, total_mb, free_mb, REQUIRED\_MIRROR\_FREE\_MB req_free, USABLE\_FILE\_MB use_mb
  2  from v$asm_diskgroup where name = 'DEMO';

NAME       STATE       TYPE     TOTAL_MB FREE_MB REQ_FREE USE_MB
---------- ----------- ------ ---------- ------- -------- ------
DEMO       MOUNTED     NORMAL       1530     939      255    342


由於我們往磁碟組中新增加了一個200MB的資料檔案,導致了磁碟組的可用空間減少了,從555MB減少到了342MB。


SQL> alter tablespace foo add datafile '+DEMO' size 200m;

Tablespace altered.

ASM> select name, state, type, total_mb, free_mb, REQUIRED\_MIRROR\_FREE\_MB req_free, USABLE\_FILE\_MB use_mb
  2  from v$asm_diskgroup where name = 'DEMO';

NAME       STATE       TYPE     TOTAL_MB FREE_MB REQ_FREE USE_MB
---------- ----------- ------ ---------- ------- -------- ------
DEMO       MOUNTED     NORMAL       1530     534      255    139


在又新增了一個資料檔案後,如預期,可用的空間又進一步減少了,減少的空間略微的大於實際新增的檔案size,現在可用空間只剩下139MB了,我們再新增一個200MB的資料檔案會怎麼樣?


SQL> alter tablespace foo add datafile '+DEMO' size 200m;

Tablespace altered.


儘管ASM顯示了僅僅只有139MB的可用空間,但是我們確實又成功的建立了一個大小為200MB的資料檔案,因此這裡需要強調,ASM並不會強制預留出REQUIRED_MIRROR_FREE_MB所指示的空間。


ASM> select name, state, type, total_mb, free_mb, REQUIRED\_MIRROR\_FREE\_MB req_free, USABLE\_FILE\_MB use_mb
  2  from v$asm_diskgroup where name = 'DEMO';

NAME       STATE       TYPE     TOTAL_MB FREE_MB REQ_FREE USE_MB
---------- ----------- ------ ---------- ------- -------- ------
DEMO       MOUNTED     NORMAL       1530     129      255    -63


USABLE_FILE_MB的值已經變為了負數,這意味著如果我們遭遇了故障ASM有可能會沒有足夠的剩餘空間來重新滿足冗餘度的要求,因此監控USABLE_FILE_MB的值非常的重要,如果某個磁碟組的USABLE_FILE_MB值變為了負數,你應該增加磁碟組的空間或者釋放出一些空間出來。現在我們刪除掉這個表空間看看:


SQL> drop tablespace foo;

Tablespace dropped.


現在我們建立另一個normal冗餘的磁碟組,這次僅僅只建立3個failgroup,每一個failgroup包含了2個磁碟(之前建立的磁碟組包含了6個failgroup,每一個磁碟是一個failgroup):


ASM> create diskgroup demo normal redundancy
  2  failgroup FG1 disk
  3  'ORCL:san01',
  4  'ORCL:san02'
  5  failgroup FG2 disk
  6  'ORCL:san03',
  7  'ORCL:san04'
  8  failgroup FG3 disk
  9  'ORCL:san05',
 10  'ORCL:san06'
 11  attribute 'compatible.asm' = '11.2.0.0.0';

Diskgroup created.


在磁碟組成功建立後,我們再來看下failgroup的大小:


ASM> select failgroup,sum(total_mb) from v$asm_disk
  2  where label like 'SAN%' group by failgroup order by failgroup;

FAILGROUP                      SUM(TOTAL_MB)
------------------------------ -------------
FG1                                      510
FG2                                      510
FG3                                      510


三個failgroup的大小都是510MB,我們再來看下檢視V$ASM_DISKGROUP中相關列的情況:


ASM> select name, state, type, total_mb, free_mb, REQUIRED\_MIRROR\_FREE\_MB req_free, USABLE\_FILE\_MB use_mb
  2  from v$asm_diskgroup where name = 'DEMO';

NAME       STATE       TYPE     TOTAL_MB FREE_MB REQ_FREE USE_MB
---------- ----------- ------ ---------- ------- -------- ------
DEMO       MOUNTED     NORMAL       1530    1365      510    427


跟預期一樣,REQUIRED_MIRROR_FREE_MB的值為510,等於磁碟組中最大的failgroup的大小,USABLE_FILE_MB的值為427,就像之前已經提到過的,它的值根據以下公式計算而來:


ASM> select trunc((free_mb - REQUIRED\_MIRROR\_FREE\_MB) / 2) as useable
  2  from v$asm_diskgroup where name='DEMO';

   USEABLE
----------
       427


接下來,我們繼續建立一個normal冗餘的磁碟組,這一次只有2個failgroup,每個failgroup中有3個磁碟:


ASM> create diskgroup demo normal redundancy
  2  failgroup FG1 disk
  3  'ORCL:san01',
  4  'ORCL:san02',
  5  'ORCL:san03'
  6  failgroup FG2 disk
  7  'ORCL:san04',
  8  'ORCL:san05',
  9  'ORCL:san06'
 10  attribute 'compatible.asm' = '11.2.0.0.0';

Diskgroup created.


同樣,我們看下磁碟組中每一個failgroup的大小:


ASM> select failgroup,sum(total_mb) from v$asm_disk
  2  where label like 'SAN%' group by failgroup order by failgroup;

FAILGROUP                      SUM(TOTAL_MB)
------------------------------ -------------
FG1                                      765
FG2                                      765


兩個failgroup的大小都等於765MB,同樣檢視檢視v$asm_diskgroup相關欄位的值:


ASM> select name, state, type, total_mb, free_mb, REQUIRED\_MIRROR\_FREE\_MB req_free, USABLE\_FILE\_MB use_mb
  2  from v$asm_diskgroup where name = 'DEMO';

NAME       STATE       TYPE     TOTAL_MB FREE_MB REQ_FREE USE_MB
---------- ----------- ------ ---------- ------- -------- ------
DEMO       MOUNTED     NORMAL       1530    1416      255    580


這次的結果有點出乎意料,REQUIRED_MIRROR_FREE_MB的值僅僅只有255MB,而不是765MB(failgroup的大小),顯然,ASM只一次只是給了一個磁碟的大小作為REQUIRED_MIRROR_FREE_MB的值,而不是整個failgroup的大小。

道理在哪裡?就像文章開頭提出的,ASM會在不同的failgroup中儲存映象資料,一個normal冗餘的磁碟組要求至少有2個failgroup,一個high冗餘的磁碟組要求至少3個failgroup,如果具有2個failgroup的normal冗餘磁碟組,其中一個failgroup發生了故障,那麼這個磁碟組如何重新滿足冗餘度的要求?不能!因此這種情況下,ASM僅僅給出了一個磁碟的大小作為REQUIRED_MIRROR_FREE_MB的值。

同理,我們可以根據公式計算出USABLE_FILE_MB的值:


ASM> select trunc((free_mb - REQUIRED\_MIRROR\_FREE\_MB) / 2) as useable
  2  from v$asm_diskgroup where name='DEMO';

   USEABLE
----------
       580

REQUIRED_MIRROR_FREE_MB and USABLE_FILE_MB in high redundancy disk groups

我們已經討論了external和normal冗餘的磁碟組,我們接下來看high冗餘的磁碟組的情況。首先,我們需要建立一high冗餘度的磁碟組,磁碟組中的盤還是我們上面使用的6塊磁碟,每一個盤是一個單獨的failgroup:


ASM> create diskgroup demo high redundancy
  2  failgroup FG1 disk
  3  'ORCL:san01'
  4  failgroup FG2 disk
  5  'ORCL:san02'
  6  failgroup FG3 disk
  7  'ORCL:san03'
  8  failgroup FG4 disk
  9  'ORCL:san04'
 10  failgroup FG5 disk
 11  'ORCL:san05'
 12  failgroup FG6 disk
 13  'ORCL:san06'
 14  attribute 'compatible.asm' = '11.2.0.0.0';

Diskgroup created.

ASM> select failgroup,sum(total_mb) from v$asm_disk
  2  where label like 'SAN%' group by failgroup order by failgroup;

FAILGROUP                      SUM(TOTAL_MB)
------------------------------ -------------
FG1                                      255
FG2                                      255
FG3                                      255
FG4                                      255
FG5                                      255
FG6                                      255


如預期,所有的failgroup的大小都是255MB,REQUIRED_MIRROR_FREE_MB和USABLE_FILE_MB的值的計算方法在normal冗餘和high冗餘下是不是一樣的呢?我們來看一下:


ASM> select name, state, type, total_mb, free_mb, REQUIRED\_MIRROR\_FREE\_MB req_free, USABLE\_FILE\_MB use_mb
  2  from v$asm_diskgroup where name = 'DEMO';

NAME       STATE       TYPE     TOTAL_MB FREE_MB REQ_FREE USE_MB
---------- ----------- ------ ---------- ------- -------- ------
DEMO       MOUNTED     HIGH         1530    1365      510    285


REQUIRED_MIRROR_FREE_MB的值為510MB,等於2個failgroup的大小(如果磁碟組中failgroup的大小不一樣,會取兩個最大的failgroup大小),這是因為一個high冗餘的磁碟組需要能夠容忍丟失2個failgroup而不影響資料的可用性

USABLE_FILE_MB的值為285,按照如下公式計算而來:


ASM> select trunc((free_mb - REQUIRED\_MIRROR\_FREE\_MB) / 3) as useable
  2  from v$asm_diskgroup where name='DEMO';

   USEABLE
----------
       285


最後我們建立另一個high冗餘的磁碟組,一共3個磁碟組,每2個磁碟一個failgroup:


ASM> create diskgroup demo high redundancy
  2  failgroup FG1 disk
  3  'ORCL:san01',
  4  'ORCL:san02'
  5  failgroup FG2 disk
  6  'ORCL:san03',
  7  'ORCL:san04'
  8  failgroup FG3 disk
  9  'ORCL:san05',
 10  'ORCL:san06'
 11  attribute 'compatible.asm' = '11.2.0.0.0';

Diskgroup created.

ASM> select failgroup,sum(total_mb) from v$asm_disk
  2  where label like 'SAN%' group by failgroup order by failgroup;

FAILGROUP                      SUM(TOTAL_MB)
------------------------------ -------------
FG1                                      510
FG2                                      510
FG3                                      510


上面的輸出應該不需要我過多解釋,一切都符合我們的預期,如果上面所寫的所有內容你都已經充分理解,那麼下面查詢內容的輸出不應該讓你驚訝:


ASM> select name, state, type, total_mb, free_mb, REQUIRED\_MIRROR\_FREE\_MB req_free, USABLE\_FILE\_MB use_mb
  2  from v$asm_diskgroup where name = 'DEMO';

NAME       STATE       TYPE     TOTAL_MB FREE_MB REQ_FREE USE_MB
---------- ----------- ------ ---------- ------- -------- ------
DEMO       MOUNTED     HIGH         1530    1365      510    285


REQUIRED_MIRROR_FREE_MB的值為510MB,它其實是2個磁碟的大小,而不是一個failgroup的大小,理由跟normal冗餘具有2個failgroup的磁碟組一樣,這一次我們的磁碟組是high冗餘三個failgroup,如果一個或兩個failgroup丟失,ASM不能夠重新滿足冗餘度的要求。

下面的是用來計算USABLE_FILE_MB的值的公式:


ASM> select trunc((free_mb - REQUIRED\_MIRROR\_FREE\_MB) / 3) as useable
  2  from v$asm_diskgroup where name='DEMO';

   USEABLE
----------
       285

In summary

REQUIRED_MIRROR_FREE_MB的值代表了ASM用來重新滿足磁碟組定義的冗餘度所需要的空間,這個值的大小依賴於磁碟組的冗餘度和failgroup的數量。

具有3個failgroup的normal冗餘磁碟組,REQUIRED_MIRROR_FREE_MB的值等於一個failgroup的大小,如果 normal冗餘的磁碟組只有2個failgroup,那麼REQUIRED_MIRROR_FREE_MB的值將等於一個磁碟的大小而非一個failgroup的大小。

具有4個failgroup的high冗餘磁碟組,REQUIRED_MIRROR_FREE_MB的值等於2個failgroup的大小,如high冗餘的磁碟組只有3個failgroup,那麼REQUIRED_MIRROR_FREE_MB的值將會是兩個磁碟的大小。

USABLE_FILE_MB的值代表了總的可用來儲存資料的空間,它的值依賴磁碟組的大小,磁碟組的冗餘度和REQUIRED_MIRROR_FREE_MB的值,USABLE_FILE_MB的值的計算方法如下:


USABLE\_FILE\_MB = (FREE_MB – REQUIRED\_MIRROR\_FREE\_MB) / [2|3]

譯者注: 下圖中代表一個具有3個failgroup的Normal冗餘的磁碟組。其中每個failgroup:F代表free的空間 ,U代表已經使用的空間。

那麼根據上面的假設很容易推斷: (F+U)=一個failgroup的大小 那麼3F+3U=總的磁碟組的大小 ASM 翻譯系列第四十彈:理解ASM中 REQUIRED_MIRROR_FREE_MB和USABLE_FILE_MB的含義

那麼當前磁碟組的剩餘可用空間是多少呢?

非常好計算=總的磁碟組的大小-3U

接著,毀壞一個failgroup後剩餘多少可用空間?

這裡我們為了比較容易理解,繼續把這個步驟切成兩步: (總空間-3U)-F ,這個值一個failgroup毀壞後,剩餘的空間,這個剩餘空間還沒考慮這個failgroup上已經使用的空間做RB的所需要的空間。

但是為了滿足 冗餘度的要求,還是要把U這部分空間給RB掉,那麼就是:

(總空間-3U)-F-U,我們做一個轉換也就是 (總空間-3U)-(F +U)=Free-一個failgroup大小,最終再根據冗餘度除以2或著3,這下子是不是很清晰了?


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

相關文章