本文共 2895 字,大约阅读时间需要 9 分钟。
最近有一些客户有这样一个需求,一个ASM磁盘组中分别挂载不同性能的存储或磁盘。希望ASM在读取的时候,优先读取性能好的磁盘,性能差的磁盘更多的是扮演'standby'的角色。
oracle提供一个参数ASM_PREFERRED_READ_FAILURE_GROUPS,来实现ASM优先读取的功能,但是以FAILURE_GROUP为单位实现的。我们可以将不同性能的存储(磁盘),分别划分到不同的FAILURE_GROUP,然后根据这个参数来指定优先读取哪个FAILURE_GROUP
关于参数说明
ASM_PREFERRED_READ_FAILURE_GROUPS specifies the failure groups that contain preferred read disks. Preferred disks are instance specific. This parameter is only valid in ASM instances.
下面就是在测试环境测试的过程:
1. 修改参数(无需重启instance,立即生效)
1 2 | SQL> alter system set ASM_PREFERRED_READ_FAILURE_GROUPS= 'DATA.QR01CEL03' ; System altered. |
2. 检查修改结果
1 2 3 4 | SQL> show parameter prefer NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ asm_preferred_read_failure_groups string DATA.QR01CEL03 |
下面是测试部分:
1. 查询修改后每个FAILGROUP的读取次数
1 2 3 4 5 6 | SQL> select instname, failgroup, sum(reads), sum(writes) from v$asm_disk_iostat group by instname,failgroup order by 1 , 2 ; INSTNAME FAILGROUP SUM(READS) SUM(WRITES) ---------------------------------------------------------------- ----------- dbm2 QR01CEL01 12608 5470 dbm2 QR01CEL02 3544 4529 dbm2 QR01CEL03 1997 4107 |
2. 另一个窗口2,执行read操作
1 | select * from dba_objects; |
3. 窗口1,可以看到,读取都是QR01CEL03上的reads是一直增加的,而其他的FAILGROUP是没有reads的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | SQL> / INSTNAME FAILGROUP SUM(READS) SUM(WRITES) ---------------------------------------------------------------- ----------- dbm2 QR01CEL01 12608 5492 dbm2 QR01CEL02 3545 4550 dbm2 QR01CEL03 2081 4128 SQL> / INSTNAME FAILGROUP SUM(READS) SUM(WRITES) ---------------------------------------------------------------- ----------- dbm2 QR01CEL01 12608 5508 dbm2 QR01CEL02 3545 4560 dbm2 QR01CEL03 2102 4138 SQL> / INSTNAME FAILGROUP SUM(READS) SUM(WRITES) ---------------------------------------------------------------- ----------- dbm2 QR01CEL01 12608 5561 dbm2 QR01CEL02 3546 4606 dbm2 QR01CEL03 2250 4185 SQL> / INSTNAME FAILGROUP SUM(READS) SUM(WRITES) ---------------------------------------------------------------- ----------- dbm2 QR01CEL01 12608 5645 dbm2 QR01CEL02 3546 4669 dbm2 QR01CEL03 2414 4246 |
最后可以看到本次查询共读取2414-1997=417次。并且全部在FAILGROUP-QR01CEL03上。
4. 下面我们测试写入部分:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 窗口 1 SQL> / INSTNAME FAILGROUP SUM(READS) SUM(WRITES) ---------------------------------------------------------------- ----------- dbm2 QR01CEL01 12619 5991 dbm2 QR01CEL02 3558 4957 dbm2 QR01CEL03 3389 4539 窗口 2 SQL> create table test as select * from dba_objects; 窗口 1 SQL> / INSTNAME FAILGROUP SUM(READS) SUM(WRITES) ---------------------------------------------------------------- ----------- dbm2 QR01CEL01 12621 6178 dbm2 QR01CEL02 3559 5097 dbm2 QR01CEL03 3720 4675 |
实际测试显示,对写操作是没有影响。
写操作的测试--很白痴的行为,想想也是,data磁盘组是normal模式,一定会根据算法,将数据块分配到不同的FAILGROUP。也就不可能有优先写的概念。
总结,很简单的一个参数设置,可以实现和实用的一个功能。