所谓TAF,就是连接建立以后,应用系统运行过程中,如果某个实例发生故障,连接到这个实例上的用户会被自动迁移到其他的健康实例上。对于应用程序而言,这个迁移过程透明,不需要用户的介入,当然这种透明也是有引号的,因为用户的未提交事务会回滚。相对于Client-Side Connect Time Failover的用户程序被中断,抛出连接错误,用户必须重启应用程序,TAF这种方式在提高应用程序HA能力上无疑是前进了一大步。
TAF的配置也很简单,只需要在客户端的tnsname项目中添加FAILOVER_MODE配置项,这个条目有4个子项目需要定义。
(1)METHOD选项用于定义何时创建到其他实例的连接,有BASIC和PRECONNECT两个可选值
(2)Type选项用于定义发生故障时对完成的SQL语句如何处理,其有两种类型:session和select。
这两种方式对于未提交事务都自动回滚,区别在于对select语句的处理,对于后一种类型,用户正在执行的select语句也会被转移到新的实例上,在新节点上继续返回后续结果集,而已经返回的记录集抛弃。
假设用户正在节点1上执行查询,真个结果集共有100条记录,现在已从节点1返回10条记录,这时节点1宕机,用户连接被转移到节点2上,如果是session方式,则需要重新执行查询语句;如果是select方式会从节点2上继续返回剩下的90条记录,而已经从节点1返回的10条记录不会重复返回给用户,对于用户而言感觉不到这种切换。
很显然为了实现select方式,Oracle必须为每个session保存更多的内容,包括游标,用户上下文等,需要更多的资源也是用资源换时间的方案。
(3)DELAY和RETRIES这两个参数很简单,代表重试间隔时间和重试次数。
使用TAF的TNS配置如下,其中粗体部分是TAF内容:
wxxrdb_taf =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = dbs-vip)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = dbp-vip)(PORT = 1521))
(LOAD_BALANCE = yes)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = wxxrdb)
(FAILOVER_MODE =
(TYPE = session)
(METHOD = basic)
(RETRIES = 180)
(DELAY = 5)
)
)
)
TAF的配置也很简单,只需要在客户端的tnsname项目中添加FAILOVER_MODE配置项,这个条目有4个子项目需要定义。
(1)METHOD选项用于定义何时创建到其他实例的连接,有BASIC和PRECONNECT两个可选值
- BASIC是指在感知到节点故障时才创建到其他实例的连接。
- PRECONNECT是在最初建立连接时就同时建立到所有实例的连接,当发生故障时,立刻就可以切换到其他链路上。
(2)Type选项用于定义发生故障时对完成的SQL语句如何处理,其有两种类型:session和select。
这两种方式对于未提交事务都自动回滚,区别在于对select语句的处理,对于后一种类型,用户正在执行的select语句也会被转移到新的实例上,在新节点上继续返回后续结果集,而已经返回的记录集抛弃。
假设用户正在节点1上执行查询,真个结果集共有100条记录,现在已从节点1返回10条记录,这时节点1宕机,用户连接被转移到节点2上,如果是session方式,则需要重新执行查询语句;如果是select方式会从节点2上继续返回剩下的90条记录,而已经从节点1返回的10条记录不会重复返回给用户,对于用户而言感觉不到这种切换。
很显然为了实现select方式,Oracle必须为每个session保存更多的内容,包括游标,用户上下文等,需要更多的资源也是用资源换时间的方案。
(3)DELAY和RETRIES这两个参数很简单,代表重试间隔时间和重试次数。
使用TAF的TNS配置如下,其中粗体部分是TAF内容:
wxxrdb_taf =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = dbs-vip)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = dbp-vip)(PORT = 1521))
(LOAD_BALANCE = yes)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = wxxrdb)
(FAILOVER_MODE =
(TYPE = session)
(METHOD = basic)
(RETRIES = 180)
(DELAY = 5)
)
)
)
摘至张晓明的《大话Oracle RAC》