(一)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种类型,粗粒度条带化和细粒度条带化。

(10.1)粗粒度条带化(主要用于平衡I/O)

        粗粒度条带化条带大小固定为AU大小,条带宽度固定为1。因此,粗粒度条带化在分配文件时,ASM会在所有磁盘中分布分配单元,有时无法非常平均,但随着时间的流逝,会变得几乎相等。下图显示了一个具有5个分配单元的文件,这些AU在条带化之后,分布在一个冗余级别为external的磁盘组中,该磁盘组一共有8个磁盘。

                         图8.粗粒度条带化

(10.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。感谢作者的分享。

版权声明:本文为lijiaman原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/lijiaman/p/9306679.html