failover_mode中的backup选项测试

在RAC client端的tnsnames.ora配置中,常常遇到failover的配置,参数failover_mode,其中很多的参数,例如:backup,type,method,retries,delay。这四个参数都可以被叫做TAF的failover policy,后面三个是经常见到的,而backup比较少见,这篇文章主要介绍一下backup这个选项。下面是online doc上关于backup选项的说明解释。

—————————————————————————————————-

BACKUP 

Specify a different net service name for backup connections.

A backup should be specified when using preconnect to pre-establish connections. 

—————————————————————————————————-

也很容易理解,backup一般和preconnect一起使用,下面介绍一个例子,看看具体的切换情况。

client端的tnsnames.ora配置片段如下:

———————————————————————-

RAC1 =

  (DESCRIPTION =

    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.201.149)(PORT = 1521))

    (CONNECT_DATA =

      (SERVER = DEDICATED)

      (SERVICE_NAME = rac.world)

      (INSTANCE_NAME = rac1)

      (FAILOVER_MODE =

        (BACKUP = rac2)

        (TYPE = SELECT)

        (METHOD = PRECONNECT)

      )

    )

  )

 

RAC2 =

  (DESCRIPTION =

    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.201.150)(PORT = 1521))

    (CONNECT_DATA =

      (SERVER = DEDICATED)

      (SERVICE_NAME = rac.world)

      (INSTANCE_NAME = rac2)

      (FAILOVER_MODE =

        (BACKUP = rac1)

        (TYPE = SELECT)

        (METHOD = PRECONNECT)

      )

    )

  )

———————————————————————–

测试场景:

client端通过RAC1这个片段连接到service_name=rac.world的instance rac1上,也就是rac1节点上。

 

 

failover的策略是:

method=preconnect:也就是建立preconnect,这个的意思是尽管你连接的是rac1,但在同时会在backup=rac2上创建相同的session连接,后续试验验证。

backup=rac2:这个backup选项是要的一个net service,也就是定义在client端的RAC2片段,我理解是告诉你,当failover发生时,我要failover到的目的地。

1.从客户端开启sqlplus连接。

C:Userstumin>sqlplus trade/trade@rac1

SQL*Plus: Release 10.2.0.1.0 – Production on 星期二 2月 5 16:28:50 2013

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

连接到:

Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 – 64bit Production

With the Partitioning, Real Application Clusters, OLAP, Data Mining

and Real Application Testing options

SQL>

//查询可得知连接的session在rac1上。

SQL> select instance_name from v$instance;

INSTANCE_NAME

—————-

rac1

2.在db端的RAC1查看连接信息

SQL> select username,osuser,program from v$session where username='TRADE';

USERNAME                       OSUSER                         PROGRAM

—————————— —————————— ———————

TRADE                          zhangsan                          sqlplus.exe

3.在db端的RAC2查看连接的信息

SQL> select username,osuser,program from v$session where username='TRADE';

USERNAME                       OSUSER                         PROGRAM

—————————— —————————— ———————–

TRADE                          zhangsan                          sqlplus.exe

可以看到,正是由于用了preconnect的method,才会在RAC2上也创建了一个连接session,这个session正是等着、用于故障发生时,切换使用的。

4.关机rac1的instance,看看failover情况

[oracle@node1 ~]$ srvctl stop instance -d rac -i rac1

在client端做一个较长的查询,看看停止rac1这个instance会有什么影响。我采用了直接shutdown -h now来关闭了rac1的主机。

rac1的vip漂移到了rac2上,而相应的查询session在某个时点,会有短暂的hang、停顿;然后继续执行、取数。

在client端做查询,看看client当前在哪个节点上?已经切换到rac2上了。

———————————————

SQL> select instance_name from v$instance;

INSTANCE_NAME

—————-

rac2

———————————————

显然backup需要配合preconnect来使用,而preconnect会创建额外的预连接,也是一种资源的消耗,在使用之前需要评估

–EOF–