技术开发 频道

管理Oracle RAC中的存储

    5、ASM管理——disk groups和disks

    1)ASM disk group

    它作为管理一组disks集合的一个逻辑单元。ASM disks存储被从disk groups中添加和删除。每个ASM disk有一个ASM disk name,这个name对于对于cluster中的所有nodes都是一致的。ASM disk name的提取是十分必要的,因为对于不同主机可能使用不同的OS命名参照相同的disk。

    ASM总是以1MB的AU块均匀的在一个disk group中的所有disks中分配文件。这被称为粗糙分带(COARSE striping)。这样ASM就避免了手工调节disk的需要。然而,在一个disk group中的disks应该有相同的size和性能特征,以便获得I/O调节的非常好的化。

    一般情况下只有少量disk groups,例如,一个disk group用于work area,另一个作为回复area。

    对于要求较低等待的files,ASM提供了细粒度fine-grained(128 KB)striping。FINE striping对每个AU继续划分。FINE striping将中级的I/O操作划分为多个小规模的I/O操作进行并发执行。

    当files和disks增长的时候,只需管理不变数量的disk groups。从Database的角度看,disk group可以看做是一个指定的Database中创建files的默认位置。

    note:每个disk group是自己描述的,它包含了自己的文件目录、磁盘目录和其他目录。

    2)failure group

    Oracle通过failure group来提供数据的高可用性。ASM使用的镜像算法并不是镜像整个disk,而是作AU级的镜像。所以很明显如果为各个failure group使用不同容量的disk是不明智的,因为这样在Oracle分配下一个AU的时候可能就会出现问题。在normal redundancy模式下,ASM环境中每分配一个AU都会有一个primary copy和一个second copy,ASM的算法保证了second copy和primary copy一定是在不同的failure group中,这就是failure group的意义。通过这个算法,ASM保证了即使一个failure group中的所有disk都损坏了,数据也是毫发无伤的。 对于没有使用外部冗余的系统,ASM通过故障组(failure group)提供了自己的内部的冗余机制,提高可用性。一个故障组,是一个磁盘组的子集,是由于其相关组件的故障导致不可用而被定义的一个磁盘集合。因此,对于给定的diskgroups,在两个不同的故障组中的disks一定不共享共同的故障组件。如果定义了diskgroup的故障组,ASM容忍同一个故障组中的多个disks同时发生故障。

    3)disk group 镜像

    正如前面所述,ASM提供三种冗余方式:外部冗余——external redundancy、普通冗余——normal redundancy、高冗余——high redundancy。外部冗余在ASM中不提供镜像,冗余是通过硬件来实现的。normal redundancy提供两倍镜像,至少需要两个failure groups。high redundancy提供三倍镜像,至少需要三个failure groups。

    ASM使用了独特的镜像算法。它不是镜像磁盘,而是镜像AU。所以,为了对故障提供连续的保障,只需要diskgroup中剩余的容量,而不是一个热磁盘备份。不建议创建大小不同的故障组,因为这在分配二级AU时可能会引来问题。当ASM在diskgroup中的一个磁盘上给一个文件首次分配主AU时,会在diskgroup的另一个disk上分配一个该AU的镜像副本。一个给定的disk上的每个主AU都会在diskgroup上的几个其他disks的一个中存在相应的镜像AU。ASM会确保主AU和它的镜像AU不会存储在同一个故障组中。diskgroups的冗余要么可以是默认的普通冗余(文件是被两路镜像,至少需要两个故障组);要么是高冗余,通过三路镜像提供高度的保护(至少需要三个故障组)。一旦一个diskgroup被建立,其冗余级别就不能被改变了。为了改变一个diskgroup的冗余级别,只能创建新的diskgroup,其有相应的适当的冗余级别,随后将datafiles通过RMAN或是DBMS_FILE_TRANSFER进行迁移。

    下面将通过示例显示将如何创建使用故障组的diskgroup。在该示例中,在具有4个内部托盘的存储阵列上部署ASM普通冗余,其中每个托盘都有4个磁盘。隔离的失败组件是存储托盘,因此故障组的界限就是存储托盘,也就是说,每个存储托盘将与一个故障组关联。

    SQL> create diskgroup DATA_NRML normal redundancy
    FAILGROUP flgrp1 disk
   ‘/dev/rdsk/c3t19d3s4′,’/dev/rdsk/c3t19d4s4′,’/dev/rdsk/c3t19d5s4′,
    ‘/dev/rdsk/c3t19d6s4′
    FAILGROUP flgrp2 disk
    ‘/dev/rdsk/c4t20d3s4′,’/dev/rdsk/c4t20d4s4′,’/dev/rdsk/c4t20d5s4′,
    ‘/dev/rdsk/c4t19ds4′
    FAILGROUP flgrp3 disk
    /dev/rdsk/c5t21d3s4′,’/dev/rdsk/c5t21d4s4′,’/dev/rdsk/c5t21d5s4′,
    ‘/dev/rdsk/c5t21ds4′
   FAILGROUP flgrp4 disk
    /dev/rdsk/c6t22d3s4′,’/dev/rdsk/c6t22d4s4′,’/dev/rdsk/c6t22d5s4′,
    ‘/dev/rdsk/c6t22ds4′;

    创建为普通或高冗余diskgroups,分别包含的files有两个或三个镜像。分配的第一个文件AU被选作为主AU,镜像的AU被称作次AU。在高冗余的情况下,将会有两个次AU。这种主次AU的逻辑分组被称作AUset。一个AU set总是包含相同的data,因为他们是彼此的镜像版本。因此,当一个block被写,在AU set中的每个AU将并发的执行写操作。然而,当block被读取时,总是从主AU中读取,除非主AU不可读。需要明确,在diskgroup(和故障组)中的每个磁盘包含几乎相同数量的主次AU。这使得read I/O能够在所有disks上均匀的分布。这不同于其他常见的逻辑卷标管理,会区分主次disk sets。

    综上,故障组用于隔离了组件故障,所以需要了解发生故障的组件。如果无法确定发生故障的组件,或发生故障的组件就是disk本身(而不是阵列控制器或存储托盘),则定义普通或高冗余diskgroups时,不定义任何故障组是明智的方法。这样,每个ASM磁盘被分配为一个自己的故障组,ASM会内部确定磁盘的镜像关系。如果存储阵列有完全的冗余组件,并且有两条路径通向磁盘,则最好不要指定故障组,而是让ASM管理磁盘的镜像伙伴关系。

    在前面的示例中,假设故障组flgrp1的一块disk发生故障,则failed disk中的内容将通过在备份AU中冗余数据进行重建,从而重新获得平衡。在恢复平衡的过程中,如果database实例需要访问在failed disk中相应的primary AU,则database将从其他故障组的适当disk中读取镜像副本。一旦恢复平衡,database实例将只读取主AU。

    disk是机械设备,所以就可能fail。当设备发生故障或是发生零星的I/O errors时,database的corruption的可能性就增大。ASM将主动的处理相关的I/O errors,而不考虑使用故障组。对于持久的I/O错误,在设备驱动器中进行一些处理尝试后,只会通过信号通知调用者(Oracle I/O进程)。如果在Oracle写操作期间引发了持久的磁盘I/O错误,ASM就会从磁盘组中隔离受影响的磁盘,从而防止更多的应用程序故障。如果磁盘丢失导致数据丢失,ASM将自动卸载磁盘组以保护磁盘组数据的完整性。

    4)disk group的动态重整

    在disk group添加或删除disks时,ASM会进行自动重整,使其处于平衡状态。这一过程无需DBA的干涉,而是通过所以技术在AUs上的应用来实现的。ASM无需对data进行重新的stripe,只是对一定比例的data 进行移动即可。

    5)创建和删除disk group

    前面已经有了创建的一个例子,下面在上一个:

    CREATE DISKGROUP dgroupA NORMAL REDUNDANCY
    FAILGROUP controller1 DISK
    ‘/devices/A1′ NAME diskA1 SIZE 120G FORCE,
    ’/devices/A2′,
    ’/devices/A3′
    FAILGROUP controller2 DISK
     ’/devices/B1′,
    ’/devices/B2′,
    ’/devices/B3′;

    上例中使用了NORMAL REDUNDANCY子句,这是默认的冗余级别。此外可以选择提供disk name,否则,ASM会创建一个默认的name,形式是<group_name>_n。同时,还可提供磁盘大小的可选信息,如果没有提供,ASM会进行自动的检测,如果检测失败,则创建操作也会失败,返回error。FORCE暗示可以使指定的disk被加载到disk group中,尽管它已经被作为AMS disk group的member格式化了。如果使用FORCE的disk没有被作为AMS disk group的member格式化,则会报error。

    DROP DISKGROUP dgroupA INCLUDING CONTENTS;

    上面这句主要用于删除disk group。此时disk group必须是被mount的。当确定所有的disk group files没有被open,group和所有的驱动程序被从disk group中移除,随后,每个磁盘的header被覆盖,从而剔除ASM的格式化信息。

    6)项disk group添加disk

    先上例子

    ALTER DISKGROUP dgroupA ADD DISK
    ‘/dev/rdsk/c0t4d0s2′ NAME A5,
    ’/dev/rdsk/c0t5d0s2′ NAME A6,
    ’/dev/rdsk/c0t6d0s2′ NAME A7,
    ’/dev/rdsk/c0t7d0s2′ NAME A8;
    ALTER DISKGROUP dgroupA ADD DISK ‘/devices/A*’;

    当向一个disk group添加disk时,ASM Instance会确定该disk是可寻址的并且是可用的。随后,disk被格式化并rebalanced。rebalancing 过程是比较长的,因为要移动AU每个file到新disk上。

    7)其他的alter命令

    ALTER DISKGROUP dgroupA DROP DISK A5;
    从disk group中删除disk。
    ALTER DISKGROUP dgroupA
    DROP DISK A6
    ADD FAILGROUP fred DISK ‘/dev/rdsk/c0t8d0s2′ NAME A9;

    在一条语句中同时删除并添加disk,这样可以节省rebalance的开支,两个操作后的rebalance同时进行。

    ALTER DISKGROUP dgroupA UNDROP DISKS;

    取消对disks的删除操作,此句只对尚未完成的drop操作有效。

    ALTER DISKGROUP dgroupB REBALANCE POWER 5;

    rebalance某个disk group,并发度是5。因为添加、删除或是resize disks后都会自动的进行rebalance,所以一般不会使用此命令,但通过此句可以覆盖默认的和最大的(由ASM_POWER_LIMIT定义的)rebalance并发速度。可以通过此句对已经正在进行的rebalance操作进行重新的等级设置。如果power的参数设置为0,将会挂起该命令,直到重新发出此命令。

    ALTER DISKGROUP dgroupA DISMOUNT;

    通过mount和dismount命令选项可以使Database Instance访问或不能访问disk group。

    ALTER DISKGROUP dgroupA CHECK ALL;

    用于验证disk group 元数据的内部一致性,并修复找到的error。如果只是想获得报警信息,也可使用NOREPAIR子句。此句会验证disk group中的所有disks,也可指定要验证的disk或是file。此命令要求disk group是mount的。如果查找到error,将会显示信息摘要,具体的细节将写入alert log中。

    8)使用V$ASM_OPERATION视图监控长期运行的操作

    该视图的字段含义如下表:

0
相关文章