暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

ASM的空间管理

eygle 2019-09-19
3527

ASM的空间以区块(Chunk)形式分配,被称为Allocation Unit(AU),AU是ASM最基本的存储单元,每块ASM磁盘以AU为单位进行划分,缺省的AU大小为1M,在Oracle 11g中AU大小可以定义(由隐含参数_asm_ausize控制),


类似数据库的段、区层次关系,创建在ASM磁盘组上的文件(ASM File)也是由一系列的ASM Extent组成的,在Oracle 10g中,ASM区大小和AU大小相同,一个区占用一个AU(在External Redundancy模式下);在Oracle 11g中,ASM区大小可变。ASM文件的区会以AU为单位,在组成ASM磁盘组的磁盘上均衡分布。


和RDBMS类别一下:数据块是数据库最小的存储单元,在创建文件时指定,对于文件不可变,而Extent是最小的空间分配单元,其大小是可变的;对于ASM,AU是最小的存储单位,在创建磁盘组时指定,创建之后不可改变,而ASM Extent是最小的空间分配单位,在Oracle 11g中是可变的。由于ASM Extent大小可变,所以在分配和回收时也会出现“碎片”,ASM会自动检测和解决碎片问题。


下图是ASM和数据库结构的对比图:


企业微信截图_15688656198564.png



在ASM管理中,数据库的表空间创建操作可以被大幅简化,只要指定了文件创建位置,文件会由ASM自动创建和管理:


SQL> show parameter db_create_file_destNAME                                 TYPE        VALUE------------------------------------ ----------- ------------------------------db_create_file_dest                  string      +DATADG
我们来看一下当在数据库级别发出一个创建语句,底层如何配合:
SQL> create tablespace eygle;Tablespace created.SQL> select name,bytes/1024/1024 MB from v$datafile where name like '%eygle%';NAME                                                                 MB------------------------------------------------------------ ----------+DATADG/rac/datafile/eygle.262.747069325                            100


如果不指定大小,以上语句创建了一个100M的数据文件。ASM缺省命名的文件名是eygle.262.747069325,这个名称包含了表空间名称和ASM文件号等信息,这个名称被称为ASM为文件赋予的“别名”:


SQL> select GROUP_NUMBER, FILE_NUMBER, NAME
  2    from v$asm_alias
  3  where lower(name) like '%eygle%'; 
GROUP_NUMBER FILE_NUMBER NAME
------------ ----------- ----------------------------------------
           1         262 EYGLE.262.747069325


文件大小100M,需要分配至少100个AU,通过内部表X$KFFXP(extent map table for all ASM files)可以查询到文件的ASM区间分配情况。以下查询返回102条记录:


SQL> select disk_kffxp, AU_kffxp, xnum_kffxp
  2    from x$kffxp where group_kffxp = 1 and number_kffxp = 262;
DISK_KFFXP   AU_KFFXP XNUM_KFFXP
---------- ---------- ----------
         0        956          0
         0        957          1
         0        958          2
         0        959          3
。。。。。。。
         0       2192         97
         0       2193         98
         0       2194         99
         0       2195        100
         0       2154 2147483648


以上输出中AU_KFFXP指AU在磁盘中的相对位置,X_NUM_KFFXP指ASM区号,这个表的输出信息与RDBMS中的DBA_EXTENTS极为相似。

 

在Oracle 11g中AU_SIZE 支持 1M, 2M, 4M, 8M, 16M, 32M, 64M 大小,可以自行调节,在创建磁盘组的高级选项里可以定义“分配单位大小”:


企业微信截图_15688656418802.png



该选项在创建磁盘组可以显示指定,类似如下的attribute属性定义,指定au_size为4M:


create diskgroup ORADG external redundancy

disk '/dev/raw/raw1' attribute 'au_size' = '4M';


在使用Normal Redundancy模式时,当分配一个区(也被称为Primary  Extent)时,会同时在相应的failgroup分配一个镜像区(通常称为secondary extent),防止数据损失;在Oracle 10g中,RDBMS在访问数据时,仅访问 Primary Extent而不会访问Mirror Extent,镜像区在发生IO错误时可以提供访问以维持业务连续性。在Oracle 11g中,Preferred Read特性允许定义Secondary Extent作为优先读取,如在RAC环境中,可以指定不同的实例从不同的Failgroup读取,分担负载。


下图是Normal Redundancy磁盘组的示意图,假定AU大小为1M,5M数据以循环(redundancy)方式写入Failure Group,Primary Extent提供读取,Secondary Extent提供数据安全保障,这种模式在使用同一台本地存储时没有问题,但是当两个Failure Group位于不同物理设备时,Primary Extent读取就可能带来额外的网络交换:


企业微信截图_15688656767605.png


在Oracle 11g中,我们可以通过设置优先读取组,指定不同节点优先读取本地存储数据,比如在节点1设置:


alter system set

asm_preferred_read_failure_groups = 'ORADG1.ORADG1_0000','ORADG2.ORADG2_0000'


在节点2设置:


alter system set

asm_preferred_read_failure_groups = 'ORADG1.ORADG1_0001','ORADG2.ORADG2_0001'


下图是优先读取组的改进示意图,通过v$asm_disk_iostat视图可以查看不同磁盘的IO分布情况:


企业微信截图_15688655508839.png


下图展示了当Failure Group中出现磁盘损坏时,ASM通过自动拷贝重构冗余环境的过程:


企业微信截图_1568865812364.png


ASM区和AU的映射关系通过Extent MAP来维护,当文件被创建或打开时,数据库实例和ASM实例交互来获得Extent Map信息,一旦这部分信息被读取到数据库实例中(在SGA中存储),数据库就可以直接读写文件,不需要与ASM实例交互,也就是说RDBMS实例不需要通过ASM实例传递I/O请求,也正因为数据库实例可以直接读写数据文件,使得ASM能够获得裸设备一样的性能。


在Oracle 10g版本中,ASM在初始化时,会向数据库实例发送整个数据文件的Extent map,这会消耗较多时间,影响性能;在Oracle Database 11g中,初始化仅发送Extent map 中的前60个extent,其余则根据数据库实例的后续请求而发送。

最后修改时间:2019-09-19 12:04:23
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论