天天看點

Oracle ASM 翻譯系列第十四彈:ASM Internal Rebalancing act

在asm中,每一個檔案的extent都均勻的分布在它所在磁盤組的所有磁盤上,無論是在檔案第一次建立或是檔案建立之後的重新resize都是如此,這也意味着我們始終能保持磁盤組中的每一個磁盤上都有一個平衡的空間配置設定。

雖然檔案在建立或是resize過程中都能保證空間的均勻配置設定,但是磁盤組在某些情況下會自動觸發重平衡的操作,例如添加、删除和resize磁盤的操作(這些操作顯然會讓磁盤組變得不再平衡),再如,移動一個檔案從磁盤的hot區到cold區。我們還可以通過指令 alter diskgroup ... rebalance手工觸發rebalance。同時還可以通過給這個指令增加power子句來修改rebalance的并行度,在磁盤組因為任何理由變得不再平衡的時候,都可以運作這個指令來讓磁盤組再次變得平衡。

譯者注:由于asm要求每個檔案在asm磁盤組的所有磁盤上都均勻配置設定,是以添加、删除磁盤一定會觸發rebalance,這個特性可能在傳統的卷管理軟體上并不常見。還會有一些特例導緻檔案在asm磁盤組的磁盤上空間分布不均勻,例如external模式下,磁盤組中的磁盤大小差異很大。

在alter diskgroup ... rebalance指令中,可以指定power子句,用來指定重平衡的并行度。這個參數可以指定為0,這時重平衡操作會被挂起,直到下一次手工或者自動觸發重平衡操作。可以将power設定為一個較高的值,這樣一定程度上可以加快重平衡的速度,縮短重平衡花費的時間。

在執行alter diskgroup ... rebalance指令時,預設會馬上傳回執行成功,這樣我們可以在視窗繼續執行其他指令,但是重平衡的操作其實在背景繼續執行。我們可以通過視圖v$asm_operation檢視重平衡的進度。

重平衡操作共分為三個階段:

· 第一階段-rebalance plan,asm會計算出重平衡的計劃。計劃取決于很多因素,例如磁盤組大小、磁盤組中的檔案個數、磁盤的partnership是否需要調整等等。這個過程時間不會太長,一般不會超過幾分鐘。

· 第二階段-extent relocating,是真正幹活的階段,這個階段,asm的區會在磁盤組中的磁盤間移動,這個過程會花費大部分的時間。這個過程中,asm會記錄區的移動數量,以及實際的i/o性能,進而估算該過程需要花費的時間(gv$asm_operation.est_minutes記錄估算出的時間)。不過要注意的是,這隻是估算的時間,真正的花費時間還取決于整體負載(特别是磁盤相關的負載)。如果重平衡是由于磁盤組中的一個或者多個磁盤損壞造成的,那麼這個階段還會對不滿足備援度要求的資料做鏡像。

注意:磁盤組在rebalance過程中并不會去修複存在邏輯錯誤或實體錯誤的資料,在12c中通過新增的一個asm-scrubbing功能可以做到這一點,請參考本系列的【asm data scrubbing】篇。

· 第三階段是磁盤的compacting階段(asm 11.1.0.7版本及以上支援),這個過程是将磁盤上存的資料盡可能的移動到磁盤的外圈磁道上去(機械盤的外圈速度更快),以提供更高的性能。需要注意的是,在這個階段,gv$asm_operation.est_minutes會一直顯示為0,這個顯示為0的“特性”将來可能會被優化。這個階段所花費的時間,取決于磁盤組中磁盤的數量、重平衡的原因等等,一般情況下,這個階段花費的時間會比第二階段短很多。

重平衡過程需要注意的點:

· 重平衡是以檔案為基本操作機關的,跟過arb程序的跟蹤檔案可以觀察到。

· 一個正在進行的重平衡可能會被重新開機,例如存儲的配置改變(我們修改了配置或者由于故障導緻配置改變),如果是人為導緻了重平衡的失敗,那麼需要手工的觸發重平衡才行。

· 在同一個叢集中,每個執行個體隻能有一個磁盤組在做重平衡操作。如果同時指定多個磁盤組做重平衡,那麼asm會盡量把重平衡動作在叢集中可用節點上并行執行,如果沒有其他可用節點了,那麼就會串行執行。

· 重平衡過程中,如果遇到asm執行個體重新開機,那麼執行個體起來後重平衡操作會繼續進行。

· 在執行alter diskgroup 指令對磁盤進行添加、删除、調整大小時,可以指定rebalance子句,以及相關的power值、wait/nowait選項。

在以下兩種個情況下,重平衡的并行度是asm_power_limit參數指定的值:

· 執行alter diskgroup 進行磁盤組操作時,不指定power參數

· 當隐式的觸發重平衡時,如對磁盤組中磁盤進行添加/删除/調整大小

我們可以動态的調整該參數,進而調整重平衡的并行度。高的并行度會縮短重平衡的花費時間,但是時間并不是随着并行度遞增而線性減少,這取決于存儲的整體負載、可用的吞吐量和底層磁盤的響應速度。

