(一)ASM概述
提到Oracle ASM,相信大家都有熟悉又陌生的感覺,熟悉在於目前11g ARC數據庫基本都使用ASM,陌生在於平時只是基本的使用,對ASM了解並不全面。例如數據庫實例是如何與ASM交互與分工的、ASM存在哪些特性、數據庫各種文件是怎樣存放於ASM存儲中、他的元數據是怎么存放的。
Oracle 10g之前,存儲設備的使用情況:UNIX/Linux操作系統上安裝邏輯卷管理器(LVM),通過LVM將多個磁盤做成卷組,在卷組上划分邏輯卷(logical volume),然后在邏輯卷上創建文件系統,RAC環境下需要第三方共享集群軟件。Oracle 10g之后引入的專用文件系統ASM,為數據庫文件的管理提供了很好的支持。DBA能夠完全在Oracle框架內執行許多任務,利用ASM來將一組磁盤轉換成一個可伸縮的和高性能的文件系統/卷管理器。ASM磁盤組提供了直接作為原始設備來訪問這個空間,並提供文件系統的便利性和靈活性。
ASM對DBA有許多好處,使用ASM可以避免:
- I/O性能優化
- 數據文件移動和重新組織
- 文件名管理
- 邏輯卷管理
- 文件系統管理
- 集群文件系統管理
- 裸設備管理
使用ASM可以顯著減少:
- 邏輯單元號(LUN)管理,邏輯單元數量較少,大小較大
- 數據庫管理員對系統管理員的依賴性
- 手動執行任務時可能發生的錯誤
(二)RAC環境下的ASM結構
RAC環境下的ASM結構如圖:
圖1. RAC環境下的ASM結構
ASM的出現是為RDBMS管理文件存儲,ASM中適合存放的文件類型包括:數據文件(data file)、控制文件(control file)、重做日志文件(redo log file)、歸檔日志文件(archive log file)、閃回日志文件(flashback log file)、參數文件(spfile)、RMAN備份以及block tracking file、datapump文件。
ASM不會代替RDBMS去實施I/O讀寫,很多人對這一點存在誤解,認為RDBMS發送I/O請求給ASM,ASM去執行I/O,這樣的想法是錯誤的。ASM只負責將存儲空間地址返回給RDBMS,真正的I/O還是會由RDBMS進程去完成,和不用ASM的裸設備一樣,因此ASM不是I/O的中間層,也就不存在因為ASM而出現I/O瓶頸。
(三)ASM實例
ASM實例的主要任務之一就是管理ASM metadata元數據。ASM instance在10.2中使用與RDBMS一樣的二進制軟件,到11.2中分開獨立實例,它類似於ORACLE RDBMS INSTANCE,有其SGA和大多數后台進程。
ASM Instance結構如下圖:
圖2.ASM Instance結構圖
(1)ASM Instance中的內存結構主要包括4個部分:
- Share Pool:用於元數據信息
- Large Pool:用於並行操作ASM
SQL> show parameter large_pool_size
NAME TYPE VALUE
------------------------------- ----------- ------------------------------
large_pool_size big integer 12M
- ASM高速緩存:用於重新平衡操作期間讀取和寫入塊
- Free Memory:可用的未分配內存
(2)ASM的主要進程:
- RBAL:在搜索過程中打開所有設備文件並協調重新平衡活動
- ARBn:一個或多個從屬過程,用於執行重新平衡活動
- GMON:負責管理磁盤活動,例如刪除或脫機以及提高ASM磁盤兼容性
- MARK:根據需要將ASM分配單元標記為過時
此外,ASM Instance還有一下進程:
- ARCn:歸檔進程
- CKPT:檢查點進程
- DBWn:數據庫寫進程
- DIAG:診斷進程
- Jnnn:作業隊列進程
- LGWR:日志寫進程,ASM實例的SGA不包含log buffer,該實例也不使用聯機重做日志文件,ASM實例的LGWR進程將事件記錄信息復制到ASM磁盤組。
- PMON:進程監視進程
- SMON:系統監視進程
- PSP0:進程衍生進程
- QMNn:隊列監視進程
- RECO:恢復器進程
- VKTM:虛擬計時器進程
對於ASM實例,這些進程執行的任務與數據庫實例中的不同。例如,ASM實例的SGA不包含日志緩沖區,該實例也不使用聯機重做日志,ASM實例中的LGWR進程將事件記錄信息復制到ASM磁盤。
如果ASM是以集群方式建立的,則將在ASM實例中運行與集群管理相關的附加進程。其中一些進程如下:
- LMON:全局入隊服務監視器進程
- LMDn:全局入隊服務守護進程
- LMSn:全局高速緩存服務進程
- LCKn:鎖定進程
(四)初始化參數
ASM由參數文件控制,通常設置的參數包括:
- instance_type:對於asm實例來說,要設置成asm,對於數據庫,則設置成RDBMS
- ASM_POWER_LIMITE:默認為1,表示ASM磁盤組在進行rebalance時的並行度,值從1到11,1最慢,該參數可動態修改alter system set asm_power_limit=5;
- ASM_DISKSTRING:是一個與操作系統有關的值,ASM使用它來限制搜索時考慮的磁盤集。默認為空字符串,表示ASM查找系統中所有ASM擁有讀寫權限的所有設備;
- ASM_DISKGROUP:表示啟動實例時,自動Mount那些磁盤組,可以寫多個磁盤組
- MEMORY_TARGET:默認自動啟動內存管理,即使未明確設置MEMORY_TARGET參數也是如此,該參數建議不小於1536M。
通常,這幾個參數的值如下:
asm_diskgroups string
asm_diskstring string
asm_power_limit integer 1
asm_preferred_read_failure_groups string
memory_target big integer 0
(五)數據庫實例與ASM實例的交互
例如,一個數據文件的創建,數據庫實例與ASM實例是怎么交互分工來完成的?
圖3.數據庫實例與ASM實例交互
文件創建過程如下:
1.用戶在RDBMS發出create file命令,RDBMS會發起一個與ASM實例的連接,RDBMS端這個連接是ASMB后台進程,而ASM端則是個前台進程,接着,創建文件的指令通過這個鏈接提交給ASM實例;
2.ASM根據創建文件的指令,從磁盤中分配AU,ASM會根據指定的模板(template)或diskgroup默認的template來決定文件的冗余、條帶策略;
3.AU分配完成后,ASM就把文件的Extent map發送給RDBMS;
4.RDBMS發起I/O操作,初始化(格式化)這個ASM文件;
5.初始化完成后,RDBMS向ASM發送commit請求,ASM把相應的allocation table、file directory、alias directory異步寫回磁盤;
6.提交確認會隱式關閉該文件。將來發生I/O時,數據庫實例需要重新打開該文件。
注意:用戶在讀寫數據時,第4步不同,其它均相同
經常有人問,數據庫實例使用ASM作為存儲,只需要在文件名中加上磁盤組名即可,而在數據庫中沒有ASM相關的靜態配置,那么是怎么找到ASM磁盤組的?
其實ASM實例掛載磁盤組后,ASM會把disk group、asm instance name、oracle home path等信息注冊到CSS,當數據庫實例打開或創建名字以“+”開頭的文件時,它會通過CSS來查看disk group和mount該DG的ASM實例的信息,再通過CSS中這些信息構造connect string連接ASM實例的。
ASM概念圖如下:
圖4.數據庫邏輯結構與ASM物理結構的關系
(六)磁盤組、磁盤、AU、ASM文件、EXTENT MAP
(6.1)ASM磁盤組(ASM diskgroup)
一個Disk Group由多個ASM Disk組成,該Diskgroup空間使用信息的元數據均完整的包含在這個磁盤組中,通過v$asm_diskgroup視圖查看磁盤組信息。
SQL> select * from v$asm_diskgroup;
GROUP_NUMBER NAME SECTOR_SIZE BLOCK_SIZE ALLOCATION_UNIT_SIZE STATE TYPE TOTAL_MB FREE_MB COLD_USED_MB USABLE_FILE_MB VOTING_FILES
------------ --------- ----------- ---------- -------------------- ---------- ------ ---------- ---------- ------------ -------------- ------------
1 ARC 1024 4096 1048576 CONNECTED EXTERN 204800 178612 26188 178612 N
2 DATA 1024 4096 1048576 CONNECTED EXTERN 2048000 1523261 524739 1523261 N
3 OCRVOTE 1024 4096 1048576 MOUNTED EXTERN 6144 5716 428 5716 Y
我們可以看到一共有3個DG,名字分別為ARC、DATA、OCRVOTE,磁盤組的Block Size大小為4096b(4kb),AU大小為1Mb,STATE狀態有CONNECTED,說明數據庫實例正在連接使用該DG;狀態為MOUNTED,說明DG已經掛載,隨時可以使用。TYPE類型顯示為外部冗余,總容量和空閑容量在這也有顯示。
磁盤組冗余有三種選擇:
- External Redundancy:沒有Fialure Group,不提供任何鏡像;
- Normal Redundancy:至少要求2個Failure Group,默認支持雙向鏡像;
- High Redundancy:要求3個Failure Group,默認支持三向鏡像。
(6.2)ASM磁盤(ASM disk)
對於ASM而言LUN Disk可以是裸設備也可以直接是塊設備,可以通過v$asm_diskgroup來查看磁盤信息:
SQL> select * from v$asm_disk;
GROUP_NUMBER DISK_NUMBER MOUNT_STATUS MODE_STATUS LIBRARY OS_MB TOTAL_MB FREE_MB NAME FAILGROUP PATH VOTING_FILE SECTOR_SIZE FAILGROUP_TYPE
------------ ----------- ------------ ----------- ------- -------- -------- ------- -------------- ------------ ------------------ ----------- ----------- --------------
3 0 CACHED ONLINE System 6144 6144 5716 OCRVOTE_0000 OCRVOTE_0000 /dev/rdisk/disk18 Y 1024 REGULAR
1 0 CACHED ONLINE System 204800 204800 186864 ARC_0000 ARC_0000 /dev/rdisk/disk19 N 1024 REGULAR
2 0 CACHED ONLINE System 1024000 1024000 761637 DATA_0000 DATA_0000 /dev/rdisk/disk20 N 1024 REGULAR
2 1 CACHED ONLINE System 1024000 1024000 761624 DATA_0001 DATA_0001 /dev/rdisk/disk21 N 1024 REGULAR
我們可以看到ASM Disk,其中/dev/rdisk/disk19屬於diskgroup1,/dev/rdisk/disk20和/dev/rdisk/disk21屬於diskgroup2,/dev/rdisk/disk18屬於diskgroup3。通過ASM磁盤信息,我們也可以看到磁盤的使用情況。
創建ASM磁盤的方法主要有:ASMLIB和UDEV。通常不建議使用ASMLIB創建ASM磁盤,缺點有:
1.對於多路徑設備,需要配置ORACLEASM_SCANORDER及ORACLEASM_SCANEXCLUDE;
2.因為ASM Instance使用ASMLIB提供的ASM disk,所以增加了額外的層面;
3.不是每個版本的Linux Kernel都支持ASMLIB;
4.使用ASMLIB意味着要花費更多的時間去創建和維護。
(6.3)AU
AU(allocation unit)是Disk Group的分配單元,一個ASM磁盤上的可用空間總是整數倍個AU。在每一個ASM Disk的頭部均有一個表,該表的一個記錄代表ASM Disk的一個AU。
在創建磁盤組時可以配置AU大小,AU默認大小為1MB,AU足夠小,能夠緩存數據庫,但足夠大,能夠提供高效的訪問。AU的大小可設置為:1,2,4,8,16,32或64MB。
(6.4)ASM文件
ASM文件由一組分配單元(AU)組成,這些文件只屬於某個磁盤組,不可跨越磁盤組,每個ASM文件都具有唯一的系統生成的名稱,ASM文件的文件名以“+”號開頭,如“+data/orcl/datafile/system.256.689832921”。如果在創建ASM文件時指定了文件的名稱,如“+data/orcl/tbs01.dbf”,則該名稱為ASM文件的別名,ASM會將該別名與實際創建的文件名稱相關聯。
ASM中可以存放數據文件、日志文件、控制文件、歸檔日志文件等。
(6.5)區映射(EXTENT MAP)
區映射是ASM的Extent指針(pointer)給出了ASM Disk Number和AU號,這就描述了該Extent的物理位置。
圖5.ASM區映射
文件區與分配單元(AU)之間的關系如下所示。區包含:
- 1個AU用於前20000個區(0-19999)
- 4 AUs用於接下來的20000個區(20000-39999)
- 16 Aus用於40000以上的區
將可變大小的區與大型分配單元結合使用,可滿足非常大的ASM存儲文件的需要。
X$KFFXP是ASM自動存儲管理特性的重要內部視圖,該視圖反應了File Extent Map映射關系。
(七) ASM故障組
ASM怎么實現冗余,failure group采用同一份數據的多份拷貝,保證不會出現單點錯誤,冗余拷貝單位為Extent。多份冗余拷貝不會存在同一個failure group 的磁盤中,換句話說,一個failure group中只有一份拷貝的數據,不會有第二份。
failure group又是什么概念呢?個人理解,failure group是diskgroup的一個子集,在創建diskgroup的時候,我們可以指定磁盤組的failure group的數量,如果不指定,則diskgroup中的每個磁盤都是一個failure group。對於冗余級別為external的diskgroup, 只保留一份數據,因此只需要有1個diskgroup即可,對於冗余級別為normal的diskgroup, 需要保留一份數據及其鏡像,因此至少需要有2個diskgroup,對於冗余級別為high的diskgroup, 需要保留一份數據及兩份鏡像,因此至少需要有3個diskgroup。
以下示例,一個normal redundancy的diskgroup中存在8個disk,並使用2個failure group,可以看到每個failure group存一份數據。
圖6.ASM Normal Redundancy Extents分布圖示
當disk H發生故障時,這個失敗要求在失敗磁盤上的所有的Extent均被修復,Extent3和Extent5會從現存的磁盤中復制到failure group 2中可用的區域。在此例子中,Extent 5被從disk A中復制到disk F,Extent 3從disk拷貝到disk G,最后將失敗的磁盤從diskgroup中drop出去。
圖7.失效時的磁盤分配
(八)ASM磁盤數據rebalance
ASM怎么平衡組內磁盤的數據?Rebanlance將在diskgroup范圍內將數據在disk上移動,以保證文件均勻分布在diskgroup上的各個磁盤中。一旦diskgroup發生了存儲配置變化,如增加或刪除磁盤,resize會自動出發一次rebanlance。power參數將決定有多少個slave進程參與數據移動。
以下示例Rebanlance。磁盤組diskgroup中有2個磁盤disk A和disk B,這時,我們再增加一個磁盤disk C,這時disk C並沒有數據。在Rebanlance后,三個磁盤數據達到平衡。
圖8.ASM磁盤數據rebanlance
(九) ASM條帶化
在ASM中,條帶化主要有2個用途:
- 在磁盤組的所有磁盤中執行I/O負載平衡;
- 改善I/O等待時間
ASM條帶化一共有2種類型,粗粒度條帶化和細粒度條帶化。
(9.1)粗粒度條帶化(主要用於平衡I/O)
粗粒度條帶化條帶大小固定為AU大小,條帶寬度固定為1。因此,粗粒度條帶化在分配文件時,ASM會在所有磁盤中分布分配單元,有時無法非常平均,但隨着時間的流逝,會變得幾乎相等。下圖顯示了一個具有5個分配單元的文件,這些AU在條帶化之后,分布在一個冗余級別為external的磁盤組中,該磁盤組一共有8個磁盤。
圖8.粗粒度條帶化
(9.2)細粒度條帶化(主要用於改善等待時間)
細粒度條帶化極少使用,默認都是粗粒度。細粒度條帶化條帶大小為128KB(默認),AU大小為1MB(默認),條帶寬度為8。細粒度條帶化將數據區拆分為128KB的塊,然后許多磁盤分布每個區的負載,從而改善特定文件類型的等待時間,默認情況下,細粒度條帶化用於控制文件和聯機重做日志文件。
例子:具有8個磁盤構成的磁盤組,采用外部冗余的模式,AU大小為1MB,細粒度條帶化條帶大小為128KB,AU大小為1MB。第一個1MB區在8個AU中以128KB條帶形式寫入。因此,1MB數據分布在8個磁盤中,而不是1個磁盤中。
圖9.第一個1MB區在8個AU中以128KB條帶形式寫入
當第二個1MB區數據進來后,繼續分配在每個磁盤AU的第2個128KB塊中,這種模式一直繼續,直到第1組AU寫滿,然后再分配下一組AU。
圖9.第二個1MB區繼續在8個AU中以128KB條帶形式寫入
(十)ASM常用視圖
視圖名稱 | x$基表名 | 描述 |
V$ASM_DISKGROUP | X$KFGRP | 實施磁盤發現disk discovery和列出磁盤組 |
V$ASM_DISKGROUP_STAT | X$KFGRP_STAT |
顯示磁盤組狀態 |
V$ASM_DISK | X$KFDSK,X$KFKID |
實施磁盤發現disk discovery和列出磁盤以及磁盤的使用量 |
V$ASM_DISK_STAT | X$KFDSK_STAT,X$KFKID |
列出磁盤及度量信息 |
V$ASM_FILE | X$KFFIL |
列出ASM文件,也包括了元數據信息 |
V$ASM_ALIAS | X$KFALS | 列出ASM的別名,文件和目錄 |
V$ASM_TEMPLATE | X$KFTMTA |
列出可用的模板及屬性 |
V$ASM_CLIENT | X$KFNCL |
列出連接到ASM實例的會話客戶端 |
V$ASM_OPERATION | X$KFGMG |
列出rebalance重平衡操作 |
V$ASM_DISK_IOSTAT | X$KFNSDSKIOST | I/O統計信息 |
【完】
注:本文整理自雲和恩墨的線上講座,原文:https://wenku.baidu.com/view/752e450fdc36a32d7375a417866fb84ae45cc391.html。感謝作者的分享。