一、OracleASM的前世今生
1996年,当时Oracle ASM最初的架构师Bill Bridge提出了一个新想法,那就是构建Oracle自己的存储管理系统。当时反对声音认为,Oracle没有必要介入存储管理领域。
1999年,这个项目被正式批准启动,最初的名字叫Parallel Storage Manager(PSM), 后来更改为Oracle Data Manager,2000年名称更改为OSM(Oracle Storage Management) 。
2003年最终被更改为ASM(Automatic Storage Management), 并在那一年的OOW大会上发布。从2003年ASM产品发布至今,已经走过了二十几个年头,ASM本身已经变得越来越强大,越来越成熟,这一产品已经深远的影响了整个产业,并且极大的冲击了很多以文件系统、集群文件系统为生的第三方厂商。现在ASM技术已经成为数据库架构中,位于操作系统和应用之间的最重要组件。
二、OracleASM的主要功能和优点
1)逻辑卷管理
自动管理磁盘组,增加和删除磁盘操作十分简单。而磁盘文件的重部署由 ASM 自动完成,不需要 DBA 干预,简化了DBA的工作,无需停机,并且文件区域自动重新分配。
2)软RAID功能
所有的数据均有冗余备份,当磁盘出现坏块或者整个磁盘损坏都可以从备份数据中读取,复制,恢复至正常使用的磁盘上。
3)文件系统
实现了文件级的冗余备份,提高了数据文件的可用性。针对数据库优化,减少元数据量。
4)自动负载均衡
ASM 自动将一个文件均衡存储在组中的多个磁盘上,提供条带化技术实现这种文件的均衡分布。I/O 自动分布在所有可用的磁盘上,无需人工干预。若有出现IO热点,自动重平衡,将热点IO分散到多块磁盘上。
5)经济实用
ASM作为Oracle数据库的一个组件,无需额外付费,且用通用硬件即可。与第三方专用存储软件或者硬件相比更节省费用。
三、总体结构

磁盘组由 ASM 磁盘组成,可以包含一个或多个 ASM磁盘。整个
ASM磁盘一般为原始的磁盘设备,不需要挂载到系统中,不需要格式化为ext4或xfs等文件系统
AU(Allocation Unit)为磁盘的最小存储单元
一块ASM磁盘分为多个Stride,每个Stride包含AT(Allocation Table) 和多个AU

