天天看點

ASM 翻譯系列第四十彈:了解ASM中 REQUIRED_MIRROR_FREE_MB和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。為了找到答案,我們僅僅隻需要一些磁盤而已。

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

我們查詢視圖v$asm_diskgroup中的幾個列來獲得磁盤組的相關資訊:

以上輸出顯示了磁盤組的總大小為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在磁盤組内使用failgroup來提供資料的鏡像和備援,資料被存儲在一個failgroup的同時,會自另外的failgroup中存儲相同的資料副本,以此來保障資料的安全,在一個normal備援的磁盤組中,一個failgroup出現故障并不會影響整個磁盤組的可用性,asm還可以根據鏡像資料讓磁盤組重新達到normal備援的要求,但是為了能做到這一點,需要磁盤組有足夠的剩餘空間,是以一個failgroup實際有多大就顯得非常的重要。

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

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

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

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

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

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

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

盡管asm顯示了僅僅隻有139mb的可用空間,但是我們确實又成功的建立了一個大小為200mb的資料檔案,是以這裡需要強調,asm并不會強制預留出required_mirror_free_mb所訓示的空間。

usable_file_mb的值已經變為了負數,這意味着如果我們遭遇了故障asm有可能會沒有足夠的剩餘空間來重新滿足備援度的要求,是以監控usable_file_mb的值非常的重要,如果某個磁盤組的usable_file_mb值變為了負數,你應該增加磁盤組的空間或者釋放出一些空間出來。現在我們删除掉這個表空間看看:

現在我們建立另一個normal備援的磁盤組,這次僅僅隻建立3個failgroup,每一個failgroup包含了2個磁盤(之前建立的磁盤組包含了6個failgroup,每一個磁盤是一個failgroup):

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

三個failgroup的大小都是510mb,我們再來看下視圖v$asm_diskgroup中相關列的情況:

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

接下來,我們繼續建立一個normal備援的磁盤組,這一次隻有2個failgroup,每個failgroup中有3個磁盤:

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

兩個failgroup的大小都等于765mb,同樣檢視視圖v$asm_diskgroup相關字段的值:

這次的結果有點出乎意料,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的值:

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

如預期,所有的failgroup的大小都是255mb,required_mirror_free_mb和usable_file_mb的值的計算方法在normal備援和high備援下是不是一樣的呢?我們來看一下:

required_mirror_free_mb的值為510mb,等于2個failgroup的大小(如果磁盤組中failgroup的大小不一樣,會取兩個最大的failgroup大小),這是因為一個high備援的磁盤組需要能夠容忍丢失2個failgroup而不影響資料的可用性

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

最後我們建立另一個high備援的磁盤組,一共3個磁盤組,每2個磁盤一個failgroup:

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

required_mirror_free_mb的值為510mb,它其實是2個磁盤的大小,而不是一個failgroup的大小,理由跟normal備援具有2個failgroup的磁盤組一樣,這一次我們的磁盤組是high備援三個failgroup,如果一個或兩個failgroup丢失,asm不能夠重新滿足備援度的要求。

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

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的值的計算方法如下: