ASM 翻译系列第四十弹:理解ASM中 REQUIRED_MIRROR_FREE_MB和USABLE_FILE_MB的含义

原作者: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

REQUIRED_MIRROR_FREE_MB and USABLE_FILE_MB in external redundancy disk groups

我们先从创建一个外部冗余的磁盘组开始,这里使用到了我们上面列出的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

REQUIRED_MIRROR_FREE_MB and USABLE_FILE_MB in high redundancy disk groups

我们已经讨论了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

In summary

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,这下子是不是很清晰了?

原文发布于微信公众号 - 沃趣科技(woqutech)

原文发表时间:2017-03-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏pangguoming

简单的Hibernate入门简介

其实Hibernate本身是个独立的框架,它不需要任何web server或application server的支持。然而,大多数的Hibernate入门介绍...

37590
来自专栏向治洪

Android NDk环境配置

概论 NDK全称是Native Development Kit,NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应...

215100
来自专栏码神联盟

重磅来袭,抱歉,来晚啦

来一波 、基本概念 1.1、spring Spring 是一个开源框架, Spring 是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Ro...

366110
来自专栏乐沙弥的世界

Linux下基于源码方式安装MySQL 5.6

    MySQL为开源数据库,因此可以基于源码实现安装。基于源码安装有更多的灵活性。也就是说我们可以针对自己的硬件平台选用合适的编译器来优化编译后的二进制代码...

11510
来自专栏Java3y

Druid数据库连接池就是这么简单

前言 本章节主要讲解Druid数据库连接池,为什么要学Druid数据库连接池呢?? 我的知识储备数据库连接池有两种->C3P0,DBCP,可是现在看起来并不够用...

558110
来自专栏JavaQ

深入Spring Boot (十):整合Mybatis框架详解

Spring Boot整合Mybatis支持XML配置和全注解两种方式,本篇将详细解说这两种方式的Mybatis整合,主要包含以下5部分内容: 数据源配置; 数...

50790
来自专栏安富莱嵌入式技术分享

【RL-TCPnet网络教程】第9章 RL-TCPnet网络协议栈移植(uCOS-III)

本章教程为大家讲解RL-TCPnet网络协议栈的uCOS-III操作系统移植方式,学习了第6章讲解的底层驱动接口函数之后,移植就比较容易了,主要是添加库文件、配...

11530
来自专栏10km的专栏

linux下用cmake对caffe静态编译时-static-libstdc++参数无效的问题

以下是用于cmake 生成 Makefile文件对Caffe进行静态库连接编译的shell脚本, #!/bin/bash # cmake 静态编译 caffe-...

1.1K60
来自专栏码神联盟

框架 | SpringBoot项目发布部署外部tomcat服务器步骤

1.8K20
来自专栏编程直播室

Spring Boot 之 Spring Data JPA(一)1、新建工程2、配置数据库3、代码结构4、从数据到逻辑总结

53050

扫码关注云+社区

领取腾讯云代金券