天天看点

Oracle ASM 翻译系列第一弹:基础知识 ASM AU,Extents,Mirroring 和 Failgroups

在asm磁盘组中,最基本空间分配单位是allocation unit,简称au,每个asm的磁盘在初始化后都会被切割成一个一个的au。

当磁盘组创建时,可以通过设置au_size的属性值,来指定au的大小(在11.1版本以后),au的大小可以是1,2,4,8,16,32,64mb,如果不指定au的大小,默认值是1mb(exadata下为4mb)。

au size是磁盘组的属性(不是磁盘的属性,不是asm实例的属性),因此每一个asm磁盘组都可以有自己的au size值。

asm extents

一个或多个au组成一个extent,一个或多个asm extent组成了一个asm的文件,因此一个asm文件逻辑上是由extent组成的。

我们需要区分物理extent和虚拟extent,一个虚拟extent或者说extent set,在外部冗余的磁盘组中,是由一个物理extent组成,在normal冗余的磁盘组中,是由至少2个物理extent组成,在一个high冗余的磁盘组中,由至少3个物理extent组成。

在asm 11.1版本之前,extent的大小是固定的,在asm 11.1版本之后,出现了可变extent,可变extent的出现是为了更好的支持大数据文件,减少对asm和数据库实例的sga要求、提升创建文件和打开文件等操作的性能,初始化的extent大小等于磁盘组的au_size设定值,随着一个文件分配的extent越来越多,extent的size会按照4或16倍的au_size增大。这个特性在文件新建或者resize的时候自动起作用,当然asm磁盘组的属性值compatible.asm 和compatible.rdbms要设置为大于等于11.1。

一个文件的extent大小变化规律遵循如下方式:

一个文件的前20000个extent set,extent的size等于磁盘组的au_size的设定值。

接下来的20000个extent set,extent的size等于磁盘组的au_size*4。

如果一个文件的总extent set数多于40000个,那么后面所有的extent的size等于磁盘组的au_size*16。

这个可变extent特性有一个烦人的bug 8898852,更多信息可以参考mos 965751.1。

译者注:我很怀疑可变extent能起到的效果,因为大部分用户添加数据文件时,一般会指定数据文件的大小,假如au_size设置成1m,那么只有大于20g的数据文件才会有一些extent的大小为4mb,而就我接触到的dba来说,可能大部分dba都会把数据文件的大小设置成20g左右。还有就是虽然oracle中有bigfile表空间,但是用的人并不多。

asm mirroring

asm的数据镜像功能用来保护数据的完整性,它是通过对一份数据在不同的磁盘多存储一份数据副本来做到这一点。当一个asm的磁盘组被创建时,asm管理员可以指定磁盘组的镜像方式:

· external – 不提供镜像保护

· normal – 2副本

· high – 3副本

asm镜像的粒度是extent而非磁盘或者block,asm中的镜像是通过对组成的每一个asm文件的extent做镜像来实现的。在asm中,我们可以指定每个文件的冗余级别。例如,一个在normal冗余的磁盘组中的文件,它的每一个extent可能会被镜像一次(默认行为),另一个文件,在相同的磁盘组,可能会被镜像二次,也就是三副本(假设磁盘组中至少有3个failgroup),事实上,asm元数据文件在normal冗余的磁盘组中就是做的三副本,这里同样需要磁盘组中至少要有3个failgroup。

译者注:在normal冗余的磁盘组中,会有文件被镜像两次,也就是三副本,对于这点不必怀疑,这些文件都是asm的元数据文件,在后续的文章中,我们会多次看到这种现象。

asm failgroups

一个asm磁盘组可以逻辑上被划分为一个一个的failgroup,failgroup需要在磁盘组创建指定,如果我们在创建磁盘组时,不指定failgroup ,那么asm会自动把每一个磁盘作为一个failgroup,这一点可能在exadata上会不一样,exadata 下所有来自相同存储节点的磁盘会自动放入到一个failgroup ,即使你没有指定failgroup。

normal冗余的磁盘组要求至少2个failgroup,high冗余的磁盘组要求至少3个failgroup,external冗余模式的磁盘组不要求有failgroup。

当一个extent分配给一个具有双副本的文件时,asm会分配一个primary copy 和 一个 mirror copy,primary copy存储在一个磁盘,而mirror copy会存储在另外一个不同failgroup的磁盘上。

当向asm磁盘组添加磁盘时,failgroup可以手工指定,asm会智能的把磁盘添加到正确的failgroup中。

<b>本文来自云栖社区合作伙伴“dbgeek”</b>