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