Oracle 10g RAC HA详解

        Oracle RAC高可用性的基础是Failover,就是指集群中任何一个节点的故障都不会影响用户使用,连接到故障节点的用户会被自动转移到健康节点,从用户感受而言感觉不到这种切换,这个功能在Oracle中被称作Failover(故障转移)。

Oracle 10g RAC 的Failover可以细分为3种,分别是:
1.Client-Side Connect time Failover;
2.TAF;
3.Service-Side TAF。

注意:不要再listener.ora中设置GLOBAL_DB_NAME,因为这个参数会禁用Connect-time Failover和Transparent Application Failover。

Client-Side Connect time Failover
        如果客户端tnsname中配置了多个地址,用户发起连接请求时,会先尝试地址表中的第一个地址,如果这个连接尝试失败,则继续尝试使用第二个地址,直至连接成功或者遍历了所有的地址。这种Failover的特点从它的名称中“Connect Time”就表达得很清楚了,只在建立连接那一时刻起作用。也就是说,这种Failover方式只在发起连接时才去感知节点故障,如果发现节点没有响应,则自动尝试地址列表中的下一个地址。一旦连接建立之后,节点出现故障都不会做处理,从客户端的表现就是会话断开,用户程序必须重新建立连接。
        启用这种Failover的方法就是在客户端的tnsnames.ora中添加FAILOVER=ON条目,这个参数默认就是ON,所以即使不添加这个条目,客户端也会获得这种Failover能力。

TAF(Transparent Application Failover
        所谓TAF,就是连接建立以后,应用系统运行过程中,如果某个实例发生故障,连接到这个实例上的用户会被自动迁移到其他的健康实例上。对于应用程序而言,这个迁移过程透明、不需要用户的介入,当然这种透明也是有引号的,因为用户的未提交事务会回滚。相对于Client-Side Connect Time Failover的用户程序被中断、抛出连接错误、用户必须重启应用程序,TAF这种方式在提高应用程序HA能力上无疑是前进了一大步。
        TAF的配置很简单,只需要在客户端的tnsname项目中添加FAILOVER_MODE配置项,这个条目有4个子项目需要定义。
(1)METHOD选项用于定义何时创建到其他实例的连接,有BASIC和PERCONNECT两个可选值。
● BASIC 是指在感知到节点故障时才创建到其他实例的连接。
● PERCONNECT 是在最初建立连接时就同事建立到所有实例的连接,当发生故障时,立刻就可以切换到其他链路上。

(2)TYPE选项用于定义发生故障时对完成的SQL语句如何处理,有两种类型:session和select。两种方式对于未提交的事物都自动回滚。区别在于对于select语句的处理。
 SESSION 如果节点宕机,用户连接被转移到另一个节点上,需要重新执行查询语句
 SELECT 
用户正在执行的select语句会被转移到新的实例上,在新节点上继续返回后续结果集,而已经返回的记录集抛弃。显然为了实现select方式,Oracle必须为每个session保存更多的内容,包括游标、用户上下文等。

(3)DELAYRETRIES这两个参数代表重试间隔时间和重试次数。

Client-Side Failover和TAF的对照实验
1.测试方法
        Clinet-Side Connect Time Failover和TAF两种方式都是在客户端配置,因此这个实验中,需要在客户机上配置两个TNS条目,然后分别建立数据库连接,通过在服务器端杀进程的方式模拟数据库故障,然后观察两个连接的后续反应,流程如下:
(1)两个节点的RAC,两个节点分别是node1-vip和node2-vip;
(2)客户端的tnsnames.ora配置两个条目,分别使用两种Failover;
(3)客户端利用这两个条目,打开两个窗口,建立两个连接,做一些操作;
(4)在服务器上kill掉两个连接对应的Server Process来模拟节点故障(也可以重启节点);
(5)经过一个短暂时间后,使用TAF的连接会自动转移到其他实例上,用户可以继续在这个窗口中执行语句;
(6)使用Client-Side connect time Failover的连接不会自动 转移,用户必须重新连接。

2.测试步骤
(1)编辑客户端tnsnames.ora文件,在其中添加两个条目,分别使用两种Failover机制:mtxdb_cl对应Client-Side,mtxdb_taf对应TAF。
使用Client-Side Connect time Failover的TNS配置如下:
mtxdb_cl =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.29.23)(PORT = 1521))
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.29.24)(PORT = 1521))
    (LOAD_BALANCE = yes)
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = mtxdb)
    )
  )

