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-25402: 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) ) ) )
failover_mode参数介绍 failover_mode参数 BACKUP DELAY说明备用连接的网络服务名。若使用了 precon
nect的连接方法,则需要指定这个参数连接重试的时间间隔(秒)。如果指定了 RETRIES参数,若不指定该参数,默认为 1
秒。若注册了 callback,该参数将被忽略 METHOD设置 failover方法。basic: failover时才尝试连接备用实例的监听;preconnect:每次连接数据库时,都会在备用实例上也产生一个连接,以实现更快的切换 failover后,尝试连接的次数。如果指定了 DELAY参数,则 RETRIES默认为 5次。若注册了 callback,则该参数将被忽略 OCI默认提供了 3种类型:session:若用户连接丢失,将在备用节点上重新创建; TYPE select:除了重建连接外,将继续从打开的游标中获取数据,如果采用这种方式,普通 select操作也将在客户端产生开销;none:默认值,也可显示指定来禁用 failover功能
RETRIES
2. 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=:4200,racnode2.example.co m: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",ods);
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异常并重新执行失败的操作
FCF与TAF相比有如下不同:
1. FCF支持应用级别的连接重试,由应用来决定failover时如何处理,是重新执行,还是抛出异常;TAF只能在OCI/NET的层面进行重新连接
2. FCF与连接缓存很好地结合起来,让连接缓存管理器来管理缓存,失败的连接在缓存中会自动失效。而TAF在网络层面做预连接,当一个连接失效,连接缓存不能检测到
3. FCF基于Oracle RAC事件,可以快速为活跃/闲置的连接检测到故障
4. FCF通过实例的UP事件实现负载均衡,分配到在线的RAC实例中
oracle建议不要在一个应用中同时使用TAF和FCF
oracle 11g RAC 的一些基本概念(二)
集群的相关概念
配置Active/active集群