ASM的数据冗余机制是通过将extent的镜像副本复制到同一磁盘组不同failgroup的磁盘上来实现的,这个磁盘被称为partner磁盘。在11GR2版本,一个冗余(Normal,High)的磁盘组,每一个ASM磁盘最多可以拥有8个partner磁盘,而在11GR2版本之前每一个磁盘最多拥有10个partner。在external冗余方式的磁盘组内既没有failgroup,磁盘之间也没有partner关系。其实可以通过隐含参数_asm_partner_target_disk_part来调整partner的数量。
如果正常冗余磁盘组有两个磁盘,他们就互为伙伴。磁盘0中的每个区的镜像会存储在磁盘1中,并且磁盘1中的每个区的镜像会存储在磁盘0中。因此每个磁盘都有一个伙伴磁盘。对于有3个磁盘的正常冗余磁盘组,如果在创建时没有手动指定故障磁盘组,那么每个磁盘将有两个伙伴磁盘。磁盘0的伙伴为磁盘1与磁盘2,磁盘1的伙伴为磁盘0与磁盘2,磁盘2的伙伴为磁盘0与磁盘1.当一个区存储在磁盘0上时,它的镜像副本将会存储在磁盘1或磁盘2上,但不是在磁盘1与磁盘2上都存在镜像副本。对于正常冗余磁盘,每个区有两个副本而不是三个。类似的,磁盘1上的一个区,它的镜像副本可能存储在磁盘0或磁盘2上,磁盘2上的一个区,它的镜像副本可能存储在磁盘0或磁盘1。对于存储元数据的区来说,如果故障磁盘组的数量大于三,那么在正常冗余磁盘组上会有三份副本。如果正常冗余磁盘组有大量磁盘,每个磁盘将有8个伙伴磁盘。这意味着任何磁盘上的一个区将会有一个镜像副本存储在它的8个伙伴磁盘中的一个磁盘上。对于正常冗余磁盘组来说,任何一个区只有一个镜像副本存储在它的一个伙伴磁盘上。
对于由3个磁盘所创建的high冗余磁盘组,每个磁盘将有两个伙伴磁盘。磁盘0的伙伴为磁盘1与磁盘2,磁盘1的伙伴为磁盘0与磁盘2,磁盘2的伙伴为磁盘0与磁盘1。磁盘0上的每个区的镜像将会存储磁盘1与磁盘2上。磁盘1上的每个区的镜像将会存储磁盘0与磁盘2上。
可以查询x$kfdpartner来找出关于磁盘伙伴关系的更多信息。
SQL> SELECT count(disk_number) FROM v$asm_disk WHERE group_number = 1; COUNT(DISK_NUMBER) ------------------ 14
查询结果显示磁盘组内包含的磁盘数量着实不少,接下来看单个磁盘拥有多少个partner
SQL> SELECT disk "Disk", count(number_kfdpartner) "Number of partners" FROM x$kfdpartner WHERE grp=1 GROUP BY disk ORDER BY 1; Disk Number of partners ---------- ------------------ 0 8 1 8 2 8 3 8 4 8 5 8 6 8 7 8 8 8 9 8 10 8 11 8 12 8 13 8 14 8 14 rows selected.
查询结果显示单个磁盘都准确的拥有8个partner磁盘
SQL> set pages 1000 SQL> break on Group# on Disk# SQL> SELECT d.group_number "Group#", d.disk_number "Disk#", p.number_kfdpartner "Partner disk#" FROM x$kfdpartner p, v$asm_disk d WHERE p.disk=d.disk_number and p.grp=d.group_number ORDER BY 1, 2, 3; Group# Disk# Partner disk# ---------- ---------- ------------- 1 0 1 3 5 6 7 9 11 14 1 2 3 4 5 6 8 12 13 ....
partner关系是在创建磁盘组时由ASM自动分配的,在每次添加和删除磁盘操作时会自动更新。磁盘之间的partner关系信息是记录在磁盘的partner关系状态表即PST表和磁盘目录中,这两项都是重要的ASM元数据结构。
SQL> select disk_number, name, path from v$asm_disk_stat where group_number = (select group_number from v$asm_diskgroup_stat where name='DATADG') order by disk_number asc; DISK_NUMBER NAME PATH ----------- ------------------------------ ------------------------------ 0 DATADG_0001 /dev/raw/raw11 1 DATADG_0003 /dev/raw/raw4 2 DATADG_0002 /dev/raw/raw3 3 DATADG_0000 /dev/raw/raw10
[grid@jyrac1 ~]$ kfed read /dev/raw/raw11 aun=1 blkn=0 | more kfbh.endian: 1 ; 0x000: 0x01 kfbh.hard: 130 ; 0x001: 0x82 kfbh.type: 17 ; 0x002: KFBTYP_PST_META kfbh.datfmt: 2 ; 0x003: 0x02 kfbh.block.blk: 256 ; 0x004: blk=256 kfbh.block.obj: 2147483648 ; 0x008: disk=0 kfbh.check: 465161100 ; 0x00c: 0x1bb9cb8c kfbh.fcn.base: 0 ; 0x010: 0x00000000 kfbh.fcn.wrap: 0 ; 0x014: 0x00000000 kfbh.spare1: 0 ; 0x018: 0x00000000 kfbh.spare2: 0 ; 0x01c: 0x00000000 kfdpHdrPairBv1.first.super.time.hi:33042831 ; 0x000: HOUR=0xf DAYS=0xc MNTH=0xc YEAR=0x7e0 kfdpHdrPairBv1.first.super.time.lo:2457171968 ; 0x004: USEC=0x0 MSEC=0x15e SECS=0x27 MINS=0x24 kfdpHdrPairBv1.first.super.last: 2 ; 0x008: 0x00000002 kfdpHdrPairBv1.first.super.next: 2 ; 0x00c: 0x00000002 kfdpHdrPairBv1.first.super.copyCnt: 3 ; 0x010: 0x03 kfdpHdrPairBv1.first.super.version: 1 ; 0x011: 0x01 kfdpHdrPairBv1.first.super.ub2spare: 0 ; 0x012: 0x0000 kfdpHdrPairBv1.first.super.incarn: 1 ; 0x014: 0x00000001 kfdpHdrPairBv1.first.super.copy[0]: 0 ; 0x018: 0x0000 kfdpHdrPairBv1.first.super.copy[1]: 1 ; 0x01a: 0x0001 kfdpHdrPairBv1.first.super.copy[2]: 2 ; 0x01c: 0x0002 kfdpHdrPairBv1.first.super.copy[3]: 0 ; 0x01e: 0x0000 kfdpHdrPairBv1.first.super.copy[4]: 0 ; 0x020: 0x0000 kfdpHdrPairBv1.first.super.dtaSz: 4 ; 0x022: 0x0004 kfdpHdrPairBv1.first.asmCompat:186646528 ; 0x024: 0x0b200000 kfdpHdrPairBv1.first.newCopy[0]: 0 ; 0x028: 0x0000 kfdpHdrPairBv1.first.newCopy[1]: 0 ; 0x02a: 0x0000 kfdpHdrPairBv1.first.newCopy[2]: 0 ; 0x02c: 0x0000 kfdpHdrPairBv1.first.newCopy[3]: 0 ; 0x02e: 0x0000 kfdpHdrPairBv1.first.newCopy[4]: 0 ; 0x030: 0x0000 kfdpHdrPairBv1.first.newCopyCnt: 0 ; 0x032: 0x00 kfdpHdrPairBv1.first.contType: 1 ; 0x033: 0x01 kfdpHdrPairBv1.first.spare0: 0 ; 0x034: 0x00000000 kfdpHdrPairBv1.first.ppat[0]: 0 ; 0x038: 0x0000 kfdpHdrPairBv1.first.ppat[1]: 0 ; 0x03a: 0x0000 kfdpHdrPairBv1.first.ppat[2]: 0 ; 0x03c: 0x0000 kfdpHdrPairBv1.first.ppat[3]: 0 ; 0x03e: 0x0000 kfdpHdrPairBv1.first.ppatsz: 0 ; 0x040: 0x00 kfdpHdrPairBv1.first.spare1: 0 ; 0x041: 0x00 kfdpHdrPairBv1.first.spare2: 0 ; 0x042: 0x0000 kfdpHdrPairBv1.first.spares[0]: 0 ; 0x044: 0x00000000 kfdpHdrPairBv1.first.spares[1]: 0 ; 0x048: 0x00000000 kfdpHdrPairBv1.first.spares[2]: 0 ; 0x04c: 0x00000000
信息kfdpHdrPairBv1.first.super.copyCnt: 3 ; 0x010: 0x03说明存在3个PST副本,说明在磁盘0,1和2上有pst的副本(kfdpHdrPairBv1.first.super.copy
[0],kfdpHdrPairBv1.first.super.copy[1]和kfdpHdrPairBv1.first.super.copy[2]处有值)
[grid@jyrac1 ~]$ kfed read /dev/raw/raw11 aun=1 blkn=3 | more
kfbh.endian: 1 ; 0x000: 0x01
kfbh.hard: 130 ; 0x001: 0x82
kfbh.type: 18 ; 0x002: KFBTYP_PST_DTA
kfbh.datfmt: 2 ; 0x003: 0x02
kfbh.block.blk: 259 ; 0x004: blk=259
kfbh.block.obj: 2147483648 ; 0x008: disk=0
kfbh.check: 2182382336 ; 0x00c: 0x82148300
kfbh.fcn.base: 0 ; 0x010: 0x00000000
kfbh.fcn.wrap: 0 ; 0x014: 0x00000000
kfbh.spare1: 0 ; 0x018: 0x00000000
kfbh.spare2: 0 ; 0x01c: 0x00000000
kfdpDtaEv1[0].status: 127 ; 0x000: I=1 V=1 V=1 P=1 P=1 A=1 D=1
kfdpDtaEv1[0].fgNum: 1 ; 0x002: 0x0001
kfdpDtaEv1[0].addTs: 2199451943 ; 0x004: 0x8318f927
kfdpDtaEv1[0].partner[0]: 49154 ; 0x008: P=1 P=1 PART=0x2
kfdpDtaEv1[0].partner[1]: 49153 ; 0x00a: P=1 P=1 PART=0x1
kfdpDtaEv1[0].partner[2]: 49155 ; 0x00c: P=1 P=1 PART=0x3
以上输出代表磁盘0(kfdpDtaEv1[0])所在failgroup号为1,它有3个partner磁盘,分别为PART=0x2,PART=0x1,PART=0x3,也就是磁盘号2(/dev/raw/raw3),1(/dev/raw/raw4),3
(/dev/raw/raw10)