(一)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结构如图:
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。感谢作者的分享。