原文链接
[WK-T]ORACLE 10G 配置故障转移(Failover)blog.itpub.net![ab108a7c4049f9c44c50b94d7e4c8d8b.png](https://i-blog.csdnimg.cn/blog_migrate/466dd3a43c0344e05ac16cb24cecdcf9.jpeg)
文章参考:《大话 Oracle RAC 集群 高可用性 备份与恢复》 张晓明 编著
Oracle RAC 同时具备HA(High Availiablity) 和LB(LoadBalance). 而其高可用性的基础就是Failover(故障转移). 它指集群中任何一个节点的故障都不会影响用户的使用,连接到故障节点的用户会被自动转移到健康节点,从用户感受而言, 是感觉不到这种切换。
Oracle 10g RAC 的Failover 可以分为3种:
1. Client-Side Connect time Failover
2. TAF
3. Service-Side TAF
注意事项: 不能在listener.ora 文件中设置GLOBAL_NAME, 因为这个参数会禁用Connect-time Failover 和 Transparent Application Failover.
一.Client-Side Connect Time Failover
Client-Side Connect Time Failover的含义:如果用户端tnsname 中配置了多个地址,用户发起连接请求时,会先尝试连接地址表中的第一个地址,如果这个连接尝试失败,则继续尝试使用第二个地址,直至连接成功或者遍历了所有的地址。
这种Failover的特点:只在建立连接那一时刻起作用,也就是说,这种Failover方式只在发起连接时才会去感知节点故障,如果节点没有反应,则自动尝试地址列表中的下一个地址。一旦连接建立之后,节点出现故障都不会做处理,从客户端的表现就是会话断开了,用户程序必须重新建立连接。
启用这种Failover的方法就是在客户端的tnsnames.ora中添加FAILOVER=ON 条目,这个参数默认就是ON,所以即使不添加这个条目,客户端也会获得这种Failover能力。
示例:
在客户端的tnsnames.ora 配置如下:
![21ae1c3c2e9a1af82fdf461e08bedde0.png](https://i-blog.csdnimg.cn/blog_migrate/a768c244faccc003acb5ab33be588a48.jpeg)
批注:SERVER = DEDICATED 表示专用服务器模式设置,数据库将为每一个客户机连接分配专用资源。当预期客户机连接总数较小,或客户机向数据库发出的请求持续时间较长,使用该模式;SERVER = SHARED 表示共享服务器模式,多个客户端连接共享一个数据库分配的资源池,当大量用户需要同时连接数据库并且有效地利用系统资源时,使用此模式。
客户端连接测试:
1)会优先从节点rac1连接数据库
![e182317be922d7fbeac6bb15cf42671f.png](https://i-blog.csdnimg.cn/blog_migrate/543fcc520bf1e8f9b680d8153af05a0c.jpeg)
2)如果节点rac1出现故障,客户端的会话就会断开,不会自动连接到其他正常节点,需要重启会话建立连接
[oracle@rac1 ~]$ srvctl status instance -d orcl -i orcl1
Instance orcl1 is running on node rac1
[oracle@rac1 ~]$ srvctl stop instance -d orcl -i orcl1
[oracle@rac1 ~]$ srvctl status instance -d orcl -i orcl1
Instance orcl1 is not running on node rac1
![04e6b21edf84af8175aec5d4e5da4c32.png](https://i-blog.csdnimg.cn/blog_migrate/6b307b93d21359aefd45149316b27406.jpeg)
3)当rac1实例恢复正常之后,新的会话还会优先通过该节点连接数据库
[oracle@rac1 ~]$ srvctl status instance -d orcl -i orcl1
Instance orcl1 is not running on node rac1
[oracle@rac1 ~]$ srvctl start instance -d orcl -i orcl1
[oracle@rac1 ~]$ srvctl status instance -d orcl -i orcl1
Instance orcl1 is running on node rac1
![241be7b3e3ca4c7e340f7c52ab2f85a9.png](https://i-blog.csdnimg.cn/blog_migrate/666fd49793d3b25ee3c1f6c7051c96a6.jpeg)
二. TAF(Transparent Application Failover)
客户端连接故障切换最大的问题是,建立连接后如果节点发生故障,是不能做到故障转移的,这样数据库的可用性就会大打折扣,所以oracle又提供了TAF的方法来解决连接时的故障切换,所谓TAF,就是连接建立以后,应用系统运行过程中,如果某个实例发生故障,连接到这个实例上的用户会被自动迁移到其他的健康实例上。对于应用程序而言,这个迁移过程是透明的,不需要用户的介入,当然,这种透明要是有引导的,因为用户的未提交事务会回滚。 相对与Client-Side Connect Time Failover的用户程序中断,抛出连接错误,用户必须重启应用程序,TAF 这种方式在提高HA上有了很大的进步。
TAF 的配置也很简单,只需要在客户端的tnsnames.ora中添加FAILOVER_MODE配置项。这个条目有4个子项目需要定义。
1.METHOD: 用户定义何时创建到其实例的连接,有BASIC和PRECONNECT两种可选值。
BASIC: 是指在感知到节点故障时才创建到其他实例的连接。
PRECONNECT: 是在最初建立连接时就同时建立到所有实例的连接,当发生故障时,立刻就可以切换到其他链路上。
两种方法比较: BASIC方式在Failover时会有时间延迟,PRECONNECT方式虽然没有时间延迟,但是建立多个冗余连接会消耗更多资源。
2.TYPE:用于定义发生故障时对完成的SQL 语句如何处理,其中有2种类型:session和select.
这两种方式对于未提交的事务都会自动回滚,区别在于对select 语句的处理,对于select,用户正在执行的select语句会被转移到新的实例上,在新的节点上继续返回后续结果集,而已经返回的记录集则抛弃。
假设用户正在节点1上执行查询,整个结果集共有100条记录,现在已从节点1上返回10条记录,这时节点1宕机,用户连接被转移到节点2上,如果是session模式,则需要重新执行查询语句;如果是select方式,会从节点2上继续返回剩下的90天记录,而已经从节点1返回的10条记录不会重复返回给用户,对于用户而言,感受不到这种切换。
显然为了实现select 方式,Oracle 必须为每个session保存更多的内容,包括游标,用户上下文等,需要更多的资源也是用资源换时间的方案。
3.DELAY和RETRIES 这两个参数代表重试间隔时间和重试次数。
示例:
在客户端的tnsnames.ora 配置如下:
![acc56e91be0822f93ed0634200f3fd17.png](https://i-blog.csdnimg.cn/blog_migrate/866852ac0e325fcfcdb30330fc4900ce.jpeg)
客户端连接测试:
1)因为节点rac1是正常的,所以会从该节点连接到数据库
![a1da16088f279c3bd7985b1f9174a8f9.png](https://i-blog.csdnimg.cn/blog_migrate/7a537c9d4d5403e44ee52a0a083fa8e0.jpeg)
2)关闭节点rac1,当前会话会自动切换到正常节点连接数据库
![ebc92fe9c87d86c9bc591b9027bda61a.png](https://i-blog.csdnimg.cn/blog_migrate/9de93a8d5712fa9c023a66f77cec0a53.jpeg)
补充:查看用户连接的TAF配置,如下
![669617b168304db7a6f01c4488fda4ef.png](https://i-blog.csdnimg.cn/blog_migrate/1d84367af622e4033aa445f2ca3cf602.jpeg)
批注:查询结果中如果是NONE,说明这个连接没有使用TAF;如果和客户端tnsnames.ora配置中的相同,说明使用了TAF。
三.Service-Side TAF
Service-Side TAF,服务器透明故障转移可以看作是TAF的一个变种。首先Service-Side TAF也是TAF,所有TAF的特点它都具有;其次,这种TAF是在服务器
上配置的,而不像TAF在客户端配置的。
Client-Side TAF 配置过程需要修改客户端的tnsnames.ora文件,如果有很多客户端使用这个数据库,那么每次微小的参数调整都要把所有客户端的
tnsnames.ora都调整一遍,既低效又易出错。而Service-Side TAF通过结合Service,在数据库里保存FAIL-MODE的配置,把所有的TAF配置保存在数据字典
中,从而省去了客户端的配置工作。
从配置参数而言,Service-Side TAF和TAF相比多了一个Instance Role 的概念。所谓实例Instance Role就是当多个Instance参与一个Service时,可以配置优化
使用哪一个Instance为用户提供服务。用户共享两种可选角色。
PREFERRED:首选实例,会优先选择拥有这个角色的实例提供服务。
AVAILABLE:后备实例,用户连接会优先选择PREFERRED的Instance,当PREFERRED的Instance不可用时,才会转到AVAILABLE的Instance上。
要使用Service-Side TAF必须配置Service。Service 可以在创建数据库时创建,也可以在数据库创建之后修改;既可以通过配置向导也可以通过命令方式进行
配置。
下面分别演示采用DBCA和手工两种方式配置Service的过程。
方式一:使用DBCA配置Service
1)oracle用户下运行DBCA出现欢迎界面
![291d950e49d64da981653004db42af7c.png](https://i-blog.csdnimg.cn/blog_migrate/44a015aad1baddd98982694c75804de2.jpeg)
2)在已有的RAC数据库上创建新的Service,此处选择"Service Management"
![09239fdfb4175879dec8088b3bbe8281.png](https://i-blog.csdnimg.cn/blog_migrate/d7275783edd4e462a10ff11dd0588cd6.jpeg)
3)选择要配置Service的数据库
![dd0ae31a6961323c920fd03811708ea8.png](https://i-blog.csdnimg.cn/blog_migrate/0798c424f243f86b238b34eb05038c8b.jpeg)
4)添加Service名字以及定义实例角色
![7996ef313c0d9e0eaba400820b30e31b.png](https://i-blog.csdnimg.cn/blog_migrate/4ed908921f0a9e30a13d64eafebad8a2.jpeg)
5)查看配置的Service是否创建成功
[oracle@rac1 ~]$ crs_stat -t -v
Name Type R/RA F/FT Target State Host
----------------------------------------------------------------------
ora.HHPEN1.db application 0/1 0/1 OFFLINE OFFLINE
ora.orcl.db application 0/1 0/1 ONLINE ONLINE rac2
ora....l1.inst application 0/5 0/0 ONLINE ONLINE rac1
ora....l2.inst application 0/5 0/0 ONLINE ONLINE rac2
ora...._TAF.cs application 0/0 0/1 ONLINE ONLINE rac1
ora....cl1.srv application 0/0 0/0 ONLINE ONLINE rac1
ora....SM1.asm application 0/5 0/0 ONLINE ONLINE rac1
ora....C1.lsnr application 0/5 0/0 ONLINE ONLINE rac1
ora.rac1.gsd application 0/5 0/0 ONLINE ONLINE rac1
ora.rac1.ons application 0/3 0/0 ONLINE ONLINE rac1
ora.rac1.vip application 0/0 0/0 ONLINE ONLINE rac1
ora....SM2.asm application 0/5 0/0 ONLINE ONLINE rac2
ora....C2.lsnr application 0/5 0/0 ONLINE ONLINE rac2
ora.rac2.gsd application 0/5 0/0 ONLINE ONLINE rac2
ora.rac2.ons application 0/3 0/0 ONLINE ONLINE rac2
ora.rac2.vip application 0/0 0/0 ONLINE ONLINE rac2
SQL> show parameter service;
NAME TYPE VALUE
------------------------------------ -------- ------------------------------
service_names string orcl, orcl_TAF6)如果客户端想要通过service方式连接数据库,需要在TNS条目中使用service_name方式引用数据库。
7)修改Service的TAF配置,需要使用dbms_service.modify_service
![bcf54909b4d082d0f2f1d8caebd84424.png](https://i-blog.csdnimg.cn/blog_migrate/00266fda7cb295a2299f326220f3c572.jpeg)
批注:无论使用DBCA还是srvctl命令来配置Service,都无法配置TAF的type、delay、retries这三个属性。必须使用dbms_service包来修改这些属性。
8)确认修改已经生效
![5d8652010401a1dc10e5c1470ce2f71c.png](https://i-blog.csdnimg.cn/blog_migrate/6d0af990c495c0c17568e5e1bc3b2158.png)
方式二:使用命令配置Service
1)创建Service语法如下:
srvctl add service -d -s -r "preferred-instance-list" -a "avaiable-instance-list" -p
批注:其中TAF-policy选项可以是BASIC或PRECONNECT
2)查看配置
srvctl config service -d database-name [-s service-name] [-a]
客户端连接测试:
在ORACLE 10G中配置了Service-Side TAF之后,客户端甚至不需要tnsnames.ora文件,而是使用ORACLE 10G提供的新连接方法Easy Connect Naming
Methods。为了展示这一特性,测试之前先把客户端的tnsnames.ora文件改名存放,以保证客户端在没有TNS的情况下进行这个测试。使用Easy Connect
Naming Methods时的连接串格式如下:
username/password@[//]host[:port][/service_name]
客户端连接操作如下:
![7ff33321406271faadc939d346c3371e.png](https://i-blog.csdnimg.cn/blog_migrate/b4dba0450ce66a66aac773e2f30b91fa.jpeg)
批注:该连接对应的server process的OS PID是14469,在操作系统上杀掉这个进程。
[oracle@rac1 ~]$ ps -ef|grep 14469
oracle 14469 1 0 19:47 ? 00:00:00 oracleorcl1 (LOCAL=NO)
oracle 18000 17607 0 19:50 pts/3 00:00:00 grep 14469
[oracle@rac1 ~]$ kill -9 14469当前会话查询实例名和运行状态,此时会话已断开如下:
![77aad6a3bafa916521a240a0d9b7b4a6.png](https://i-blog.csdnimg.cn/blog_migrate/9895e92995c394e4053e2659a704e2ac.jpeg)
批注:按理说应该会跳转到rac2节点上,肯定哪个地方配置错了,稍后重新再看看。
上述方法没奏效,我选择关闭节点rac1的实例,验证结果。
![81ea9d43d19fc0511aea4e94e8d821ac.png](https://i-blog.csdnimg.cn/blog_migrate/707096d8a61ee7e8a72643f7ba5edda2.png)
![ca523f84a0b1317241d6ee19e0d3554d.png](https://i-blog.csdnimg.cn/blog_migrate/08782dc189633b162c6e1a08f0214425.jpeg)
补充:相同环境进行测试failover
1.客户端连接并查询会话ID
![ff8bcdd946240451f4297f741f3d0356.png](https://i-blog.csdnimg.cn/blog_migrate/bd644129b2bc310ca4329408d5d500fc.jpeg)
2.通过session ID在服务器端操作系统中删除该会话连接
![b5420569679fd3a128d2508cc0a60466.png](https://i-blog.csdnimg.cn/blog_migrate/8bc5d32437fc87f74b8d3ca6df4db744.png)
![e1167edc96cc6c1a61129d80e02882fb.png](https://i-blog.csdnimg.cn/blog_migrate/79856142247d71e371c5a7925f6d73a9.png)
3.会话并没有断开,服务器为其分配一个新的session ID
![39686220d23e434f4eff25de83af052a.png](https://i-blog.csdnimg.cn/blog_migrate/c7cd950c6568913e43efd3b4848c4564.jpeg)
![a1f83e7203c47a8e6f6ce9a7c732fd68.png](https://i-blog.csdnimg.cn/blog_migrate/45b487fcdf8f1336ba794ba8094e33ad.jpeg)
批注:当客户端连接集群数据库时,由于某些原因session ID被异常终端,已经配置了服务器端的故障转移,该会话并不会终端,而是服务器为其分配一个
新的session ID,继续通过当前会话为用户提供对数据库的操作。如果当前会话连接的实例宕掉,会自动去寻找备用实例。