ASM的一个重要特性是动态的存储扩展功能。我们可以向现有的磁盘组中动态地加入新磁盘,当新磁盘被加入之后,Oracle还可以动态地将当前的数据均衡到新增加的磁盘,这个过程称为Rebalance,在后台通过asm_rbal_+ASM进程来完成。
我们知道,通过传统的卷管理软件进行空间扩展是极为复杂的。如果使用裸设备,那么空间一旦分配,大小是不能更改的;如果是文件系统,扩展某个卷将涉 及文件系统的识别问题;而ASM为用户结束了这些麻烦。ASM使用裸设备来构建磁盘组,一方面拥有了裸设备的性能,另一方面又通过Oracle自身管理的 Disk Group实现了动态的空间扩展和均衡,这大大简化了数据库系统的管理和技术复杂度。
ASM的动态扩展是通过将存储管理细粒度到AU(ASM Unit)单元来实现的,图6-30是ASM磁盘组动态扩展的一个示意图,通过动态扩展,可以看到新增加的磁盘通过自动的Rebalance过程已经分担了原有的存储。
Rebalance过程是通过Oracle 10g新引入的一个后台进程完成的,这个进程名为RBAL:
1 [oracle@danaly ~]$ ps -ef|grep ora_rbal*oracle 2 3815 1 0 Jan23 ? 00:00:01 ora_rbal_danalyoracle 3 31601 23407 0 14:33 pts/2 00:00:00 grep ora_rbal*
ASM通过参数asm_power_limit来控制Rebalance的速度,该参数取值范围为1~11,参数值越大平衡速度越快,缺省值为1; 可以在命令行通过指定Rebalance Power来控制平衡速度;该参数的控制作用是通过限制RBAL进程数量来实现的,当设置为最大11的时候,表示将启动11个rebalance进程同时 进行数据平衡操作。
以下为设置rebalance power 11的时候,在操作系统中观察到的rebalance进程。
1 SQL> host ps -ef|grep ASM 2 <other process snipped> 3 oracle 8677 1 0 04:02 ? 00:00:00 asm_rbal_+ASM1 4 oracle 10459 1 0 04:05 ? 00:00:00 asm_arb0_+ASM1 5 oracle 10461 1 0 04:05 ? 00:00:00 asm_arb1_+ASM1 6 oracle 10463 1 0 04:05 ? 00:00:00 asm_arb2_+ASM1 7 oracle 10465 1 0 04:05 ? 00:00:00 asm_arb3_+ASM1 8 oracle 10467 1 0 04:05 ? 00:00:00 asm_arb4_+ASM1 9 oracle 10474 1 0 04:05 ? 00:00:00 asm_arb5_+ASM1 10 oracle 10476 1 0 04:05 ? 00:00:00 asm_arb6_+ASM1 11 oracle 10478 1 0 04:05 ? 00:00:00 asm_arb7_+ASM1 12 oracle 10480 1 0 04:05 ? 00:00:00 asm_arb8_+ASM1 13 oracle 10482 1 0 04:05 ? 00:00:00 asm_arb9_+ASM1 14 oracle 10484 1 0 04:05 ? 00:00:00 asm_arba_+ASM1 15 <other process snipped>
以下是一个向现有磁盘组加入一个新磁盘的过程:
1 SQL> alter diskgroup ORADG add disk 'ORCL:VOL6' 2 rebalance power 11; 3 Diskgroup altered. 4 SQL> select group_number,disk_number,mode_status, 5 name from v$asm_disk; 6 GROUP_NUMBER DISK_NUMBER MODE_STATUS NAME 7 ------------ ----------- -------------- -------------------- 8 0 4 ONLINE 9 1 0 ONLINE VOL1 10 1 1 ONLINE VOL2 11 1 2 ONLINE VOL3 12 1 3 ONLINE VOL4 13 1 4 ONLINE VOL6
可以看一下最初磁盘组中的磁盘使用情况为:
1 SQL> select name,total_mb,free_mb from v$asm_disk; 2 NAME TOTAL_MB FREE_MB 3 -------------------- ---------- ---------- 4 2870 0 5 VOL1 19077 6571 6 VOL2 19077 6497 7 VOL3 19077 6558 8 VOL4 12228 4321 9 VOL6 104187 97622
经过Oracle的自动调整均衡之后,磁盘空间使用情况变为:
1 SQL> select name,total_mb,free_mb from v$asm_disk; 2 NAME TOTAL_MB FREE_MB 3 -------------------- ---------- ---------- 4 2870 0 5 VOL1 19077 13337 6 VOL2 19077 13381 7 VOL3 19077 13337 8 VOL4 12228 8548 9 VOL6 104187 72966
可以看到数据已经逐渐均衡到VOL6上来。
磁盘组通过ASM实例透明地提供给数据库实例,那么数据库就不必再关心具体的数据文件在底层硬件上的存储。但是值得注意的是,Oracle的自动 Rebalance需要消耗大量的IO,当数据库存储并不很大的情况下,Rebalance过程能够快速完成,但是当数据库的存储达到海量,如TB级 时,Oracle的Rebalance时间可能就会变得极其漫长。所以当你需要使用Rebalance技术时,一定要认真评估其性能影响。
在数据Rebalance时,我们可以通过查询V$ASM_OPERATION视图来获知估算的完成时间。如下例,该Rebalance操作将在58分钟以后结束。注意,这仅仅是一个参考值。
1 SQL> select GROUP_NUMBER,STATE,SOFAR,OPERATION, 2 EST_RATE,EST_MINUTES from V$ASM_OPERATION; 3 GROUP_NUMBER STATE SOFAR OPERATION 4 EST_RATE EST_MINUTES 5 ------------ -------- ---------- ---------- ---------- ----------- 6 1 RUN 47 REBAL 2241 58