Oracle RAC 环境下的连接管理

  • 格式:docx
  • 大小:172.54 KB
  • 文档页数:20

Oracle RAC 环境下的连接管理这篇文章详细介绍了Oracle RAC环境下的连接管理,分别介绍了什么是Connect Time Load Balancing、Runtime Connection Load Balancing、Connect Time Connection Failover 和Runtime Connection Failover,以及里面所涉及到的TAF、ONS、FCF、FAN、LBA 等诸多知识点。

本文主要是针对Oracle RAC 11gR2 环境下的连接管理,但同时也会对比说明一下Oracle RAC 10gR2/9iR2,以体现他们之间在连接管理上的差异。

所谓“连接管理”,主要体现在Load Balancing 和Failover 两方面。

Oracle RAC 11gR2 下的Load Balancing 和Failover,根据是否使用了事先已经存在的连接(如连接池中的连接)又分为Connect Time Load Balancing、Runtime Connection Load Balancing、Connect Time Connection Failover和Runtime Connection Failover 这4 种类型,凡是带上了“Runtime”前缀的,就是指连接已经存在的情况,比如使用了连接池。

一、首先来介绍Connect Time Connection FailoverConnect Time Connection Failover 是指不从连接池中取得已有连接,而是直接连接Oracle 数据库时的Failover。

在Oracle RAC 11gR2 之前,Connect Time Connection Failover 是非常容易实现的,只需要在相关的tnsnames.ora 中指定多个vip,同时指定FAILOVER=ON 就好了。

如下所示:(DESCRIPTION=(FAILOVER=ON)(ADDRESS_LIST=(LOAD_BALANCE=OFF)(ADDRESS=(PROTOCOL=TCP)(HOST=RAC1-vip)(PORT=1521))(ADDRESS=(PROTOCOL=TCP)(HOST=RAC2-vip)(PORT=1521))(ADDRESS=(PROTOCOL=TCP)(HOST=RAC3-vip)(PORT=1521))(ADDRESS=(PROTOCOL=TCP)(HOST=RAC4-vip)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=RAC10g)))这里客户端进程首先会尝试连接RAC1-vip,如果连不上,则会尝试RAC2-vip,再连不上,则会继续往下尝试,直到所有出现在ADDRESS_LIST 中的vip 地址全部顺序尝试完为止。

这种客户端在连接Oracle 数据库时的Failover,不仅适用于RAC 环境,也适用于Data Guard 环境。

如下所示:DESCRIPTION=(FAILOVER=ON)(ADDRESS_LIST=(LOAD_BALANCE=OFF)(ADDRESS=(PROTOCOL=TCP)(HOST=primary-ip)(PORT=1521))(ADDRESS=(PROTOCOL=TCP)(HOST=standby-ip)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=service10g)))Oracle RAC 11gR2 引入了SCAN(Single Client Access Name),并且客户端缺省是通过SCAN 来连接整个RAC 环境的,如下是SCAN 的架构图:如上图所示,如果使用了DNS 或者GNS (Grid Naming Service),那么最多可以有3 个SCAN VIP 和3 个SCAN Listener;如果没有使用DNS 或者GNS,而是选择使用hosts 文件,则只会有1 个SCAN VIP 和1 个SCAN Listener。

这里假设在tnsnames.ora 中这样配置:(DESCRIPTION =(FAILOVER=ON)(ADDRESS = (PROTOCOL = TCP)(HOST = MySCAN)(PORT = 1521))(CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME =RAC11g)))严格意义上说,只有在RAC 环境有1 个以上SCAN VIP 的时候,上述FAILOVER=ON 才有意义——它表示的是客户端在连接SCAN VIP 的时候,如果其中的一个SCAN VIP 连不上,则马上会尝试另外一个SCAN VIP。

当使用了hosts 文件来指定SCAN VIP 的时候,即在整个RAC 环境只有1 个SCAN VIP 的情况下,Failover 其实也存在,只不过这种情况下Failover 的速度会慢一些。