mtxdb_taf =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.29.23)(PORT = 1521))
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.29.24)(PORT = 1521))
    (LOAD_BALANCE = yes)
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = mtxdb)
      (FAILOVER_MODE =
        (TYPE = session)
        (METHOD = basic)
        (RETRIES = 180)
        (DELAY = 5)
      )
    )
  )

(2)开启两个窗口,分别使用两个TNS进行连接,为了区分这两个连接,这里使用了两个用户HR和SCOTT。

第一个窗口,使用Client-Side Failover TNS:
sqlplus hr/hr@mtxdb_cl

第二个窗口,使用TAF TNS:
sqlplus scott/tiger@mtxdb_taf

(3)在两个窗口执行语句。
在第一个窗口中,查看用户连接到的实例:
HR@mtxdb_cl>select instance_name from v$instance;

INSTANCE_NAME
------------------------------------------------
mtxdb2

查看用户连接的TAF配置:
HR@mtxdb_cl>select username,failover_type,failover_method from v$session where username in ('HR','SCOTT');

USERNAME   FAILOVER_T FAILOVER_M
---------- ---------- ----------
HR    NONE       NONE

第二个窗口中,查看用户连接到的实例:
SCOTT@mtxdb_taf>select instance_name from v$instance;

INSTANCE_NAME
------------------------------------------------
mtxdb2

查看用户连接的TAF配置
SCOTT@mtxdb_taf>select username,failover_type,failover_method from v$session where username='SCOTT';

USERNAME   FAILOVER_T FAILOVER_M
---------- ---------- ----------
SCOTT    SESSION    BASIC

(4)在服务端杀掉两个连接对应的Server Process。
SQL> select pid,spid from v$process                                  
  2  where addr in (
  3  select paddr from v$session where username in ('HR','SCOTT'));

       PID SPID
---------- ------------
22 27664
25 28057
使用“kill -9”命令杀掉两个OS进程:
[oracle@node2 admin]$ ps -ef | grep LOCAL=NO| grep -v grep
oracle   27664     1  0 01:33 ?        00:00:00 oraclemtxdb2 (LOCAL=NO)
oracle   28057     1  0 01:34 ?        00:00:00 oraclemtxdb2 (LOCAL=NO)
[oracle@node2 admin]$ kill -9 27664
[oracle@node2 admin]$ kill -9 28057


(5)返回到两个窗口,再次执行SQL语句,两个连接都抛出相同的错误。
HR @mtxdb_cl>select  instance_name from v$instance;
select instance_name from v$instance
*
ERROR at line 1:
ORA-03113: end-of-file on communication channel
Process ID: 0
Session ID: 142 Serial number: 2190

SCOTT @mtxdb_taf>select instance_name from v$instance;
select instance_name from v$instance
*
ERROR at line 1:
ORA-03113: end-of-file on communication channel
Process ID: 0
Session ID: 148 Serial number: 6170

(6)稍等几秒后,再次执行语句,两个窗口的结果不同。
第一个窗口:
HR@mtxdb_cl>select  instance_name from v$instance;
ERROR:
ORA-03114: not connected to ORACLE

第二个窗口:
SCOTT@mtxdb_taf>select instance_name from v$instance;

INSTANCE_NAME
------------------------------------------------
mtxdb2

        使用TAF的窗口,用户查询正常执行,说明用户连接已经被Failover。因为模拟过程不是重启实例或节点,而只是杀掉进程,所以用户并没有迁移到新的实例,仍是连接到原实例。通过这个实验,很清楚的认识到两种Failover方式的区别,下面看看第三种,Server-Side TAF。

Server-Side TAF
        Server-Side TAF可以看作是TAF的一个变种,首先Server-Side TAF也是TAF,所有TAF的特点它都具有;其次,这种TAF是在服务器上配置的。通过结合Service,在数据库里保存FAIL_MODE配置,把所有的TAF配置保存在数据字典中,从而省去了客户端的配置工作,现在客户端的TNS文件就不需要任何TAF的配置选项。配置Server-Side TAF涉及到以下参数:
