原作者:Harald van Breederode
译者: 魏兴华
审核: 魏兴华
DBGeeK社区联合出品
原文链接:https://prutser.wordpress.com/2013/01/03/demystifying-asm-required_mirror_free_mb-and-usable_file_mb/
在我的课上一个经常被问到的问题是ASM如何计算磁盘组REQUIRED_MIRROR_FREE_MB和USABLE_FILE_MB的值,这个问题的答案跟很多复杂问题的答案一样:要看情况。
简单来说,视图V$ASM_DISKGROUP中的REQUIRED_MIRROR_FREE_MB值代表了如果ASM磁盘或ASM磁盘组出现了故障,要重新满足冗余度的定义,要求有多少的空闲空间。USABLE_FILE_MB的值代表了在满足冗余度之后,还有多少的剩余空间可以用。
问题是:ASM怎么计算出这些值的?
问题的答案可以通过创建一些不同配置的磁盘组,然后观察视图V$ASM_DISKGROUP中的REQUIRED_MIRROR_FREE_MB 和 USABLE_FILE_MB。为了找到答案,我们仅仅只需要一些磁盘而已。
ASM> select label,os_mb from v$asm_disk 2 where label like 'SAN%' order by label; LABEL OS_MB ------------------------------- ---------- SAN01 255 SAN02 255 SAN03 255 SAN04 255 SAN05 255 SAN06 255
我们先从创建一个外部冗余的磁盘组开始,这里使用到了我们上面列出的6块盘,每个盘的大小是255MB:
ASM> create diskgroup demo external redundancy 2 disk 'ORCL:san01' 3 disk 'ORCL:san02' 4 disk 'ORCL:san03' 5 disk 'ORCL:san04' 6 disk 'ORCL:san05' 7 disk 'ORCL:san06' 8 attribute 'compatible.asm' = '11.2.0.0.0'; Diskgroup created.
我们查询视图V$ASM_DISKGROUP中的几个列来获得磁盘组的相关信息:
ASM> select name, state, type, total_mb, free_mb, REQUIRED/_MIRROR/_FREE/_MB req_free, USABLE/_FILE/_MB use_mb 2 from v$asm_diskgroup where name = 'DEMO'; NAME STATE TYPE TOTAL_MB FREE_MB REQ_FREE USE_MB ---------- ----------- ------ ---------- ------- -------- ------ DEMO MOUNTED EXTERN 1530 1468 0 1468
以上输出显示了磁盘组的总大小为1530MB(TOTAL_MB),其中1468MB(FREE_MB)是空闲的空间,由于这是一个外部冗余的磁盘组,因此所有的空闲空间都可以用来存放文件,USABLE_FILE_MB列的值也显示了这一点,REQUIRED_MIRROR_FREE_MB的值为0。
注意:缺少的62MB被使用来存放ASM的元数据。
REQUIRED_MIRROR_FREE_MB and USABLE_FILE_MB in normal redundancy disk groups
接下来我们创建一个normal冗余的磁盘组,磁盘组共有6块磁盘,每一个盘是一个独立的failgroup。
ASM> create diskgroup demo normal redundancy 2 failgroup FG1 disk 3 'ORCL:san01' 4 failgroup FG2 disk 5 'ORCL:san02' 6 failgroup FG3 disk 7 'ORCL:san03' 8 failgroup FG4 disk 9 'ORCL:san04' 10 failgroup FG5 disk 11 'ORCL:san05' 12 failgroup FG6 disk 13 'ORCL:san06' 14 attribute 'compatible.asm' = '11.2.0.0.0'; Diskgroup created.
ASM在磁盘组内使用failgroup来提供数据的镜像和冗余,数据被存储在一个failgroup的同时,会自另外的failgroup中存储相同的数据副本,以此来保障数据的安全,在一个normal冗余的磁盘组中,一个failgroup出现故障并不会影响整个磁盘组的可用性,ASM还可以根据镜像数据让磁盘组重新达到normal冗余的要求,但是为了能做到这一点,需要磁盘组有足够的剩余空间,因此一个failgroup实际有多大就显得非常的重要。
ASM> select failgroup,sum(total_mb) from v$asm_disk 2 where label like 'SAN%' group by failgroup order by failgroup; FAILGROUP SUM(TOTAL_MB) ------------------------------ ------------- FG1 255 FG2 255 FG3 255 FG4 255 FG5 255 FG6 255
上面输出显示每一个failgroup的的总大小都是255MB,我们看下它如何影响剩余空间的要求以及它如何影响可用的文件空间。
ASM> select name, state, type, total_mb, free_mb, REQUIRED/_MIRROR/_FREE/_MB req_free, USABLE/_FILE/_MB use_mb 2 from v$asm_diskgroup where name = 'DEMO'; NAME STATE TYPE TOTAL_MB FREE_MB REQ_FREE USE_MB ---------- ----------- ------ ---------- ------- -------- ------ DEMO MOUNTED NORMAL 1530 1365 255 555
上面输出显示了,为了能够在磁盘组的一个failgroup出现故障后能够重新满足磁盘组冗余度的要求,需要有255MB的剩余空间(REQUIRED_MIRROR_FREE_MB)。255这个数值是磁盘组的一个failgroup的大小,如果磁盘组里的failgroup的大小不等,那么ASM会自动选择具有最大空间的failgroup。
上面的输出也显示了我们还可以使用555MB的空间来存放文件,这个值是按照如下公式计算出来的:
ASM> select trunc((free_mb - REQUIRED/_MIRROR/_FREE/_MB) / 2) as useable 2 from v$asm_diskgroup where name='DEMO'; USEABLE ---------- 555
上面的公式翻译过来就是:总的可用空间等于总的剩余空间减去REQUIRED_MIRROR_FREE_MB后的值再除以磁盘组的冗余度,这里normal冗余也就是要除以2。REQUIRED_MIRROR_FREE_MB的含义我们上面已经提到过:为了能够在磁盘组的一个failgroup出现故障后能够重新满足磁盘组冗余度的要求而需要的空间。
由于可用空间的公式中的free_mb的值是动态变化的,例如新增了文件或文件做了resize等操作都会影响磁盘组的剩余空间,因此磁盘组的可用空间也是动态变化的,这一点可用通过一个简单的例子加以说明:
SQL> create tablespace foo datafile '+DEMO' size 200m; Tablespace created. ASM> select name, state, type, total_mb, free_mb, REQUIRED/_MIRROR/_FREE/_MB req_free, USABLE/_FILE/_MB use_mb 2 from v$asm_diskgroup where name = 'DEMO'; NAME STATE TYPE TOTAL_MB FREE_MB REQ_FREE USE_MB ---------- ----------- ------ ---------- ------- -------- ------ DEMO MOUNTED NORMAL 1530 939 255 342
由于我们往磁盘组中新增加了一个200MB的数据文件,导致了磁盘组的可用空间减少了,从555MB减少到了342MB。
SQL> alter tablespace foo add datafile '+DEMO' size 200m; Tablespace altered. ASM> select name, state, type, total_mb, free_mb, REQUIRED/_MIRROR/_FREE/_MB req_free, USABLE/_FILE/_MB use_mb 2 from v$asm_diskgroup where name = 'DEMO'; NAME STATE TYPE TOTAL_MB FREE_MB REQ_FREE USE_MB ---------- ----------- ------ ---------- ------- -------- ------ DEMO MOUNTED NORMAL 1530 534 255 139
在又新增了一个数据文件后,如预期,可用的空间又进一步减少了,减少的空间略微的大于实际新增的文件size,现在可用空间只剩下139MB了,我们再新增一个200MB的数据文件会怎么样?
SQL> alter tablespace foo add datafile '+DEMO' size 200m; Tablespace altered.
尽管ASM显示了仅仅只有139MB的可用空间,但是我们确实又成功的创建了一个大小为200MB的数据文件,因此这里需要强调,ASM并不会强制预留出REQUIRED_MIRROR_FREE_MB所指示的空间。
ASM> select name, state, type, total_mb, free_mb, REQUIRED/_MIRROR/_FREE/_MB req_free, USABLE/_FILE/_MB use_mb 2 from v$asm_diskgroup where name = 'DEMO'; NAME STATE TYPE TOTAL_MB FREE_MB REQ_FREE USE_MB ---------- ----------- ------ ---------- ------- -------- ------ DEMO MOUNTED NORMAL 1530 129 255 -63
USABLE_FILE_MB的值已经变为了负数,这意味着如果我们遭遇了故障ASM有可能会没有足够的剩余空间来重新满足冗余度的要求,因此监控USABLE_FILE_MB的值非常的重要,如果某个磁盘组的USABLE_FILE_MB值变为了负数,你应该增加磁盘组的空间或者释放出一些空间出来。现在我们删除掉这个表空间看看:
SQL> drop tablespace foo; Tablespace dropped.
现在我们创建另一个normal冗余的磁盘组,这次仅仅只创建3个failgroup,每一个failgroup包含了2个磁盘(之前创建的磁盘组包含了6个failgroup,每一个磁盘是一个failgroup):
ASM> create diskgroup demo normal redundancy 2 failgroup FG1 disk 3 'ORCL:san01', 4 'ORCL:san02' 5 failgroup FG2 disk 6 'ORCL:san03', 7 'ORCL:san04' 8 failgroup FG3 disk 9 'ORCL:san05', 10 'ORCL:san06' 11 attribute 'compatible.asm' = '11.2.0.0.0'; Diskgroup created.
在磁盘组成功创建后,我们再来看下failgroup的大小:
ASM> select failgroup,sum(total_mb) from v$asm_disk 2 where label like 'SAN%' group by failgroup order by failgroup; FAILGROUP SUM(TOTAL_MB) ------------------------------ ------------- FG1 510 FG2 510 FG3 510
三个failgroup的大小都是510MB,我们再来看下视图V$ASM_DISKGROUP中相关列的情况:
ASM> select name, state, type, total_mb, free_mb, REQUIRED/_MIRROR/_FREE/_MB req_free, USABLE/_FILE/_MB use_mb 2 from v$asm_diskgroup where name = 'DEMO'; NAME STATE TYPE TOTAL_MB FREE_MB REQ_FREE USE_MB ---------- ----------- ------ ---------- ------- -------- ------ DEMO MOUNTED NORMAL 1530 1365 510 427
跟预期一样,REQUIRED_MIRROR_FREE_MB的值为510,等于磁盘组中最大的failgroup的大小,USABLE_FILE_MB的值为427,就像之前已经提到过的,它的值根据以下公式计算而来:
ASM> select trunc((free_mb - REQUIRED/_MIRROR/_FREE/_MB) / 2) as useable 2 from v$asm_diskgroup where name='DEMO'; USEABLE ---------- 427
接下来,我们继续创建一个normal冗余的磁盘组,这一次只有2个failgroup,每个failgroup中有3个磁盘:
ASM> create diskgroup demo normal redundancy 2 failgroup FG1 disk 3 'ORCL:san01', 4 'ORCL:san02', 5 'ORCL:san03' 6 failgroup FG2 disk 7 'ORCL:san04', 8 'ORCL:san05', 9 'ORCL:san06' 10 attribute 'compatible.asm' = '11.2.0.0.0'; Diskgroup created.
同样,我们看下磁盘组中每一个failgroup的大小:
ASM> select failgroup,sum(total_mb) from v$asm_disk 2 where label like 'SAN%' group by failgroup order by failgroup; FAILGROUP SUM(TOTAL_MB) ------------------------------ ------------- FG1 765 FG2 765
两个failgroup的大小都等于765MB,同样查看视图v$asm_diskgroup相关字段的值:
ASM> select name, state, type, total_mb, free_mb, REQUIRED/_MIRROR/_FREE/_MB req_free, USABLE/_FILE/_MB use_mb 2 from v$asm_diskgroup where name = 'DEMO'; NAME STATE TYPE TOTAL_MB FREE_MB REQ_FREE USE_MB ---------- ----------- ------ ---------- ------- -------- ------ DEMO MOUNTED NORMAL 1530 1416 255 580
这次的结果有点出乎意料,REQUIRED_MIRROR_FREE_MB的值仅仅只有255MB,而不是765MB(failgroup的大小),显然,ASM只一次只是给了一个磁盘的大小作为REQUIRED_MIRROR_FREE_MB的值,而不是整个failgroup的大小。
道理在哪里?就像文章开头提出的,ASM会在不同的failgroup中存储镜像数据,一个normal冗余的磁盘组要求至少有2个failgroup,一个high冗余的磁盘组要求至少3个failgroup,如果具有2个failgroup的normal冗余磁盘组,其中一个failgroup发生了故障,那么这个磁盘组如何重新满足冗余度的要求?不能!因此这种情况下,ASM仅仅给出了一个磁盘的大小作为REQUIRED_MIRROR_FREE_MB的值。
同理,我们可以根据公式计算出USABLE_FILE_MB的值:
ASM> select trunc((free_mb - REQUIRED/_MIRROR/_FREE/_MB) / 2) as useable 2 from v$asm_diskgroup where name='DEMO'; USEABLE ---------- 580
我们已经讨论了external和normal冗余的磁盘组,我们接下来看high冗余的磁盘组的情况。首先,我们需要创建一high冗余度的磁盘组,磁盘组中的盘还是我们上面使用的6块磁盘,每一个盘是一个单独的failgroup:
ASM> create diskgroup demo high redundancy 2 failgroup FG1 disk 3 'ORCL:san01' 4 failgroup FG2 disk 5 'ORCL:san02' 6 failgroup FG3 disk 7 'ORCL:san03' 8 failgroup FG4 disk 9 'ORCL:san04' 10 failgroup FG5 disk 11 'ORCL:san05' 12 failgroup FG6 disk 13 'ORCL:san06' 14 attribute 'compatible.asm' = '11.2.0.0.0'; Diskgroup created. ASM> select failgroup,sum(total_mb) from v$asm_disk 2 where label like 'SAN%' group by failgroup order by failgroup; FAILGROUP SUM(TOTAL_MB) ------------------------------ ------------- FG1 255 FG2 255 FG3 255 FG4 255 FG5 255 FG6 255
如预期,所有的failgroup的大小都是255MB,REQUIRED_MIRROR_FREE_MB和USABLE_FILE_MB的值的计算方法在normal冗余和high冗余下是不是一样的呢?我们来看一下:
ASM> select name, state, type, total_mb, free_mb, REQUIRED/_MIRROR/_FREE/_MB req_free, USABLE/_FILE/_MB use_mb 2 from v$asm_diskgroup where name = 'DEMO'; NAME STATE TYPE TOTAL_MB FREE_MB REQ_FREE USE_MB ---------- ----------- ------ ---------- ------- -------- ------ DEMO MOUNTED HIGH 1530 1365 510 285
REQUIRED_MIRROR_FREE_MB的值为510MB,等于2个failgroup的大小(如果磁盘组中failgroup的大小不一样,会取两个最大的failgroup大小),这是因为一个high冗余的磁盘组需要能够容忍丢失2个failgroup而不影响数据的可用性
USABLE_FILE_MB的值为285,按照如下公式计算而来:
ASM> select trunc((free_mb - REQUIRED/_MIRROR/_FREE/_MB) / 3) as useable 2 from v$asm_diskgroup where name='DEMO'; USEABLE ---------- 285
最后我们创建另一个high冗余的磁盘组,一共3个磁盘组,每2个磁盘一个failgroup:
ASM> create diskgroup demo high redundancy 2 failgroup FG1 disk 3 'ORCL:san01', 4 'ORCL:san02' 5 failgroup FG2 disk 6 'ORCL:san03', 7 'ORCL:san04' 8 failgroup FG3 disk 9 'ORCL:san05', 10 'ORCL:san06' 11 attribute 'compatible.asm' = '11.2.0.0.0'; Diskgroup created. ASM> select failgroup,sum(total_mb) from v$asm_disk 2 where label like 'SAN%' group by failgroup order by failgroup; FAILGROUP SUM(TOTAL_MB) ------------------------------ ------------- FG1 510 FG2 510 FG3 510
上面的输出应该不需要我过多解释,一切都符合我们的预期,如果上面所写的所有内容你都已经充分理解,那么下面查询内容的输出不应该让你惊讶:
ASM> select name, state, type, total_mb, free_mb, REQUIRED/_MIRROR/_FREE/_MB req_free, USABLE/_FILE/_MB use_mb 2 from v$asm_diskgroup where name = 'DEMO'; NAME STATE TYPE TOTAL_MB FREE_MB REQ_FREE USE_MB ---------- ----------- ------ ---------- ------- -------- ------ DEMO MOUNTED HIGH 1530 1365 510 285
REQUIRED_MIRROR_FREE_MB的值为510MB,它其实是2个磁盘的大小,而不是一个failgroup的大小,理由跟normal冗余具有2个failgroup的磁盘组一样,这一次我们的磁盘组是high冗余三个failgroup,如果一个或两个failgroup丢失,ASM不能够重新满足冗余度的要求。
下面的是用来计算USABLE_FILE_MB的值的公式:
ASM> select trunc((free_mb - REQUIRED/_MIRROR/_FREE/_MB) / 3) as useable 2 from v$asm_diskgroup where name='DEMO'; USEABLE ---------- 285
REQUIRED_MIRROR_FREE_MB的值代表了ASM用来重新满足磁盘组定义的冗余度所需要的空间,这个值的大小依赖于磁盘组的冗余度和failgroup的数量。
具有3个failgroup的normal冗余磁盘组,REQUIRED_MIRROR_FREE_MB的值等于一个failgroup的大小,如果 normal冗余的磁盘组只有2个failgroup,那么REQUIRED_MIRROR_FREE_MB的值将等于一个磁盘的大小而非一个failgroup的大小。
具有4个failgroup的high冗余磁盘组,REQUIRED_MIRROR_FREE_MB的值等于2个failgroup的大小,如high冗余的磁盘组只有3个failgroup,那么REQUIRED_MIRROR_FREE_MB的值将会是两个磁盘的大小。
USABLE_FILE_MB的值代表了总的可用来存储数据的空间,它的值依赖磁盘组的大小,磁盘组的冗余度和REQUIRED_MIRROR_FREE_MB的值,USABLE_FILE_MB的值的计算方法如下:
USABLE/_FILE/_MB = (FREE_MB – REQUIRED/_MIRROR/_FREE/_MB) / [2|3]
译者注: 下图中代表一个具有3个failgroup的Normal冗余的磁盘组。其中每个failgroup:F代表free的空间 ,U代表已经使用的空间。
那么根据上面的假设很容易推断: (F+U)=一个failgroup的大小 那么3F+3U=总的磁盘组的大小
那么当前磁盘组的剩余可用空间是多少呢?
非常好计算=总的磁盘组的大小-3U
接着,毁坏一个failgroup后剩余多少可用空间?
这里我们为了比较容易理解,继续把这个步骤切成两步: (总空间-3U)-F ,这个值一个failgroup毁坏后,剩余的空间,这个剩余空间还没考虑这个failgroup上已经使用的空间做RB的所需要的空间。
但是为了满足 冗余度的要求,还是要把U这部分空间给RB掉,那么就是:
(总空间-3U)-F-U,我们做一个转换也就是 (总空间-3U)-(F +U)=Free-一个failgroup大小,最终再根据冗余度除以2或着3,这下子是不是很清晰了?