2023年11月26日发(作者:)
ASM自动存储管理技术经历多个年头,目前已经广泛使用于各个领域的数据库存储解决方案。
谈到ASM相信大家可能会参杂着熟悉而陌生的感觉,熟悉在于目前大家使用的11g rac中基本都是使用ASM,陌生在于大家
平时可能只是基本的使用,对asm了解并不全面,例如:数据库实例是怎么和asm交互和分工的、ASM存在哪些特性、数据库
各种文件是怎样放于asm存储中、它的元数据怎么存放等等。
开始
接下来我带大家重新全面认识ASM:
Oracle10g之前,存储设备的使用情况(在UNIX或者LINUX环境中)如下:
操作系统上安装逻辑卷管理器(LVM);
通过LVM将多个磁盘做成卷组;
在卷组上划分逻辑卷(logical volume);
在逻辑卷上创建文件系统;
Rac环境下需要第三方共享集群软件。
1、Oracle10g之后引入的专用文件系统ASM,为数据库文件的管理提供了很好的支持;
2、DBA 能够完全在 Oracle 框架内执行许多任务。利用 ASM来将一组磁盘转换成一个高可伸缩的和高性能的文件系统/卷
管理器;
3、磁盘组提供了直接作为原始设备来访问这个空间,并仍提供文件系统的便利性和灵活性的好处。
RAC环境下的asm结构:
ASM的出现是为RDBMS管理文件存储
1、ASM中的适合存放文件类型包括:数据文件datafile、控制文件controlfile、重做日志redolog、归档日志archivelog、闪回
日志flashback log、spfile、RMAN备份以及block tracking file、datapump文件
2、注意ASM不会替代RDBMS去实施IO读写,很多对这一点存在误解,认为RDBMS发送IO request给ASM,ASM去做真正
的IO操作,这是错误的。
3、ASM只负责将存储空间地址返回给RDBMS,真正的IO还是由RDBMS进程去完成,和不用ASM的裸设备一样
4、因此ASM不是IO的中间层,也就不存在因为ASM而出现所谓的IO瓶颈
ASM实例
ASM instance的主要任务之一就是管理ASM metadata元数据。ASM Instance在10.2中使用与RDBMS一样的2进制软件,到
11.2中分开独立实例,它类似于ORACLE RDBMS INSTANCE 有其SGA和大多数主要后台进程。
ASM 实例 中的 SGA 分为四个主要区域,如图所示:
共享池:用于元数据信息
大型池:用于并行操作 ASM
高速缓存:用于在重新平衡操作期间读取和写入块
空闲内存:可用的未分配内存
ARCn:归档进程
CKPT:检查点进程
DBWn:数据库写进程
DIAG:诊断进程
Jnnn:作业队列进程
LGWR:日志写进程
PMON:进程监视器进程
PSP0:进程衍生进程
QMNn:队列监视器进程
RECO:恢复器进程
SMON:系统监视器进程
VKTM:虚拟计时器进程
对于 ASM 实例,这些进程执行的任务和数据库实例中的不同。例如: ASM 实例的 SGA 中不包含日志缓冲区,该实例
也不使用联机重做日志。ASM 实例中的 LGWR 进程将事件记录信息复制到 ASM 磁盘组。
如果 ASM 是以集群方式建立的,则将在 ASM 实例中运行与集群管理相关的附加进程。 其中一些进程如下所示:
LMON:全局入队服务监视器进程
LMDn:全局入队服务守护程序
LMSn:全局高速缓存服务进程
LCKn:锁定进程
始化参数
ASM 实例由参数文件控制,通常设置的参数包括:
1、ASM_POWER_LIMITE:默认为1,表示ASM磁盘组在进行rebalance时的并行度,取值从1到11。
2、ASM_DISKSTRING 是一个与操作系统相关的值,ASM 使用它来限制搜索时考虑的磁盘集。默认值为空字符串,这在大多
数情况下就足够了。如上所示的约束性更强的值可以减少 ASM 执行搜索所需的时间,从而提高磁盘组装载次数。
3、ASM_DISKGROUP表示启动实例时,自动mount那些磁盘组,可以写多个磁盘组名。
4、MEMORY_TARGET 实例默认启用自动内存管理,即使未明确设置 MEMORY_TARGET 参数也是如此。 该参数建议设置不
小于1536MB,Oracle 11.2.0.3版本以后,ASM实例SGA组件内存需求增大,设置过小会引发 ORA-04031导致ASM实例crash的
问题。
数据库实例与ASM之间的交互
例如一个数据文件的创建,数据库实例与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发起IO操作,初始化这个ASM文件。
5、初始化完成后,RDBSM向ASM发送commit请求。ASM把相应的allocation table、file directory、alias directory异步写回
磁盘
6、提交确认会隐式关闭该文件。将来发生 I/O时,数据库实例需要重新打开该文件。
--数据库实例如何连接到ASM
好像经常有人问,数据库实例使用ASM作为存储,只需要在文件名中加上磁盘组名就可以,而数据库实例中没有任何有关
ASM的静态配置,那是怎么找ASM实例磁盘组的?
其实ASM实例挂载一个磁盘组后,ASM会把 disk group name、asm instance name、oracle home path等信息注册到CSS,当
数据库实例尝试打开或者创建名字以“+”开头的文件时, 它会通过CSS来查看disk group和mount该DG的ASM实例的信息, 再
通过css中这些信息构造connect string 连接ASM实例的。
磁盘组、磁盘、AU、ASM FILE 、EXTENT MAP
Asm概念图如下:
磁盘组
一个Disk Group由多个ASM disk组成。该Diskgroup 空间使用信息的元数据均完整地包含在这个磁盘组中。
通过v$asm_diskgroup视图查看磁盘组信息:
我们可看到group_numebr磁盘组号有1 、2分为name磁盘组CRS和DATA,blocak_size磁盘组的元数据块大小4K,AU大
小为1MB,STATE状态为CONNECTED说明有数据库实例连接使用、type冗余类型为外部冗余,总容量和空闲容量。
磁盘组冗余有三种选择:
External Redundancy没有Failure Group,不提供任何镜像
Normal redundancy要求至少2个Failure Group,默认支持双向镜像
High Redundancy要求3个Failure Group,默认支持三向镜像
ASM Disk
对于ASM而言LUN DISK可以是裸设备也可以直接是块设备(10.2.0.2以后)
通过v$asm_diskg视图查看磁盘信息:
我们可以看到有 4个asm disk,/dev/raw/raw1属于diskgroup 1,/dev/raw/raw2、/dev/raw/raw3属于diskgroup 2,而
/dev/raw/raw4不属于任何组,它的group_numer为0,header_status为CANDIDATE
通常不建议使用ASMLIB创建asm磁盘,缺点:
1、对于多路径设备(multipathing)需要配置ORACLEASM_SCANORDER及ORACLEASM_SCANEXCLUDE;
2、因为ASM INSTANCE使用ASMLIB提供的asm disk,所以增加了额外的层面;
3、不是每版本Linux Kernel都支持ASMLIB;
4、使用ASMLIB意味着要花费更多时间去创建和维护。
Allocation Unit
AU allocation unit是Disk Group的基本分配单元。一个ASM Disk上的可用空间总是整数倍个AU。在每一个ASM Disk的头部
均有一个表,该表的每一条记录代表该ASM Disk上的一个AU。
ASM 文件
ASM 文件由一组分配单元组成,这些文件只属于某个磁盘组,不可跨越磁盘组。 每个 ASM 文件都具有唯一的系统生成的
名称。ASM中可以存放 数据文件,日志文件,控制文件,归档日志等等。
Extent Maps
区映射是asm文件的extent指针(pointer)给出了ASM Disk Number磁盘号和AU号,这就描述了该extent的物理位置。
文件区与分配单元之间的关系如下所示。区包含:
一个 AU 用于前 20,000 个区 (0–19999)
4 AUs 用于接下来的 20,000 个区 (20000–39999)
16 AUs 用于 40,000 以上的区
将可变大小的区与大型分配单元结合使用,可满足非常大的ASM文件的需要。
X$KFFXP是ASM(Automatic Storage Management)自动存储管理特性的重要内部视图,该视图反应了File Extent Map映射关系。,
ASM会将文件split成多个多个piece分片,这些分片被称为Extents。 在Disk上存放这些Extent的位置,就是我们常说的”Allocation
Unit”。 从11g开始一个Extent可能包含多个AU。
以下我们通过X$KFFXP、v$asm_alias视图可以看到数据文件“SYSTEM.256.929288663”的extent map分布
ASM是怎么实现冗余?
ASM提供冗余,failure group采用同一分数据的多份拷贝,保证不会出现单点错误,冗余拷贝单位为Extent。多份冗余拷贝
不会存放在同一个failure group的磁盘中,换句话说一个failure group中只有一份数据的拷贝,不会有第二份。
以下示例, 一个normal redundancy 的Diskgroup 中存在8个Disk,并使用2个Failure Group。可以看到每个failure group
存在一份数据
当磁盘Disk H失败,这个失败要求在失败磁盘上所有的Extent均被修复, Extent 3和5会从现存的拷贝中复制到Failgroup 2
中可用的区域。在此例子中,Extent 5被从Disk A拷贝到Disk F,extent 3从Disk C 拷贝到Disk G,最后还会将失败的磁盘从Diskgroup
中drop出去。
ASM怎么平衡磁盘组内各磁盘的数据?
Rebalance
Rebalance 将在diskgroup范围内将数据在其DISK上移动,以保证文件们均匀分布在diskgroup中的所有磁盘上。,
一旦diskgroup中发生了一些存储配置变化 例如disk add/drop/resize均会自动触发一次rebalance。power参数将决定有多少
slave进程并参与数据移动。
rebalance中的每一次extent 移动均会与数据库实例做协调,因为数据库实例可能同时需要读取或者写这个 extent,所以数
据库在rebalance 同时能正常工作。 其对数据库的影响一般较小,原因是同一时间只有一个extent被锁定以便移动,且仅仅是阻
塞写入。
以下示例Rebalance。磁盘组diskgroup中原有两个磁盘disk01和disk02。
我们为磁盘组diskgroup添加一个磁盘disk03,这时disk03并没有内容
在rebalance后,disk01、disk02和disk03的数据是会达到平衡。
Asm的条带化是什么?
ASM有两种条带类型:粗粒度,细粒度。熟悉存储的同学一听条带就知道是什么概念。粗粒度条带化类似于传统卷管理器使
用1MB作为stripe size。
粗粒度条带化分配文件时,ASM会在所有磁盘中平均分布分配单元。有时分布无法非常平均,但是随着时间的流逝,会变得
几乎相等。上图显示了一个具有五个分配单元的文件,这些分配单元在条带化之后,分布在一个外部冗余磁盘组的五个磁盘中,
该磁盘组共包含八个磁盘。
细粒度条带化我们日常极少会用到,默认都是粗粒度。细粒度条带化将数据区拆分为 128 KB 的块,然后在许多磁盘中分布
每个区的负载,从而改善特定类型文件的等待时间。默认情况下,细粒度条带化用于控制文件和联机重做日志文件。
图显示了细粒度条带化的工作原理。在此示例中,新文件的第一个 1 MB 区最终占 用 8 个不同分配单元中的第一个 128 KB
块,这 8 个分配单元分布在磁盘组的八个磁盘中。 因此,1 MB 的读取或写入分布在八个磁盘(而不是一个磁盘)中。
继续前面的示例,空间中的下一个 1 MB 区将分布在相同分配单元组的每个单元的第二个 128 KB 块中。这种模式将继续,
直到第一组分配单元写满,然后分配另一组。
细粒度条带化需要通过模板来配置:
1)在原有diskgroup上添加细粒度模板,:
Alter diskgroup dg1 add template stp_find attributes(unprotected find);
2)创建使用细粒度条带化表空间
Create tablespace tbs_data datafile ‘+dg1(stp_find)’/tbs_’ size 100m;
ASM实例中两隐含参数可修改细粒度条带化的条带大小和宽度(细粒度条带化默认条带大小为128kb,宽度默认为8)
alter system set “_asm_stripsize”=
alter system set “_asm_stripwidt”=
管理asm常用的视图
ASM 实例托管基于内存的元数据表,这些表通过动态性能视图呈现:
视图名 X$基表名 描述
V$ASM_DISKGROUP X$KFGRP
V$ASM_DISKGROUP_STAT X$KFGRP_STAT 显示disk group状态
V$ASM_DISK X$KFDSK, X$KFKID
V$ASM_DISK_STAT 列出磁盘和其使用度量信息
D
X$KFDSK_STAT,X$KFKI
组
实施磁盘发现disk discovery和列出磁盘
以及这些磁盘的使用度量信息
列出ASM文件也包括了元数据信息 V$ASM_FILE X$KFFIL
列出了ASM的别名,文件和目录 V$ASM_ALIAS X$KFALS
列出可用的模板和其属性 V$ASM_TEMPLATE X$KFTMTA
列出链接到ASM的DB实例 V$ASM_CLIENT X$KFNCL
列出rebalancing重平衡操作 V$ASM_OPERATION X$KFGMG
I/O统计信息
实施磁盘发现disk discovery和列出磁盘
V$ASM_DISK_IOSTAT(new in X$KFNSDSKIOST(new in
11g) 11g)
通过前面内容,我们知道asm实例是通过管理维护metadata来为rdbms提供存储信息,那么接下来我们对asm元数据信息
进一步理解。
ASM metadata
Asm Metadata是存在于ASM disk header用以存放ASM Diskgroup 控制信息的数据,Metadata包括了该磁盘组中有哪些磁盘,
多少可用的空间,其中存放的File的名字,一个文件有哪些Extent等等信息。
由于Asm metadata就存放在ASM DISK HEADER,所以ASM disk group是自解释的。所有的metadata元数据均存放在一个个
metadata block中(默认block size 4096)。这些信息包括该metadata block的类型以及其逻辑位置。所有的metadata block均是4k
大小。实际使用时ASM实例会缓存这些ASm metadata。
Disk Header
一个ASM DISK的最前面4096字节为disk header,对于ASM而言是block 0 (blkn=0);许多操作系统会保留LUN的第一个block
来存放分区表或其他OS信息。 一般不让ASM基础到这个block,因为ASM会毫不犹豫地覆盖这个block。在一些指定的平台上
ORACLE从代码层跳过这些操作系统块,但实际操作时一般的惯例是只给ASM用那些上面没有分区表的LUN DISK。
kfed是ASM自带的未公开的工具, kfed它可以读取和修改ASM磁盘的元数据,对修复一些关键错误非常有用,以下通过kfed
来读取disk header信息。
我们可以看到,这些都是磁盘的信息,所属磁盘组、磁盘号、au size、bolck size、冗余模式等等
磁盘头备份策略
在Oracle ASM环境中,磁盘头是ASM磁盘的重要属性,记录了ASM的基础信息。一旦磁盘头发生损坏,ASM将不能提供访
问,进而导致数据库无法提供服务。
在Oracle 10.2.0.5(不含)以前,Oracle不提供ASM磁盘头自动备份;从Oracle 10.2.0.5开始,ASM磁盘头自动备份功能,
Oracle提供了自动备份功能。
因此,对于采用10.2.0.5(不含)版本之前建议:定期进行ASM磁盘头的备份。备份方案如下:
Oracle ASM4KBASM1AU1Block
磁盘头信息,大小为,位于磁盘第个第个。
有种方式备份方式:
2
备份方法:
() 自动备份
1
对于(含)以上版本,磁盘头信息变更后,将会自动备份,已无需手动备份;
10.2.0.5
() 手动备份
2
对于以下(不含)版本,使用如下命令可备份磁盘头:
10.2.0.5ASM
dd if=/dev/raw/raw2 of=/tmp/ bs=1 count=4096
恢复方法:
() 自动备份
1
kfed repair /dev/oracleasm/disks/ASMDISK2 ausz=
() 手动备份
2
(AU_Size=1M)
dd if=/dev/oracleasm/disks/ASMDISK2 of=/tmp/ASMDISK2_ bs=4k count=1
skip=254
dd if=/tmp/ of=/dev/oracleasm/disks/ASMDISK2 bs=4k count=1
通过上述备份,ASM磁盘头得到了保护。无论在哪个版本,一旦磁盘头发生故障,则可以利用备份进行修复。
asm磁盘空间使用是怎么管理?
Freespace Table
AU=0 的blkn=1 包含的是free space table;其中包含了该AU中allocation table中每一个block上大致的可用剩余FREE SPACE
可用空间信息。通过参考free space table可以避免在已经分配完的allocation table中查找空间。
Allocation Table
Aun=0的第2至254个metadata block用以存放AU分配信息每一个metadata block描述448个AU的状态, 如果一个AU已
经分配给一个文件,则allocation table 记录其ASM文件号和data extent号。对于还是FREE的AU则被link到free list上。
对于已经从磁盘中分配出去的AU,会在AT表相关条目上记录相应的extent号,文件号和au的状态,对于已经分配出去的
AU,flag V=1,否则,flag V=0,例如AU还没有分配给具体的文件或者已经释放掉的AU,V的值会是0。
一号文件!!!
ASM中的文件总体上来说,分为两大类,元文件和数据文件。数据文件包含Oracle的数据文件、控制文件、重做日志文件、
归档日志文件等等。对于ASM来说,只要是非元文件,就是数据文件。每一个文件,在ASM中都有一个专门的索引号,也就是
编号,ASM文件索引号从1开始。其中,前255个,也就是1至255号文件,都是元文件。256之后的是其他各种文件。
比较重要的1号文件包含所有文件的磁盘占用信息,包括元文件、甚至1号文件自身的空间分布信息,也都是在1号文件内
部。每个文件在它里面占用一个块(4096字节,元数据块大小为4K)的空间。
我们用kfed来读取信息0号磁盘2号au的1号块
kfffde[0]的数据元素,存放了1号文件第一个AU的位置。kfffde[1]存放了1号文件第二个AU位置,等等,依次类推。
我们看到kfffde[2].: 4294967295说明1号文件没有第3个au
假设我们想要访问256号文件,如何找出256号文件的AU都在哪里分布呢?
256号文件是数据文件,也是第一个数据文件,因为256号前都是元文件
SQL> l
1* select name,GROUP_NUMBER,FILE_NUMBER from V$ASM_ALIAS where file_number =256
SQL> /
NAME GROUP_NUMBER FILE_NUMBER
------------------------------ ------------ -----------
SYSTEM.256.929288663 2 256
256号文件的AU分布,在(0号盘,20号AU,0号块)中,使用Kfed读取它
通过x$kffxp内部表也得到验证:
ASM的限制
ASM 限制
11gR2:
Oracle ASM 对磁盘组,磁盘和文件的限制
ASM 最多63个磁盘组
ASM 所有磁盘组最多10,000 个磁盘
每个磁盘组最多1000000 个文件。
每个磁盘最大2TB
ASM 最大20PB
12c:
Oracle ASM 对磁盘组,磁盘和文件的限制
ASM 最多511个磁盘组
ASM 所有磁盘组最多10,000 个磁盘
每个磁盘组最多1000000 个文件。
每个磁盘最大2TB
ASM 最大20PB


发布评论