●  PREFERRED  首选实例,会优先选择拥有这个角色的实例提供服务。
AVALIABLE  后备实例,用户连接会优先连接PREFERRED的Instance,当PREFERRED的Instance不可用时,才会被转到AVALIABLE的Instance上。
        要想使用Server-Side TAF必须配置Service。Service可以在创建数据库时创建,也可以在数据库创建之后修改;既可以通过配置向导也可以通过命令行方式配置。本篇主要介绍命令行方式配置。

1.配置Service
(1)创建Service。语法如下:
srvctl add service -d -s -r "preferred-instance" -a "available-instance" -P
注:TAF-policy选项可以为BASIC或PRECONNECT。
(2)查看配置。
sevctl config service -d database-name [-s service-name] [-a]

如果不指定“-s service-name”,就会显示所有的service配置,这些配置只包括preferred和available instance。使用-a选项,还会显示TAF的信息。
(3)是否自动运行service
srvctl enable/disable service -d database-name -s service-name -i instance-name
(4)启动service
srvctl start service -d -s -i instance-name -o start-option -c connect-string -q
如果不指定service-name,则所有的service都会被启动;可以使用逗号分隔方式,同时启动多个service。-i指定在哪个实例上启动service。
(5)
停止service
srvctl stop service -d -s -i instance-name -c connect-string -q -f
其中-f选项可以强制关闭service,并中断了其所有的用户连接。
(6)查看service状态。
srvctl status service -d database-name -s service-name -f -v
其中-f选项 可以显示被disable的instance信息,而-v选项表示详细输出。
(7)删除service。
srvctl remove service -d database-name -s service-name -i instance-name [-f]

下面通过实验演示如何创建一个名为OLTP的Service

(1)查看系统现有的Service。
SQL> show parameter service

NAME      TYPE VALUE
------------------------------------ ----------- ------------------------------
service_names      string mtxdb

(2)使用srvctl命令创建OLTP服务。
[oracle@node2 ~]$ srvctl add service -d mtxdb -s oltp -r mtxdb1 -a mtxdb2 -P basic

(3)确认服务创建成功。
[oracle@node2 ~]$ crs_stat -t -v
Name           Type           R/RA   F/FT   Target    State     Host        
----------------------------------------------------------------------
ora.mtxdb.db   application    0/0    0/1    ONLINE    ONLINE    node1       
ora....b1.inst application    0/5    0/0    ONLINE    ONLINE    node1       
ora....b2.inst application    0/5    0/0    ONLINE    ONLINE    node2       
ora....oltp.cs application    0/0    0/1    OFFLINE   OFFLINE
ora....db1.srv application    0/0    0/0    OFFLINE   OFFLINE
ora....db2.srv application    0/0    0/0    OFFLINE   OFFLINE
ora....SM1.asm application    0/5    0/0    ONLINE    ONLINE    node1       
ora....E1.lsnr application    0/5    0/0    ONLINE    ONLINE    node1       
ora.node1.gsd  application    0/5    0/0    ONLINE    ONLINE    node1       
ora.node1.ons  application    0/3    0/0    ONLINE    ONLINE    node1       
ora.node1.vip  application    0/0    0/0    ONLINE    ONLINE    node1       
ora....SM2.asm application    0/5    0/0    ONLINE    ONLINE    node2       
ora....E2.lsnr application    0/5    0/0    ONLINE    ONLINE    node2       
ora.node2.gsd  application    0/5    0/0    ONLINE    ONLINE    node2       
ora.node2.ons  application    0/3    0/0    ONLINE    ONLINE    node2       
ora.node2.vip  application    0/0    0/0    ONLINE    ONLINE    node2

(4)配置这个服务自动启动。
[oracle@node2 ~]$ srvctl enable service -d mtxdb -s oltp
PRKP-1018 : Service oltp already enabled.

(5)启动这个服务。
[oracle@node2 ~]$ srvctl start service -d mtxdb -s oltp

(6)确认服务状态,ONLINE表示启动。

