一、什么是TAF
Transparent Application Failover ,透明应用程序故障转移,当客户端和oracle数据库建立连接后,正在执行某个应用,此时客户端连接的某个实例突然宕机,那么客户端的连接就会被转移到其他健康实例上去, 对于客户端的taf,如果执行的是update,insert等事物语句,那么就会回退,如果是select语句,那么会转移到新的实例继续执行,这个过程不需要用户的的介入,是透明的。
TAF 是和下列类型的故障转移
-
Oracle Real Application Clusters
-
Replicated systems
-
Standby databases
-
Single instance Oracle database
二:net service参数:
Parameter | Description |
---|---|
FAILOVER | 在连接监听的时候,如果FAILOVER=on,在连接地址列表中的第一个地址,监听连接失败,指示net去连接地址列表中的其他监听,当FAILOVER=on=off 时,只会连接地址列表中的第一地址的监听, Connect-time failover is turned When using a connect descriptor with a |
LOAD_BALANCE | 当LOAD_BALANCE =on 那么指示net progress 以随机的方式连接地址列表中地址,在不同监听之间平衡负载压力。当LOAD_BALANCE =off 是让net progress 安顺序访问地址列表的监听,直到连接成功为止. Client load balancing is turned |
SOURCE_ROUTE | When set to |
Creating a List of Listener Protocol Addresses
sales.us.example.com= (DESCRIPTION= (ADDRESS_LIST= (ADDRESS=(PROTOCOL=tcp)(HOST=sales1-server)(PORT=1521)) (ADDRESS=(PROTOCOL=tcp)(HOST=sales2-server)(PORT=1521))) (CONNECT_DATA= (SERVICE_NAME=sales.us.example.com)))
Option | Parameter Setting |
---|---|
Try each address, in order, until one succeeds. | FAILOVER=on |
Try each address, randomly, until one succeeds. | LOAD_BALANCE=on FAILOVER=on |
Try one address, selected at random. | LOAD_BALANCE=on |
Use each address in order until destination reached. | SOURCE_ROUTE=on |
Use only the first address. | LOAD_BALANCE=off FAILOVER=off SOURCE_ROUTE=off |
sales.us.example.com= (DESCRIPTION= (ADDRESS_LIST= (LOAD_BALANCE=off) (FAILOVER=ON) (ADDRESS=(PROTOCOL=tcp)(HOST=sales1-server)(PORT=1521)) (ADDRESS=(PROTOCOL=tcp)(HOST=sales2-server)(PORT=1521))) (CONNECT_DATA=(SERVICE_NAME=sales.us.example.com)))
三、TAF 参数
BACKUP | A different net service name for backup connections. A backup should be specified when using |
DELAY | 每次重试的时间间隔. 如果 |
METHOD | 设置快速转移从 primary node 到 backup node:
|
RETRIES | 故障转移重试的次数,如果指定了DELAY,那么默认重试5次,If a callback function is registered, then this parameter is ignored. |
TYPE | 故障转移的类型. Three types of Oracle Net failover functionality are available by default to Oracle Call Interface (OCI) applications:
|
四、举例
TAF with Connect-Time Failover and Client Load Balancing
sales.us.example.com= (DESCRIPTION= (LOAD_BALANCE=on) ----随机访问一个监听,直到成功 (FAILOVER=on) (ADDRESS= (PROTOCOL=tcp) (HOST=sales1-server) (PORT=1521)) (ADDRESS= (PROTOCOL=tcp) (HOST=sales2-server) ---ip地址或者主机名 (PORT=1521)) (CONNECT_DATA= (SERVICE_NAME=sales.us.example.com) (FAILOVER_MODE= (TYPE=select) --select方式的故障转移 (METHOD=basic))))
此方式建立的的故障转移,只能故障转移select语句,例如 updateinsert 语句在failover后操作会回退。
commit
*
第 1 行出现错误:
ORA-25402: 事务处理必须重新运行
TAF Retrying a Connection
sales.us.example.com= (DESCRIPTION= (ADDRESS= (PROTOCOL=tcp) (HOST=sales1-server) (PORT=1521)) (CONNECT_DATA= (SERVICE_NAME=sales.us.example.com) (FAILOVER_MODE= (TYPE=select) (METHOD=basic) (RETRIES=20) (DELAY=15)))) ----TAF重新连接的时间,每次重试连接间隔15秒,总共重试20次,故障转移类型为select方式
TAF Pre-establishing a Connection
sales1.us.example.com= (DESCRIPTION= (ADDRESS= (PROTOCOL=tcp) (HOST=sales1-server) (PORT=1521)) (CONNECT_DATA= (SERVICE_NAME=sales.us.example.com) (INSTANCE_NAME=sales1) (FAILOVER_MODE= (BACKUP=sales2.us.example.com) -----此backup指向下面红色字体 (TYPE=select) (METHOD=preconnect)))) sales2.us.example.com= (DESCRIPTION= (ADDRESS= (PROTOCOL=tcp) (HOST=sales2-server) (PORT=1521)) (CONNECT_DATA= (SERVICE_NAME=sales.us.example.com) (INSTANCE_NAME=sales2) (FAILOVER_MODE= (BACKUP=sales1.us.example.com) (TYPE=select) (METHOD=preconnect))))
通过测试此预连接方式,只能故障转移已经连接到数据库上的连接select。如果已经发生故障,再去连接sales1.us.example.com是连接不上的. 发生故障前连接到发生故障的数据库的update ,在发生故障时没有提交的会回退。
Specifying the Instance Role for Primary and Secondary Instance Configurations
instance_role 在下列情况使用:
1、你想明确指定连接到第一个实例还是第二个实例上去,默认是连接到第一个实例,主实例上。
2、你想使用taf预连接到第二实例上去。
The INSTANCE_ROLE
值有:
-
primary
: 指定连接到 primary instance. -
secondary
: 指定连接到secondary instance. -
any
: 可以连接到连接地址里的任何一个实例。
Connection to Instance Role Type
sales_primary= (DESCRIPTION= (ADDRESS= (PROTOCOL=tcp) (HOST=sales1-server) (PORT=1521)) (ADDRESS= (PROTOCOL=tcp) (HOST=sales2-server) (PORT=1521)) (CONNECT_DATA= (SERVICE_NAME=sales.us.example.com) (INSTANCE_ROLE=primary))) sales_secondary= (DESCRIPTION= (ADDRESS= (PROTOCOL=tcp) (HOST=sales1-server) (PORT=1521)) (ADDRESS= (PROTOCOL=tcp) (HOST=sales2-server) (PORT=1521)) (CONNECT_DATA= (SERVICE_NAME=sales.us.example.com) (INSTANCE_ROLE=secondary)))
Connection To a Specific Instance
sales1= (DESCRIPTION= (ADDRESS= (PROTOCOL=tcp) (HOST=sales1-server) (PORT=1521)) (CONNECT_DATA= (SERVICE_NAME=sales.us.example.com) (INSTANCE_ROLE=any) (INSTANCE_NAME=sales1) (SERVER=dedicated))) sales2= (DESCRIPTION= (ADDRESS= (PROTOCOL=tcp) (HOST=sales2-server) (PORT=1521)) (CONNECT_DATA= (SERVICE_NAME=sales.us.example.com) (INSTANCE_ROLE=any) (INSTANCE_NAME=sales2) (SERVER=dedicated)))
TAF Pre-Establishing a Connection
sales1.example.com= (DESCRIPTION= (ADDRESS= (PROTOCOL=tcp) (HOST=sales1-server) (PORT=1521)) (CONNECT_DATA= (SERVICE_NAME=sales.us.example.com) (INSTANCE_ROLE=primary) (FAILOVER_MODE= (BACKUP=sales2.example.com) (TYPE=select) (METHOD=preconnect)))) sales2.example.com= (DESCRIPTION= (ADDRESS= (PROTOCOL=tcp) (HOST=sales2-server) (PORT=1521)) (CONNECT_DATA= (SERVICE_NAME=sales.us.example.com) (INSTANCE_ROLE=secondary)))
通过语句可以查看是否已经发生了故障转移,以及故障转移的方式
SQL> SELECT MACHINE, FAILOVER_TYPE, FAILOVER_METHOD, FAILED_OVER, COUNT(*) FROM V$SESSION
GROUP BY MACHINE, FAILOVER_TYPE, FAILOVER_METHOD, FAILED_OVER;MACHINE FAILOVER_TYPE FAILOVER_M FAI COUNT(*)
---------------------------------------------------------------- ------------- ---------- --- ----------
rac1 NONE NONE NO 46
rac1 SESSION BASIC YES 1
http://docs.oracle.com/cd/E11882_01/network.112/e10836/advcfg.htm#NETAG332