ASM中fast mirror resync的实现方式

在《Pro Oracle Database 11g RAC on Linux》书中简短提到一句:

If the disk error is transient, and the failed disk can be brought online again within a time threshold, the Fast Mirror Resync feature can help speed up the resynchronization operation. The requirement is to have a disk group with COMPATIBLE.RDBMS set to ≥ 11.1, and optionally a DISK_REPAIR_TIME. A so-called Staleness Registry keeps track of changes to the AUs within the offline disk. When the disk is brought online again, the Staleness Registry is used to recover the contents of the disk.

这里提到了fast mirror resync的Staleness Registry

事实上我看到这句的时候并不知道该怎么验证。Staleness Registry是关键字,我想,按照ASM的理念“一切都是文件”,是不是会存在文件号来标识这个东西呢。

于是我loop+kfed去读1号文件(file directory)的前256个块。这句很重要。而且你如果想复现的话,你必须保证你的磁盘组是normal或者high冗余,并且要手工触发一次某个磁盘的offline,你才能看到12和254文件,不然是空的。所有读到kfffde[0].xptr.au不是4294967295的AU都拿出来,再用kfed读一遍。(这个工作量很大加上我又不会写程序)。我的环境是AU10是1号文件,遍历下来,会发现type 20和21是KFBTYP_SR和KFBTYP_STALEDIR,SR就是staleness registry的缩写,其实到这里就卡住了,于是google搜了一下这两个文件。结果很显然会指向:

http://asmsupportguy.blogspot.com/2012/01/asm-files-number-12-and-254.html

ASM Support Guy

发现这是个大神,感觉之前的kfed都白折腾了。。。不开心。

他说ASM元数据的12和254号文件是用来实现ASM Fast Mirror Resync的。这。。。我这。。。我还继续写吗。。。

既然是12号和254号文件,就把他们搞出来看看是啥。两种方法,一种是kfed去读1号文件的12和254号块,来定位是哪个磁盘的哪个AU,另外一种是查询x$kffxp这个内存视图。本次用这个视图。

得到的结果如下:

12号文件:

254号文件:

获取磁盘名和真实路径对应关系

所以,我们要用kfed读的12号文件是,/dev/mapper/data01的AU9。要读的254号文件有0到12共13个AU。我的AU是4M,那就是52M。有点大啊这个元数据。

为了看到实际写的数据是什么,我手工offline掉一个磁盘,让fast mirror resync开始工作,然后关掉Grid,开始读这些元数据看看能不能看懂是啥。。。

日志如下:

这个43200秒就是disk repair time的12小时。fast mirror 开始工作了。

接下来在数据库中创建一个数据文件。以次来构造变化。

注意,这个文件是277号文件。我们查看他的AU分布:

可以看到这个8M的文件,分配了三个AU,AU是4M,因为ASM要附加一个block size的文件头,就是8M+8192K,所以要分配三个AU。

关掉数据库和Grid。

kfed读取12号文件,根据前文查出来的AU分布:

尴尬,看不懂后面的fdsde.indices是什么意思,不过看是0到4,应该是指向了磁盘组剩余的5个盘。

重点是254号文件,我们之前查到的254号文件的AU分布,拿kfed读出来如下:

为了证明这些标识是记录了文件AU分布变化的,将这个磁盘online之后看这些标识是否会变化:

在磁盘online之后,ASM清除了这些标志位。说明fast mirror resync之后,这些标志位也没有意义了。

磁盘online的日志如下,信息量非常大:

One thought on “ASM中fast mirror resync的实现方式

发表评论