[oracle@node2 ~]$ crs_stat -t -v
Name           Type           R/RA   F/FT   Target    State     Host        
----------------------------------------------------------------------
ora.mtxdb.db   application    0/0    0/1    ONLINE    ONLINE    node1       
ora....b1.inst application    0/5    0/0    ONLINE    ONLINE    node1       
ora....b2.inst application    0/5    0/0    ONLINE    ONLINE    node2       
ora....oltp.cs application    0/0    0/1    ONLINE    ONLINE    node1
ora....db1.srv application    0/0    0/0    ONLINE    ONLINE    node1
ora....db2.srv application    0/0    0/0    OFFLINE   OFFLINE    node2
ora....SM1.asm application    0/5    0/0    ONLINE    ONLINE    node1       
ora....E1.lsnr application    0/5    0/0    ONLINE    ONLINE    node1       
ora.node1.gsd  application    0/5    0/0    ONLINE    ONLINE    node1       
ora.node1.ons  application    0/3    0/0    ONLINE    ONLINE    node1       
ora.node1.vip  application    0/0    0/0    ONLINE    ONLINE    node1       
ora....SM2.asm application    0/5    0/0    ONLINE    ONLINE    node2       
ora....E2.lsnr application    0/5    0/0    ONLINE    ONLINE    node2       
ora.node2.gsd  application    0/5    0/0    ONLINE    ONLINE    node2       
ora.node2.ons  application    0/3    0/0    ONLINE    ONLINE    node2       
ora.node2.vip  application    0/0    0/0    ONLINE    ONLINE    node2

SQL> show parameter service

NAME      TYPE VALUE
------------------------------------ ----------- ------------------------------
service_names      string mtxdb, oltp

(7)修改Service的TAF配置,需要使用dbms_service.modify_service这个包
SQL> begin
  2  dbms_service.modify_service(
  3  service_name=>'oltp',
  4  failover_method=>dbms_service.failover_method_basic,
  5  failover_type=>dbms_service.failover_type_select,
  6  failover_retries=>180,
  7  failover_delay=>5
  8  );
  9  end;
 10  /

(8)确认修改生效
[oracle@node1 ~]$ srvctl config service -d mtxdb -s oltp -a
oltp PREF: mtxdb1 AVAIL: mtxdb2 TAF: basic

2.测试Service-Side TAF
(1)从一个客户端连接,并且窗口一直保持打开(通过IP和端口号的方式连接):
[oracle@Oracle11g admin]$ sqlplus scott/tiger@192.168.29.23:1521/oltp

(2)执行查询
SCOTT@192.168.29.21:1521/oltp>select  instance_name from v$instance;

INSTANCE_NAME
------------------------------------------------
mtxdb1

(3)在实例1上杀掉进程
SQL> select pid,spid from v$process
  2  where addr in (select paddr from v$session where username='SCOTT');

       PID SPID
---------- ------------
34 12198

[oracle@node1 ~]$ kill -9 12198

(4)在会话中继续执行语句,稍等之后发现用户已经重新连接
SCOTT@192.168.29.23:1521/oltp>select  instance_name from v$instance;
select instance_name from v$instance
*
ERROR at line 1:
ORA-03113: end-of-file on communication channel
Process ID: 0
Session ID: 131 Serial number: 30

SCOTT@192.168.29.23:1521/oltp>select  instance_name from v$instance;

INSTANCE_NAME
------------------------------------------------
mtxdb1

测试完毕后,清理环境,删除service
[oracle@node1 ~]$ srvctl stop service -d mtxdb -s oltp
[oracle@node1 ~]$ srvctl disable service -d mtxdb -s oltp
[oracle@node1 ~]$ srvctl remove service -d mtxdb -s oltp
oltp PREF: mtxdb1 mtxdb2 AVAIL: 
Service oltp is disabled.
Remove service oltp from the database mtxdb? (y/[n]) y

OCR中的内容删除了,但是数据字典里还有该Service的内容,继续清除数据字典里的内容。
SQL> select  name,failover_method,failover_type from dba_services;

NAME      FAILOVER_M FAILOVER_T
-------------------- ---------- ----------
SYS$BACKGROUND
SYS$USERS
mtxdb
oltp      BASIC SELECT

删除数据字典内容:
SQL> begin 
  2  dbms_service.delete_service('oltp');
  3  end;
  4  /

PL/SQL procedure successfully completed.

再次查询数据字典,确认删除干净
SQL> select  name,failover_method,failover_type from dba_services;

NAME      FAILOVER_M FAILOVER_T
-------------------- ---------- ----------
SYS$BACKGROUND
SYS$USERS
mtxdb


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/30634954/viewspace-2151011/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/30634954/viewspace-2151011/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值