在重平衡過程中,我們可以動态調整并行度。通過alter diskgroup ... rebalance power n指令來指定一個新的并行度。修改并行度,會停止目前的重平衡,然後根據新的power參數重新開始重平衡過程。

雖然修改并行度會導緻停止目前的重平衡,開啟新的重平衡,但是根據我的觀察,重平衡可以增量進行,例如舊的重平衡已經完成了對100号檔案的重平衡操作,那麼下次重新啟動重平衡會從101号檔案開始,100号檔案會被跳過,或者是在做一些檢查後很快的跳過。

asm_power_limit

這個參數是磁盤組進行重平衡操作時預設的并行度。在11.2.0.2之前它的取值範圍是0-11,從11.2.0.2版本開始,它的取值範圍是0-1024。當然這取決于磁盤組的屬性compatible.asm的設定值(見下文)。asm_power_limit預設值是1,當你将這個值指定為0時,會禁止重平衡操作。

· 将磁盤組的compatible.asm參數設定為11.2.0.2及以上,asm_power_limit的取值範圍是0-1024。

· 當compatible.asm參數被設定為11.2.0.2之前時,asm_power_limit的取值範圍是0-11。

· 當你通過alter diskgroup rebalance指令将power值指定為0時,會停止重平衡操作。(除非你觸發 bug 7257618)。

_disable_rebalance_compact

設定初始化參數_disable_rebalance_compact=true會禁止磁盤組重平衡的第三個階段(壓縮階段)。該參數對所有的磁盤組生效。

_rebalance_compact

這是個隐含參數,設定_rebalance_compact=false會禁止磁盤組重平衡的第三個階段(壓縮階段)。該參數指定單個磁盤組,對單磁盤組生效。

_asm_imbalance_tolerance

這個隐含參數控制磁盤組中磁盤最大容忍的不平衡比例,預設值是3%。 比如同一個磁盤組中,a磁盤的使用率不會和b磁盤使用率相差超過3%,否則會觸發自動重平衡。

下面這個表總體概括了重平衡過程中,涉及到的背景程序

process

description

arbn

asm重平衡程序,在磁盤組中進行資料區的重平衡。會有arb0-arb9和arba這些程序

rbal

在asm執行個體中,該程序協調磁盤組中的重平衡過程。在database執行個體中,它管理asm磁盤組。

xnnn

exadata獨有-asm disk expel slave process(asm磁盤驅逐程序)。負責asm重平衡後的善後工作,它會在asm重平衡後對磁盤機型删除操作。

在重平衡過程中,arbn程序會在背景程序dump檔案目錄生成trace檔案,記錄重平衡的過程。

在asm執行個體中,v$asm_operation視圖會顯示在本執行個體上執行的時間較長的asm操作,gv$asm_operation視圖會展示叢集中的所有節點上的執行的時間較長的asm操作。

在重平衡的過程中,operation字段會顯示rebal,state字段會顯示重平衡操作的狀态,power字段會顯示重平衡的并行度,est_minutes會顯示重平衡操作還需要執行多長時間。

視圖v$asm_disk用來顯示asm磁盤的相關資訊,在rebalance期間,視圖的state列展示了rebalance期間磁盤的目前狀态。

通過在asm執行個體中執行下面的指令,可以得到磁盤組上面資料平衡的狀态。

sql> column "diskgroup" format a30

sql> column "imbalance" format 99.9 heading "percent|imbalance"

sql> column "variance" format 99.9 heading "percent|disk size|variance"

sql> column "minfree" format 99.9 heading "minimum|percent|free"

sql> column "diskcnt" format 9999 heading "disk|count"

sql> column "type" format a10 heading "diskgroup|redundancy"

sql> select g.name "diskgroup",

100*(max((d.total_mb-d.free_mb)/d.total_mb)-min((d.total_mbd.

free_mb)/d.total_mb))/max((d.total_mb-d.free_mb)/d.total_mb) "imbalance",

100*(max(d.total_mb)-min(d.total_mb))/max(d.total_mb) "variance",

100*(min(d.free_mb/d.total_mb)) "minfree",

count(*) "diskcnt",

g.type "type"

from v$asm_disk d, v$asm_diskgroup g

where d.group_number = g.group_number and

d.group_number <> 0 and

d.state = 'normal' and

d.mount_status = 'cached'

group by g.name, g.type;

percent minimum

percent disk size percent disk diskgroup

diskgroup imbalance variance free count redundancy

------------------------------ --------- --------- ------- ----- ----------

acfs .0 .0 12.5 2 normal

data .0 .0 48.4 2 extern

play 3.3 .0 98.1 3 normal

reco .0 .0 82.9 2 extern

注意:上面的查詢摘錄自oracle press book oracle automatic storage management, under-the-hood & practical deployment guide, by nitin vengurlekar, murali vallath and rich long.

<b></b>

<b>本文來自雲栖社群合作夥伴“dbgeek”</b>