文件中包含元数据和多个 extent, 每个extent包含1到16个AU
四、磁盘组
每个磁盘组都有自己的PST表(Partnership and Status Table), 保存在部分磁盘的第二个AU,即AU1。
每个磁盘的AU 1是为PST表预留的,但是并不是每一个磁盘都有PST表的信息。
PST表包含了一个磁盘组中所有磁盘的相关信息-磁盘号,磁盘状态,partner的磁盘号,心跳信息和failgroup的信息。
在normal冗余的磁盘组中,至少有两份PST表,分别保存在不同的磁盘中。如果磁盘组中有三个或更多的failgroup,PST表将会有3份.在high冗余的磁盘组中,至少有三份PST表的信息。
可以简单方便的添加或删除磁盘, 实现扩容或更换坏盘。
文件冗余保存成多份副本,分别在不同的磁盘上,若一个副本损坏可以从其他副本读取。三种冗余级别:KFDGTP_EXTERNAL 由外部存储负责冗余,ASM只保存一份;KFDGTP_NORMAL 常规冗余,2份副本;KFDGTP_HIGH 高冗余,3份副本。
文件条带化存储,利于多个磁盘的IO均衡。
每一个磁盘组都是独立的存储单元,每一个磁盘组都会有属于它自己的文件目录。
五、磁盘
ASM磁盘是以AU为单位进行格式化的。第一个AU位于ASM磁盘的起始位置,即AU0,它始终用于存储ASM元数据。 一个元数据块的大小为4K ,有块头信息和与块类型相匹配的一些相关数据,AU0的第一个块, 即block0,就是ASM的磁盘头。
5.1 磁盘头
主要有以下数据项
属性 | 描述 |
kfdhdb.driver.provstr | 驱动类型,ASMLIB磁盘是 ORCLDISK+磁盘名,非ASMLIB磁盘是ORCLDISK |
kfdhdb.dsknum | ASM磁盘编号 |
kfdhdb.hdrsts | 磁盘头状态 共8种状态 KFDHDR_INVALID 0 Illegal value KFDHDR_UNKNOWN 1 Disk header block unreadable KFDHDR_CANDIDATE 2 No OSM or OS disk header found KFDHDR_MEMBER 3 Normal member of the group KFDHDR_FORMER 4 Disk dropped cleanly from group KFDHDR_CONFLICT 5 Header conflicts KFDHDR_INCOMPAT 6 Written by incompatible software KFDHDR_PROVISIONED 7 Disk was prepared beforehand |
kfdhdb.diskname | 磁盘名 |
kfdhdb.grpname | 磁盘组名 |
kfdhdb.fgname | 失败组名 |
kfdhdb.grptyp | 磁盘冗余级别:KFDGTP_EXTERNAL, KFDGTP_NORMAL, KFDGTP_HIGH |
kfdhdb.crestmp | 磁盘添加到磁盘组的时间 |
kfdhdb.mntstmp | 磁盘最近一次被挂接的时间 |
kfdhdb.dbcompat | 最小数据库兼容版本 |
kfdhdb.f1b1iocn | ASM文件目录1号文件所在的位置 |
kfdhdb.blksize | ASM元数据块的大小(bytes) |
kfdhdb.ausize | AU的大小,默认为1M |
kfdhdb.dsksize | 磁盘大小,以AU为单位 |
kfdhdb.secsize | 磁盘扇区大小(bytes) |
kfdhdb.fstiocn | 指向ASM的空闲空间表 |
kfdhdb.altiocn | 指向ASM的分配表 |
kfdhdb.grpstmp | 磁盘组创建时间 |
kfdhdb.vfstart | 表决磁盘(VD)文件开始的AU偏移量 |
kfdhdb.vfend | 表决磁盘文件结束的AU偏移量 |
kfdhdb.spfile | ASM spfile参数文件的AU号 本特性限于 11.2或更高版本 |
kfdhdb.spfflg | ASM spfile的标志位。如果值为1,那么ASM spfile就位于这个磁盘,AU号由kfdhdb.spfile指明 |
kfdhdb.mfact | 一个stride最多可以包含的AU数 |
磁盘头冗余备份
磁盘头块的信息会自动备份到AU1的倒数第二个ASM元数据块中。知道AU的块大小和ASM元数据块的大小后,就能找到倒数第二个块的块编号
5.2 Stride
磁盘容量有大有小,AT表的大小受限于AU的大小,所以需要将一个大的磁盘分成多个段,称之为Stride
5.3 AT分配表
AT表全称为Allocation Table。AT表记录每个AU的分配信息,开始于stride所在AU0的第二个块。由N个AT块组成,每一个AT块(4K)可以描述448个AU(kfdatb.shrink值),每一个AT表有254个块。这意味着一个AT表可以用来描述254*448= 113792个AU。这在ASM里被称为一个stride,一个stride可以描述的AU数量在ASM的磁盘头的kfdhdb.mfact。
5.4 FST空闲空间表
FST全称为Free Space Table。FST表记录了空闲的AU,用来加速AU的分配,避免读取已经完全被占用殆尽的AT块,造成分配空间效率的低下。FST表属于AT表的一部分,kfdhdb.fstlocn的值代表了FST块位于磁盘头的第几个块,一般位于AT表的块1。
AT表和FST表备份
FST表和AT表都是重要物理元数据,必须有备份。ASM会把0号AU的内容拷贝到11号AU,然后同时维护这两份副本
六、文件
ASM中所有的文件是根据冗余级别多副本存储,分布在不同的磁盘上。一个文件分成多段,条带化存储,每一段称为extent。所有文件的元数据存储在文件目录中,即1号文件,每个磁盘组有自己的文件目录。
6.1 文件目录
ASM的1号文件是ASM的文件目录,它记录了磁盘组中的所有文件信息。每一个磁盘组都是独立的存储单元,所以每一个磁盘组都会有属于它自己的文件目录。
每一个文件目录的条目都会包含如下的信息:
文件大小 |
文件块大小 |
文件类型 |
文件的冗余级别 |
文件的条带配置 |
前60个extent的位置指针 |
如果文件超过60个extent,那么会有Indirect extent 的指针 |
文件创建时间戳 |
文件最后的修改时间戳 |
指向ASM Alias目录的文件名 |
新增的ASM文件会分配到一个号码,这个号码是随着新增文件而顺序递增的。文件的号码与文件目录中的block号码也是完全对应的。比如文件目录的1号block描述了他自己也就是1号文件的信息。2号block是描述2号文件的。
1号文件元数据的位置
ASM磁盘头的kfdhdb.f1b1locn指定了一号文件所在的AU。如果kfdhdb.f1b1locn的值为0,代表这个磁盘并没有一号文件的拷贝。1号文件属于ASM的元数据,按冗余级别做多副本备份。
6.2 空间分配
一个文件由多个extent组成。HSM文件的空间分配是以extent为单位,每一个extent是由一个或多个AU组成。HSM空间分配的最小单位是AU,默认的AU size是1MB。但在Exadata下AU 的默认大小是4MB。ASM文件的空间分配是以extent为单位,每一个extent是由一个或多个AU组成,
• 在11.2版本,前20000个extent,每一个extent由1个AU组成,接下来的20000个extent,每一个由4个AU组成,再超出的extent,每一个由16个AU组成。这个特性被叫做可变extent。
• 而在11.1版本,extent的增长则遵循的是1-8-64倍AU的方式。
•在版本10,可变extent这个特性还没出现,因此所有的extent的大小都是1个AU
因为ASM文件目录块中,只能存放60个extent的条目,一旦超出这个值,那么就要有额外的地方来记录这个信息。
6.3 条带化
ASM文件条带化有两种类型:
细粒度条带化:条带粒度为128k,默认只有元数据和配置文件使用细粒度条带化。
粗粒度条带化:条带粒度为一个AU
粗粒度的条带化可以提供更高的吞吐量,而细粒度的条带化可以降低延迟。创建文件时可以指定锁使用的条带粒度。
七、重平衡
最开始ASM磁盘组分配空间时是均衡分布的,但系统运行一段时间后可能会出现某一块磁盘的IO过于集中的问题,即热点IO。这个时候需要IO重平衡rebalance,可以手动触发,有的情况下由ASM自动触发。
7.1 何时需要重平衡
1)添加、删除磁盘
2)负载不均衡
3)ASM磁盘组的磁盘上空间分布不均匀
4)移动一个文件从磁盘的hot区到cold区
7.2 如何重平衡
重平衡是以文件为基本操作单位的,主要由以下步骤:
1)rebalance plan,ASM会计算出重平衡的计划
2)更新COD(Continuing Operations Directory),当重平衡失败时,恢复后将根据COD启动重平衡
3) extent relocating,ASM会在磁盘组中的磁盘间移动文件,这个过程会花费大部分的时间
八、故障恢复
8.1 磁盘故障
一个磁盘不可用时会先被设置为offline状态,此时disk repair计时器开始介入,如果计时器达到磁盘组DISK_REPAIR_TIME(默认3.6h) 属性值时,这个磁盘会从所属的磁盘组中drop掉。如果这个磁盘在计时器过期前恢复可用,那么它的状态会变回online,不会被drop。当一个磁盘被drop,整个磁盘组需要为此进行rebalance,整个过程需要耗费大量的时间。在此期间,其他磁盘也可能会发生故障,使得数据丢失的风险大大增加。
为解决这个问题,在11gR1开始,ASM引入了fast disk resync特性。ASM不再立即drop不可用的磁盘,而是先置为offline状态。这样做的意义是能让ASM管理员被告知有磁盘发生故障后在disk repair time计时器到达阈值前修复故障。默认的disk repair计时器阈值是3.6小时。这个阈值是可以通过alter diskgroup命令来调整的。
在磁盘处于offline的这段时间里,ASM持续跟踪需要在offline磁盘上做的修改操作。如果磁盘在计时器到达阈值前恢复可用并且恢复到online状态,那么ASM会将这些修改操作应用到磁盘上去。如果在计时器到达阈值之前,磁盘故障不能解决,磁盘会被设置为drop状态。
8.2 坏块
企业级磁盘质保期一般是3年,随着磁盘使用年限增加故障率升高,可能会出现某一块数据读不出来的问题。ASM中PST,磁盘头,AT表,FST等元数据以及文件数据都有冗余备份机制,若出现读写失败的情况,则重新分配一个AU,将数据从其他副本复制过来,并且将读写异常的AU标记为已损坏。
九、校验检测
9.1 元数据校验
通过为ALTER DISKGROUP CHECK语句可以用来校验磁盘组元信息的内部一致性,可以指定在磁盘组、磁盘、文件、failgroup级别进行元信息一致性的校验,在校验过程中如果有错误信息,会记录在ASM的alert文件中,check语句一般会执行如下的操作:
1)检查磁盘的一致性
2)检查文件extent map和AT表之间的一致性
3)检查alias元信息目录和文件目录之间对应关系的正确性
4)检查alias目录树的正确性
5)检查ASM元信息目录是否有不可访问的块
我们可以在语句中添加repair或norepair关键字来指定ASM是否尝试修复检查过程中发生的错误,默认为norepair。
9.2 disk scrub
磁盘数据清理(disk scrubbing)是Oracle 12C ASM出现的新功能, ASM的磁盘清理通过校验不经常被读取的数据,提高了可用性和可靠性,对于磁盘组是normal和 high redundancy冗余模式的,磁盘清理会检查数据的逻辑错误,在发现后利用镜像磁盘进行错误的自动修复
十、后记
现在存储已经成为Oracle的一条产品线,Oracle为什么要花费巨大的时间精力去做存储模块?数据安全可靠与底层存储系统紧密相关,文件损坏,磁盘故障会导致数据库出现灾难性故障,而且在早期数据库故障中占比较高。早期的数据库系统重点关注数据管理,数据存储在系统内的文件系统中,要求更高的场景用专用的硬件存储设备保存数据,如raid卡,阵列柜。
实际生产中第三方存储是否能很好的解决数据的安全可靠问题呢?企业级的磁盘质保期一般是三年,电子类产品使用久了一般都会有老化,故障率升高的问题。专用存储设备一旦出问题需要厂家专业人员维修,购买阵列柜使用了几年后出问题,厂家能否快速响应?需要打个大问号。还有数据库的扩容、迁移等运维需求,第三方的存储能否很好的支持?成本方面是否可行?
ASM就是一种对用户来说简单通用且经济的方案。用通用的硬件,一般水平的运维人员即可。与oracle数据库自成一体,扩容、迁移无缝衔接,而且不需要支付额外的费用。