因为当SCAN VIP 所在的节点宕掉后,SCAN VIP 会和相关的SCAN Listener 一起整体Failover 到其他节点,只不过这个Failover 需要时间,而客户端需要等待这个Failover 过程完毕后才能重新连上RAC。

二、接下来介绍Runtime Connection FailoverRuntime Connection Failover 是指连接已经存在的情况下的Failover。

这个已存在的连接,可能是连接池中正在用的连接,也可能是不通过连接池、直接通过OCI 客户端(如sqlplus)连上Oracle 数据库后的连接。

这种Runtime Connection Failover,就是指在连接已经存在的情况下,如果Oracle 数据库端出现了异常的情况(比如Service 宕了、Instance 崩溃了、Session 断了)而导致已有连接中断,怎样Failover 的问题。

有两种手段来实现Runtime Connection Failover,分别为TAF(Transparent Application Failover)和FCF(Fast Connection Failover)。

首先来介绍TAF。

TAF 有如下一些知识点需要我们注意:1、它可以在client 端的tnsnames.ora 中的连接串里定义,也可以在server 端的service 中定义,只不过service 端的设置会取代(override)客户端tnsnames.ora 中的设置:客户端可以这样设置TAF:(DESCRIPTION =(FAILOVER=ON)(ADDRESS = (PROTOCOL = TCP)(HOST = MySCAN)(PORT = 1521))(CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = Email)(FAILOVER_MODE= (TYPE=select)(METHOD=basic)(RETRIES=180)(DELAY=5)))Server 端可以这样设置TAF:srvctl modify service -d RAC11g -s Email -q TRUE -P BASIC -e SELECT -z 180 -w 5 -j LONG 具体各个参数的含义可参见如下注释:Usage: srvctl modify service -d <db_unique_name> -s <service_name> [-c {UNIFORM | SINGLETON}] [-P {BASIC|PRECONNECT|NONE}] [-l[PRIMARY][,PHYSICAL_STANDBY][,LOGICAL_STANDBY][,SNAPSHOT_STANDBY]] [-y {AUTOMATIC | MANUAL}][-q {true|false}] [-x {true|false}] [-j {SHORT|LONG}] [-B{NONE|SERVICE_TIME|THROUGHPUT}] [-e {NONE|SESSION|SELECT}] [-m{NONE|BASIC}] [-z <integer>] [-w <integer>]-d <db_unique_name> Unique name for the database-s <service> Service name-c {UNIFORM | SINGLETON} Service runs on every active server in the serverpool hosting this service (UNIFORM) or just one server (SINGLETON)-P {NONE | BASIC | PRECONNECT} TAF policy specification-l <role> Role of the service (primary, physical_standby,logical_standby, snapshot_standby)-y <policy> Management policy for the service (AUTOMATIC or MANUAL) -e <Failover type> Failover type (NONE, SESSION, or SELECT)-m <Failover method> Failover method (NONE or BASIC)-w <integer> Failover delay-z <integer> Failover retries-j <clb_goal> Connection Load Balancing Goal (SHORT or LONG). Default is LONG.-B <Runtime Load Balancing Goal> Runtime Load Balancing Goal (SERVICE_TIME, THROUGHPUT, or NONE)-x <Distributed Transaction Processing> Distributed Transaction Processing (TRUE or FALSE)-q <AQ HA notifications> AQ HA notifications(TRUE or FALSE)-h Print usage2、当TAF 的TYPE 设置为select 的时候,单纯select 操作(不包括select … for update)可以做到“断点续传”,即单纯的select 操作在利用TAF 实现Failover 后是可以从中断的地方继续往下执行的;3、TAF 对DML 操作不能做到“断点续传”,即如果一个transaction 在使用TAF 实现Failover 后,该transaction 不能从中断的地方继续执行,需要再次从头开始执行;4、TAF 仅对使用OCI 连接的客户端和连接池有效,这里的OCI 连接可以是在OCI 连接上的封装,比如JDBC-OCI driver 就支持TAF,但JDBC thin driver 就不支持TAF(因为JDBC thin driver 不是基于OCI 的)。