ASM优先读取
asm_preferred_read_failure_group参数被用来指定一个故障磁盘组列表,它指定了RAC中每个节点的本地读取方式。asm_preferred_read_failure_group格式如下:
asm_preferred_read_failure_groups=diskgroup_name.failuregroup_name,...
每个条目包含了diskgroup_name,它是磁盘组名字,failuregroup_name,它是磁盘组所使用的故障磁盘组名字,这两个变量使用一个句号进行分隔。多个条目可以使用逗事情进行分隔。这个 参数可以进行动态修改。
在extended rac中,为asm_preferred_read)failure_groups参数所指定的故障磁盘组应该只包含本地节点中的磁盘,v$asm_disk中的preferred_read列指示了优先读取磁盘。
注意,当增加或删除磁盘时,最佳的方法是从存储将要发生改变的节点执行增加或删除命令。这能更有效的执行重新平衡,因为区重新定位使用同样的故障磁盘组进行本地化--,也就是相同节点。
下面的例子将显示如何部署优先读取功能与展现其一些优点。这个例子演示当asm_preferred_read_failure_groups参数没有设置时的I/O模式,以及修改参数之后对I/O的影响。
1.创建有两个故障磁盘组的ASM磁盘组data_nrml,其中raw5/6/7磁盘是与节点1在一个机房,raw/12/13/14磁盘是与节点2在另一个机房:
SQL> create diskgroup data_nrml normal redundancy 2 failgroup fg1 disk '/dev/raw/raw5','/dev/raw/raw6','/dev/raw/raw7' 3 failgroup fg2 disk '/dev/raw/raw12','/dev/raw/raw13','/dev/raw/raw14'; Diskgroup created.
2.在节点2,创建表测试表t1
SQL> create table t1 as select * from dba_tables; Table created. SQL> insert into t1 select * from t1; 3668 rows created. ..... SQL> / SQL> / 1467392 rows created. SQL> commit; Commit complete. SQL> alter system flush buffer_cache; System altered.
3.查询磁盘组的读写I/O累计信息,可以看到实例1中的FG1,FG2的读写分别为169,176,实例2中的FG1,FG2的读写分别为43,59
SQL> set long 9999 SQL> set linesize 9999 SQL> select inst_id, failgroup, sum(reads), sum(writes) from gv$asm_disk where failgroup in ('FG1','FG2') group by inst_id, failgroup; INST_ID FAILGROUP SUM(READS) SUM(WRITES) ---------- ------------------------------------------------------------ ---------- ----------- 1 FG1 169 3809 1 FG2 176 3809 2 FG1 43 17201 2 FG2 59 17201
4.执行查询:
SQL> show parameter asm_preferred_read_failure_groups NAME TYPE ------------------------------------ ---------------------- VALUE ------------------------------ asm_preferred_read_failure_groups string SQL> set timing on SQL> select count(*) from jy.t1; COUNT(*) ---------- 1467392 Elapsed: 00:00:07.23
5.再次查询磁盘组的读写I/O累计信息,可以看到实例1中的FG1,FG2的读写分别为450,564,比之前增加了450-169=281,564-176=388,实例2中的FG1,FG2的读写分别为85,99,比之前加了85- 43=42,99-59=40,从这些数据可以看到,获取数据时同时访问了两个故障磁盘组,因为我的数据是在节点2进行插入的,显示的读取I/O数据从故障磁盘组FG2的还要比FG1稍微多点,执行时间为7秒。
SQL> select inst_id, failgroup, sum(reads), sum(writes) from gv$asm_disk where failgroup in ('FG1','FG2') group by inst_id, failgroup; INST_ID FAILGROUP SUM(READS) SUM(WRITES) ---------- ------------------------------------------------------------ ---------- ----------- 1 FG1 450 8879 1 FG2 564 8879 2 FG1 85 38166 2 FG2 99 38166
6.设置 asm_preferred_read_failure_groups参数,让节点1优先从故障磁盘组FG1进行读取,让节点2优先从故障磁盘组FG2进行读取
SQL> alter system set asm_preferred_read_failure_groups='DATA_NRML.FG1' scope=both sid='+ASM1'; System altered. SQL> alter system set asm_preferred_read_failure_groups='DATA_NRML.FG2' scope=both sid='+ASM2'; System altered.
7.检查实例的优先读取磁盘组信息,从下面的查询结果可以看到,实例1的优先读取故障磁盘组为FG1,实例2为FG2:
SQL> select inst_id, failgroup, name, preferred_read from gv$asm_disk where failgroup in ('FG1','FG2') order by inst_id, failgroup; INST_ID FAILGROUP NAME PR ---------- ------------------------------------------------------------ ------------------------------------------------------------ -- 1 FG1 DATA_NRML_0002 Y 1 FG1 DATA_NRML_0000 Y 1 FG1 DATA_NRML_0001 Y 1 FG2 DATA_NRML_0003 N 1 FG2 DATA_NRML_0005 N 1 FG2 DATA_NRML_0004 N 2 FG1 DATA_NRML_0001 N 2 FG1 DATA_NRML_0000 N 2 FG1 DATA_NRML_0002 N 2 FG2 DATA_NRML_0004 Y 2 FG2 DATA_NRML_0003 Y 2 FG2 DATA_NRML_0005 Y 12 rows selected.
8.在节点1开启会话再次执行查询
SQL> alter system flush buffer_cache; System altered. SQL> set timing on SQL> select count(*) from jy.t1; COUNT(*) ---------- 1467392 Elapsed: 00:00:03.26
9.再次查询磁盘组的读写I/O累计信息,可以看到实例1中的FG1,FG2的读写分别为867,567,比之前增加了867-450=417,567-564=3,实例2中的FG1,FG2的读写分别为88,102,比之前加了88- 85=3,102-99=3,从这些数据可以看到,获取数据时基本上都是访问的故障磁盘组FG1,从这些数据可以看到,实例1也基本上都是访问的故障磁盘组FG1,对FG2读取次为3,实例2对于故障磁盘组 FG1,FG2的访问次数为3,都很少,执行时间从7秒变为了3秒。
SQL> select inst_id, failgroup, sum(reads), sum(writes) from gv$asm_disk where failgroup in ('FG1','FG2') group by inst_id, failgroup; INST_ID FAILGROUP SUM(READS) SUM(WRITES) ---------- ------------------------------------------------------------ ---------- ----------- 1 FG1 867 8891 1 FG2 567 8891 2 FG1 88 38166 2 FG2 102 38166