您好,欢迎来到抵帆知识网。
搜索
您的当前位置:首页Oracle数据库连接的failover配置

Oracle数据库连接的failover配置

来源:抵帆知识网
Failover的连接配置

刘 伟

以下内容参考了官方文档。这里的failover,是指应用发起一个数据库连接以后,如果工作过程中该连接所连到的实例发生了故障,连接可以自动切换到正常节点,从而最小化对业务的影响。 根据Oracle的介绍,我们有两种连接方式可以实现数据库连接的failover: TAF和FCF

1. TAF

TAF的全称是Transparent Application Failover,即透明应用故障切换。 按照官方文档的描述,TAF让Oracle Net将一个失效的连接从故障点转移到另一个监听上,用户能使用这个新的连接来继续未完成的工作。 TAF可以配置为使用client端的(Transparent Network Substrate)TNS连接字符串来连接,或者使用server端的服务。如果两种方式同时使用,则使用server端的服务配置。 TAF可以工作在两种模式下:session failover和select failover。前者在failover时会重建失败的连接,后者则能够继续进程中未完成的查询(如果failover前一个session正在从一个游标中获取数据,则新的session将在相同的snapshot下重新运行select语句,并返回余下的行)。如果failover时,session执行了DML操作且未提交,则failover后,若不执行rollback回滚而执行新的操作,将会收到一条错误信息ORA-202: transaction must roll back TAF在dataguard中使用,可以自动进行failover

一个典型的使用了TAF的TNS连接串如下: NEWSDB =

(DESCRIPTION =

(ADDRESS = (PROTOCOL = TCP)(HOST = rac1-vip)(PORT = 1521)) (ADDRESS = (PROTOCOL = TCP)(HOST = rac2-vip)(PORT = 1521)) (LOAD_BALANCE = yes) (CONNECT_DATA =

(SERVER = DEDICATED) (SERVICE_NAME = dyora) (FAILOVER_MODE = (TYPE = SELECT) (METHOD = BASIC) (RETRIES = 180) (DELAY = 5) ) ) )

2. FCF

FCF全称是Fast Connect Failover,快速连接故障切换。 oracle11g提供了FCF方式连接数据库,它支持JDBC Thin和JDBC OCI驱动;与连接缓存(implicit connection cache)协同工作提供更高的连接性能和高可用;可以在应用代码中设置,无需另外配置。 需要的条件:启用了隐含连接缓存,FCF需要与JDBC的连接缓存机制共同工作,为应用管理连接以确保高可用;应用使用服务名而非服务标识符来连接数据库;JDBC运行的节点上配置并启用了Oracle Notification Service (ONS);JDBC例程运行的java虚拟机必须包含oracle.ons.oraclehome并指向ORACLE_HOME。

例子: 配置ONS

ods.setONSConfiguration(\"nodes=racnode1.example.com:4200,racnode2.example.com:4200\"); 启用FCF

// declare datasource ods.setUrl(

\"jdbc:oracle:oci:@(DESCRIPTION=

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

(CONNECT_DATA=(SERVICE_NAME=service_name)))\"); ods.setUser(\"scott\");

ods.setConnectionCachingEnabled(true); ods.setFastConnectionFailoverEnabled(true): ctx.bind(\"myDS\

ds=(OracleDataSource) ctx.lookup(\"MyDS\"); try {

ds.getConnection(); // transparently creates and accesses cache catch (SQLException SE { } }

上面的java代码包含一个异常处理。工作过程如下: 1. 一个实例宕掉了,在缓存中留下一些过期连接

2. RAC产生一个事件,并将其发送给包含JDBC的java虚拟机

3. JVM中的后台线程找出所有受到该RAC事件影响的所有连接,通过sql异常(ORA-17008)通知它们关闭连接,并回滚事务

4. 连接接收到sql异常并重新执行失败的操作

3. TAF和FCF的区别

FCF与TAF相比有如下不同:

 FCF支持应用级别的连接重试,由应用来决定failover时如何处理,是重新执行,还是

抛出异常;TAF只能在OCI/NET的层面进行重新连接;

 FCF与连接缓存很好地结合起来,让连接缓存管理器来管理缓存,失败的连接在缓存中

会自动失效。而TAF在网络层面做预连接,当一个连接失效,连接缓存不能检测到;  FCF基于Oracle RAC事件,可以快速为活跃/闲置的连接检测到故障;  FCF通过实例的UP事件实现负载均衡,分配到在线的RAC实例中。

oracle建议不要在一个应用中同时使用TAF和FCF

4. 本次TAF配置的说明

简单地说,对于数据库连接在生命周期中,实例发生故障时的故障切换,Oracle提供了TAF和FCF两种配置方法,其中:

 TAF是作用在数据库的网络层面(OCI/NET),FCF作用在应用层面;

 TAF可以在数据库连接中配置,和应用无关,而FCF在应用层面来控制出现故障时的处

理;

 TAF不支持DML(增删改)操作的切换,也就是说,当故障发生时,如果连接正在执行

查询操作,或没有任何操作,则可以直接切换到其他节点继续工作,如果正在执行增删改,则会失败;

 TAF作用在网络层面,可以防止实例级别的故障,例如数据库实例关闭或重启,但不能

防止集群或操作系统级别的故障;  TAF和FCF不建议同时使用。 综上,FCF比TAF更加灵活,功能也更强大,但是FCF需要在应用端来配置,工作量较大。在没有FCF的情况下,我们在数据库层面配置TAF,可以提升应用的可用性。

5. TAF的局限性

上面提到,TAF不支持DML的故障切换,那么对于select模式的配置中,是否支持查询语句的failover呢? 它还是需要满足以下条件:

 执行计划不发生变化

 输出的结果顺序不发生变化

 输出的结果集不发生变化(这通过一致性读来保证) 如果执行DML,在执行过程中发生了切换,则会报ORA-208: 无法安全重放调用,继续执行查询则正常,DDL的情况与此相同;如果在DML执行以后,但未提交,此时发生了故障切换,切换以后会报ORA-202: 事务处理必须重新运行,此时需要rollback,否则所

有操作(包括select和commit)都将不能正常进行。 ——来自老熊的测试

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- dfix.cn 版权所有 湘ICP备2024080961号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务