Oracle RAC 客户端故障转移(failover) TAF

Oracle RAC 客户端故障转移(failover),当采用TAF方式时,对于已经建立连接的客户端,在连接的实例或节点出现故障时,客户端无需再次发出连接请求,仍然 可以继续之前的数据库操作,此称之为透明故障转移。本文描述基于Oracle 10g rac,客户端TAF方式的故障转移并给出示例。

  下面是一些关于这方面的基础参考链接:
  有关负监听配置,载均衡(load balance)以及Oracle service请参考
    ORACLE RAC 监听配置 (listener.ora tnsnames.ora)
    ORACLE RAC 下非缺省端口监听配置(listener.ora tnsnames.ora)
    Oracle RAC 客户端连接负载均衡(Load Balance)
    Oracle RAC 服务器端连接负载均衡(Load Balance)
    Oracle RAC 负载均衡测试(结合服务器端与客户端)
    
  有关Oracle RAC failover 连接时故障转移请参考
    Oracle RAC failover 测试(连接时故障转移)
    Oracle RAC failover 测试(Server TAF方式)

[python] view plain copy print ?
  1. 1、TAF描述      
  2.   #下面关于TAF来自Oracle 的官方描述 ID 453293.1  
  3.   Transparent Application Failover (TAF) is a feature of the Oracle Call Interface (OCI) driver at client side.   
  4.   It enables the application to automatically reconnect to a database, if the database instance to which the connection is   
  5.   made fails. In this case, the active transactions roll back.   
  6.   Tnsnames Parameter: FAILOVER_MODE   
  7.   
  8.      When an instance to which a connection is established fails or is shutdown, the connection on the client side becomes   
  9.   stale and would throw exceptions to the caller trying to use it. TAF enables the application to transparently reconnect   
  10.   to a preconfigured secondary instance creating a fresh connection, but identical to the connection that was established   
  11.   on the first original instance.  
  12.     
  13.   #简单一点来说,就是说对于那些已经成功连接到特定实例的客户端,如果该实例或节点异常宕机,客户端会自动重新发出到剩余实例的连  
  14.   #接请求。使得客户端感觉不到它所连接的实例或节点已经出现故障,这个就称之为透明转移。但其间的活动事务将被回滚。  
  15.   #通过在客户端的tnsnames.ora中配置FAILOVER_MODE项实现TAF  
  16.   
  17. 2、服务器端、客户端的环境  
  18.   #服务器端环境,host信息  
  19.   oracle@bo2dbp:~> cat /etc/hosts |grep vip  
  20.   192.168.7.61   bo2dbp-vip.2gotrade.com    bo2dbp-vip  
  21.   192.168.7.62   bo2dbs-vip.2gotrade.com    bo2dbs-vip  
  22.     
  23.   #服务器端环境,集群信息  
  24.   oracle@bo2dbp:~> ./crs_stat.sh   
  25.    Resource name                                Target     State               
  26.   --------------                                ------     -----               
  27.   ora.GOBO4.GOBO4A.inst                         OFFLINE    OFFLINE on bo2dbp  #此时节点1上的实例被关闭  
  28.   ora.GOBO4.GOBO4B.inst                         ONLINE     ONLINE on bo2dbs    
  29.   ora.GOBO4.db                                  ONLINE     ONLINE on bo2dbp    
  30.   ora.bo2dbp.ASM1.asm                           ONLINE     ONLINE on bo2dbp    
  31.   ora.bo2dbp.LISTENER_BO2DBP.lsnr               ONLINE     ONLINE on bo2dbp    
  32.   ora.bo2dbp.LISTENER_ORA10G_BO2DBP.lsnr        ONLINE     ONLINE on bo2dbp    
  33.   ora.bo2dbp.gsd                                ONLINE     ONLINE on bo2dbp    
  34.   ora.bo2dbp.ons                                ONLINE     ONLINE on bo2dbp    
  35.   ora.bo2dbp.vip                                ONLINE     ONLINE on bo2dbp    
  36.   ora.bo2dbs.ASM2.asm                           ONLINE     ONLINE on bo2dbs    
  37.   ora.bo2dbs.LISTENER_BO2DBS.lsnr               ONLINE     ONLINE on bo2dbs    
  38.   ora.bo2dbs.LISTENER_ORA10G_BO2DBS.lsnr        ONLINE     ONLINE on bo2dbs    
  39.   ora.bo2dbs.gsd                                ONLINE     ONLINE on bo2dbs    
  40.   ora.bo2dbs.ons                                ONLINE     ONLINE on bo2dbs    
  41.   ora.bo2dbs.vip                                ONLINE     ONLINE on bo2dbs    
  42.   ora.ora10g.db                                 ONLINE     ONLINE on bo2dbp   
  43.   
  44.   #客户端环境  
  45.   robin@SZDB:~> cat /etc/issue  
  46.     
  47.   Welcome to SUSE Linux Enterprise Server 10 SP3 (x86_64) - Kernel \r (\l).  
  48.     
  49.   robin@SZDB:~> sqlplus -v  
  50.     
  51.   SQL*Plus: Release 10.2.0.3.0 - Production  
  52.     
  53.   #客户端tnsnames配置    
  54.   GOBO4_TAF =  
  55.    (DESCRIPTION =  
  56.      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.7.61)(PORT = 1521))  
  57.      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.7.62)(PORT = 1521))  
  58.      (LOAD_BALANCE = yes)  
  59.      (CONNECT_DATA =  
  60.        (SERVER = DEDICATED)  
  61.        (SERVICE_NAME = GOBO4)  
  62.       (FAILOVER_MODE =       #FAILOVER_MODE项参数   
  63.        (TYPE = session)  
  64.        (METHOD = basic)  
  65.        (RETRIES = 180  
  66.        (DELAY = 5)  
  67.       )  
  68.      )  
  69.    )  
  70.     
  71. 3、FAILOVER_MODE项分析  
  72.   FAILOVER_MODE项是实现TAF的主要配置内容,下面对其进行描述.  
  73.     
  74.   METHOD: 用户定义何时创建到其实例的连接,有BASIC 和 PRECONNECT 两种可选值  
  75.     BASIC: 客户端通过地址列表成功建立连接后,即仅当客户端感知到节点故障时才创建到其他实例的连接  
  76.     PRECONNECT: 预连接模式,是在最初建立连接时就同时建立到所有实例的连接,当发生故障时,立刻就可以切换到其他链路上  
  77.       
  78.     上述两种方式各有优劣,前者建立连接的开销相对较小,但failover时会产生延迟,而后者正好与前者相反  
  79.       
  80.   TYPE: 用于定义发生故障时对完成的SQL 语句如何处理,其中有2种类型:session 和select  
  81.     select:使用select方式,Oracle net会跟踪事务期间的所有select语句,并跟踪每一个与当前select相关的游标已返回多少行给客户  
  82.       端。此时,假定select查询已返回500行,客户端当前连接的节点出现故障,Oracle Net自动建立连接到幸存的实例上并继续返回  
  83.       剩余的行数给客户端。假定总行数为1500,行,则1000行从剩余节点返回。  
  84.     session: 使用session方式,所有select查询相关的结果在重新建立新的连接后将全部丢失,需要重新发布select命令。
  85. Failover Type Events

    The following are possible failover types in the OracleOCI Failover interface:
    • FO_SESSION
      Is equivalent to FAILOVER_MODE=SESSION in the tnsnames.ora file CONNECT_DATA flags. This means that only the user session is re-authenticated on the server-side while open cursors in the OCI application need to be re-executed.

    • FO_SELECT
      Is equivalent to FAILOVER_MODE=SELECT in tnsnames.ora file CONNECT_DATA flags. This means that not only the user session is re-authenticated on the server-side, but open cursors in the OCI can continue fetching. This implies that the client-side logic maintains fetch-state of each open cursor.

    • FO_NONE
      Is equivalent to FAILOVER_MODE=NONE in the tnsnames.ora file CONNECT_DATA flags. This is the default, in which no failover functionality is used. This can also be explicitly specified to prevent failover from happening. Additionally, FO_TYPE_UNKNOWN implies that a bad failover type was returned from the OCI driver
     
  86.       
  87.     上述两种方式适用于不同的情形,对于select方式,通常使用与OLAP数据库,而对于session方式则使用与OLTP数据库。因为select   
  88.     方式,Oracle 必须为每个session保存更多的内容,包括游标,用户上下文等,需要更多的资源。  
  89.       
  90.     其次,两种方式期间所有未提交的DML事务将自动回滚且必须重启启动。alter session语句不会failover。  
  91.     临时对象不会failover也不能被重新启动。  
  92.       
  93.   RETRIES: 表示重试的次数  
  94.   DELAY:表示重试的间隔时间  
  95.     
  96. 4、测试TAF      
  97.   #首次建立连接,此时客户端从tnsnames配置的第一个IP建立连接,由于第一个VIP所在的实例已经关闭,故连接到192.168.7.62  
  98.   #VIP 192.168.7.62对应的hostname以及instance_name分别为bo2dbs,GOBO4B,所以我们获得如下返回结果  
  99.   #其次我们可以看到当前session failover的相关参数  
  100.   robin@SZDB:~> sqlplus <a href="mailto:fail_over/fail@gobo4_taf">fail_over/fail@gobo4_taf  
  101.   
  102.   fail_over@GOBO4> get verify.sql  
  103.     1  REM the following query is for TAF connection verification  
  104.     2  col sid format 99999  
  105.     3  col serial# format 9999999  
  106.     4  col failover_type format a13  
  107.     5  col failover_method format a15  
  108.     6  col failed_over format a11  
  109.     7  Prompt  
  110.     8  Prompt Failover status for current user  
  111.     9  Prompt ============================================  
  112.    10  SELECT   sid,  
  113.    11   serial#,  
  114.    12   failover_type,  
  115.    13   failover_method,  
  116.    14   failed_over  
  117.    15   FROM   v$session  
  118.    16   WHERE   username = 'FAIL_OVER';  
  119.    17  REM the following query is for load balancing verification  
  120.    18  col host_name format a20  
  121.    19  Prompt  
  122.    20  Prompt Current instance name and host name  
  123.    21  Prompt ========================================  
  124.    22* SELECT   instance_name,host_name FROM v$instance;  
  125.    23    
  126.      
  127.   fail_over@GOBO4> @verify  
  128.     
  129.   Failover status for current user  
  130.   ============================================  
  131.     
  132.      SID  SERIAL# FAILOVER_TYPE FAILOVER_METHOD FAILED_OVER  
  133.   ------ -------- ------------- --------------- -----------  
  134.     1063     1175 SESSION       BASIC           NO  
  135.     
  136.     
  137.   Current instance name and host name  
  138.   ========================================  
  139.     
  140.   INSTANCE_NAME    HOST_NAME  
  141.   ---------------- --------------------  
  142.   GOBO4B           bo2dbs  
  143.     
  144.   #此时启动第一个实例GOBO4A,并停止第二个实例  
  145.   oracle@bo2dbp:~> srvctl start instance -d GOBO4 -i GOBO4A    
  146.   oracle@bo2dbp:~> srvctl stop instance -d GOBO4 -i GOBO4B  
  147.   #查看两个实例的状态  
  148.   oracle@bo2dbp:~> ./crs_stat.sh | grep inst  
  149.   ora.GOBO4.GOBO4A.inst                         ONLINE     ONLINE on bo2dbp    
  150.   ora.GOBO4.GOBO4B.inst                         OFFLINE    OFFLINE   
  151.     
  152.   #在客户端的session再次检查连接状态,即执行查询,结果如下,我们收到了ORA-25408  
  153.   fail_over@GOBO4> @verify  
  154.     
  155.   Failover status for current user  
  156.   ============================================  
  157.   SELECT   sid,  
  158.   *  
  159.   ERROR at line 1:  
  160.   ORA-25408: can not safely replay call  
  161.     
  162.   Current instance name and host name  
  163.   ========================================  
  164.     
  165.   INSTANCE_NAME    HOST_NAME  
  166.   ---------------- --------------------  
  167.   GOBO4A           bo2dbp  
  168.     
  169.   #再次执行查询,此时客户端已经自动实现了重新连接,从查询返回得到的INSTANCE_NAME与HOST_NAME可知。  
  170.   #最重要的一个FAILED_OVER值为YES,表明当前的session是一个failover来的session。  
  171.   #关于METHOD使用PRECONNECT与TYPE使用SELECT的方式在此不作演示  
  172.   fail_over@GOBO4> @verify  
  173.     
  174.   Failover status for current user  
  175.   ============================================  
  176.     
  177.      SID  SERIAL# FAILOVER_TYPE FAILOVER_METHOD FAILED_OVER  
  178.   ------ -------- ------------- --------------- -----------  
  179.     1073       29 SESSION       BASIC           YES  
  180.     
  181.     
  182.   Current instance name and host name  
  183.   ========================================  
  184.     
  185.   INSTANCE_NAME    HOST_NAME  
  186.   ---------------- --------------------  
  187.   GOBO4A           bo2dbp   
  188.   
  189.   #Author : Robinson  
  190.   #Blog   : http://blog.csdn.net/robinson_0612  
  191.     
  192. 5、小结:  
  193.   a、客户端TAF方式实现了Oracle客户端到服务器透明故障转移  
  194.   b、主要在客户端tnsnames.ora配置FAILOVER_MODE来实现基于客户端的TAF  
  195.   c、FAILOVER_MODE中基于连接方式(METHOD)可以分为BASIC与PRECONNECT两种方式,后者开销更大,延迟小,与前者相反  
  196.   d、FAILOVER_MODE中TYPE可以分为select与session两种方式,两者所有未提交的事务全部回滚,select方式会failover查询,  
  197.      session方式不会。select方式多用在OLAP类型数据库,而session多用在OLTP类型数据库  
  198.   e、一旦所在的实例发生故障,会自动failover,无需手动重新连接,这就是与连接时故障转移所不同的。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29446986/viewspace-1815944/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/29446986/viewspace-1815944/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值