Oracle RAC 环境下的连接管理文档格式.docx

上传人:b****6 文档编号:19316604 上传时间:2023-01-05 格式:DOCX 页数:22 大小:146.18KB
下载 相关 举报
Oracle RAC 环境下的连接管理文档格式.docx_第1页
第1页 / 共22页
Oracle RAC 环境下的连接管理文档格式.docx_第2页
第2页 / 共22页
Oracle RAC 环境下的连接管理文档格式.docx_第3页
第3页 / 共22页
Oracle RAC 环境下的连接管理文档格式.docx_第4页
第4页 / 共22页
Oracle RAC 环境下的连接管理文档格式.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

Oracle RAC 环境下的连接管理文档格式.docx

《Oracle RAC 环境下的连接管理文档格式.docx》由会员分享,可在线阅读,更多相关《Oracle RAC 环境下的连接管理文档格式.docx(22页珍藏版)》请在冰豆网上搜索。

Oracle RAC 环境下的连接管理文档格式.docx

OracleRAC11gR2引入了SCAN(SingleClientAccessName),并且客户端缺省是通过SCAN来连接整个RAC环境的,如下是SCAN的架构图:

如上图所示,如果使用了DNS或者GNS(GridNamingService),那么最多可以有3个SCANVIP和3个SCANListener;

如果没有使用DNS或者GNS,而是选择使用hosts文件,则只会有1个SCANVIP和1个SCANListener。

这里假设在tnsnames.ora中这样配置:

(DESCRIPTION=

(FAILOVER=ON)

(ADDRESS=(PROTOCOL=TCP)(HOST=MySCAN)(PORT=1521))

(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=RAC11g)))

严格意义上说,只有在RAC环境有1个以上SCANVIP的时候,上述FAILOVER=ON才有意义——它表示的是客户端在连接SCANVIP的时候,如果其中的一个SCANVIP连不上,则马上会尝试另外一个SCANVIP。

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

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

二、接下来介绍RuntimeConnectionFailover

RuntimeConnectionFailover是指连接已经存在的情况下的Failover。

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

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

有两种手段来实现RuntimeConnectionFailover,分别为TAF(TransparentApplicationFailover)和FCF(FastConnectionFailover)。

首先来介绍TAF。

TAF有如下一些知识点需要我们注意:

1、它可以在client端的tnsnames.ora中的连接串里定义,也可以在server端的service中定义,只不过service端的设置会取代(override)客户端tnsnames.ora中的设置:

客户端可以这样设置TAF:

(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=Email)

(FAILOVER_MODE=(TYPE=select)(METHOD=basic)(RETRIES=180)(DELAY=5)))

Server端可以这样设置TAF:

srvctlmodifyservice-dRAC11g-sEmail-qTRUE-PBASIC-eSELECT-z180-w5-jLONG具体各个参数的含义可参见如下注释:

Usage:

srvctlmodifyservice-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<

]

-d<

Uniquenameforthedatabase

service>

Servicename

-c{UNIFORM|SINGLETON}Servicerunsoneveryactiveserverintheserver

poolhostingthisservice(UNIFORM)orjustoneserver(SINGLETON)

-P{NONE|BASIC|PRECONNECT}TAFpolicyspecification

-l<

role>

Roleoftheservice(primary,physical_standby,

logical_standby,snapshot_standby)

-y<

policy>

Managementpolicyfortheservice(AUTOMATICorMANUAL)

-e<

Failovertype>

Failovertype(NONE,SESSION,orSELECT)

-m<

Failovermethod>

Failovermethod(NONEorBASIC)

-w<

Failoverdelay

-z<

Failoverretries

-j<

clb_goal>

ConnectionLoadBalancingGoal(SHORTorLONG).DefaultisLONG.

-B<

RuntimeLoadBalancingGoal>

RuntimeLoadBalancingGoal(SERVICE_TIME,

THROUGHPUT,orNONE)

-x<

DistributedTransactionProcessing>

DistributedTransactionProcessing(TRUEorFALSE)

-q<

AQHAnotifications>

AQHAnotifications

(TRUEorFALSE)

-hPrintusage

2、当TAF的TYPE设置为select的时候,单纯select操作(不包括select…forupdate)可以做到“断点续传”,即单纯的select操作在利用TAF实现Failover后是可以从中断的地方继续往下执行的;

3、TAF对DML操作不能做到“断点续传”,即如果一个transaction在使用TAF实现Failover后,该transaction不能从中断的地方继续执行,需要再次从头开始执行;

4、TAF仅对使用OCI连接的客户端和连接池有效,这里的OCI连接可以是在OCI连接上的封装,比如JDBC-OCIdriver就支持TAF,但JDBCthindriver就不支持TAF(因为JDBCthindriver不是基于OCI的)。

接下来,在介绍FCF(FastConnectionFailover)之前,我们必须要先介绍FAN(FastApplicationNotification)。

FAN是OracleRAC里的一种消息主动通知机制。

当RAC里出现servicedown/up,instancedown/up,节点负载变化时,Oracle数据库都能通过FANevents将这些信息发布出去,订阅这些FANevents的客户端在第一时间收到这些FANevents后就能做出相应的动作来响应这些FANevents。

FANevents分为两种,第一种是FANHAevents,第二种是LBAevents,这里的LBA是指LoadBalancingAdvisory。

当RAC里出现servicedown/up、instancedown/up时就会触发FANHAevents。

FANHAevents的示例如下所示:

Event1:

FANeventtype:

instance

Properties:

version=1.0service=PRODdatabase=PRODinstance=PROD1host=node1status=down

Event2:

service_member

version=1.0service=ERPdatabase=PRODinstance=PROD1host=node1status=down

Event3:

version=1.0service=ERPdatabase=PRODinstance=PROD3host=node3status=up

RAC里节点的负载变化后也会产生LBAevents,LBAevents的示例如下所示:

Event4:

FAN-eventtype:

service_metrics

version=2.0service=ERPdatabase=PRODinstance=PROD1percent=70

service_quality=GOODinstance=PROD2percent=30service_quality=GOOD

Event5:

FAN-eventtype:

version=2.0service=CRMdatabase=PRODinstance=PROD2percent=30

service_quality=GOODinstance=PROD3percent=70service_quality=GOOD

上述FANevents可能会通过多种渠道传播出去,这些渠道包括ONS(OracleNotificationService),AQ(AdvancedQueue),PMON等。

下面是关于FANevents架构和传播途径的两张图,它们就直观的说明了FANevents的传播途径:

订阅FANHAevents的客户端包括:

JDBCImplicitConnectionCache,OCI,ODP.NETConnectionPools,Listener,ServerSideCallouts等;

订阅LBAevents的客户端包括:

JDBCImplicitConnectionCache,ODP.NETConnectionPools,Listener,OCISessionPools等;

介绍完FAN,现在可以开始介绍FCF:

FCF的意思是FastConnectionFailover,它实际上是客户端通过订阅FANHAevents来实现的。

如下是两个客户端通过订阅FANHAevents来实现FCF的例子:

例一:

JDBCFastConnectionFailover(FCF)

这里的JDBC连接是指JDBCthin连接。

因为JDBCthin连接不是基于OCI的,所以这种情况下的RuntimeConnectionFailover不能使用TAF,只能用FCF。

并且要做如下几件事情后才可以正常使用FCF:

1、把implicitconnectioncache打开;

2、把FastConnectionFailoverEnabled打开;

3、最好是直接订阅远程的ONS(在Oracle10gR2之前的版本不能直接订阅远程的ONS,只能通过在本地安装ONS后来实现FANevents的中转);

4、最好是在Java程序里设置一下TCPtimeout(后面专门会讲到在Oracle数据库里如何调整TCPtimeout);

演示代码如下:

OracleDataSourceods=newOracleDataSource()

...

ods.setUser(“Scott”)

ods.setPassword(“tiger”)

ods.setConnectionCachingEnabled(true);

ods.setFastConnectionFailoverEnabled(true);

ods.setConnectionCacheName(“MyCache”)

ods.setConnectionCacheProperties(cp);

ods.setONSConfiguration("

nodes=racnode1:

6201,racnode2.:

6201"

);

ods.setURL("

jdbc:

oracle:

thin:

@sales1-scan:

1521/oltp"

//TCPconnecttimeout

Propertiesprop=newProperties();

prop.setProperty("

MinLimit"

MIN_CONN);

MaxLimit"

MAX_CONN);

InitialLimit"

INIT_CONN);

prop.put(.ns.SQLnetDef.TCP_CONNTIMEOUT_STR,"

1000"

));

//

这里是表示把TCPtimeout设为1000毫秒,即1秒

ods.setConnectionCacheProperties(prop);

例二:

ODP.NETFastConnectionFailover(FCF)

对于ODP.NET而言,通常做了如下几件事情后就可以使用FCF了:

1、把对应service的AQNotification打开:

srvctlmodifyservice-dRAC11g-sEmail-qTRUE

2、把aq_tm_processes的值设为1;

3、赋予指定用户de-queue的权限:

execdbms_aqadm.grant_queue_privilege('

DEQUEUE'

'

SYS.SYS$SERVICE_METRICS'

<

yourusername=>

4、在.NET连接串里设置HAevents=true;

//C#

usingSystem;

usingOracle.DataAccess.Client;

classConnectionPoolingSample

{

staticvoidMain()

OracleConnectioncon=newOracleConnection();

//OpenaconnectionusingConnectionStringattributes

//relatedtoconnectionpooling.

con.ConnectionString=

"

UserId=scott;

Password=tiger;

DataSource=crm;

+

MinPoolSize=10;

ConnectionLifetime=120;

ConnectionTimeout=60;

HAevents=true"

"

IncrPoolSize=5;

DecrPoolSi=2"

;

con.Open();

Console.WriteLine("

Connectionpoolsuccessfullycreated"

//CloseandDisposeOracleConnectionobject

con.Close();

con.Dispose();

Connectionisplacedbackintothepool."

}

}

FCF跟TAF有一个很大的不同就是即便是单纯select操作,FCF也不能像TAF那样做到“断点续传”。

对于配置好了FCF的连接池而言,当它接收到包含instance/service宕掉的FANHAevents后,原先cache在连接池里的跟这个instance/service相关的连接马上会被标记为失效(invalid)同时这些连接会被清除,使用这些连接的transaction也会马上中止并回滚。

当应用捕捉到这个中止的transaction所产生的错误信息后,要么直接把相关错误返回给最终用户,要么从连接池中重新取得一个有效连接并重新执行这个被中止的transaction。

在启用了FCF的情况下,如果连接错误被返回给了最终用户,那么应该如何判断错误信息的来源呢(即是否是FCF返回的错误)?

很简单,用isFatalConnectionError(SQLExceptione)来判断一下就好了,演示代码如下:

try{

conn=getConnection();

//这里取得连接后做相关的工作

}catch(SQLExceptione){

handleSQLException(e)

voidhandleSQLException(SQLExceptione)

if

(OracleConnectionCacheManager.isFatalConnectionError(e))

ConnRetry=true;

//这里表示捕捉到FCF返回的错误

三、接着介绍ConnectTimeLoadBalancing

ConnectTimeLoadBalancing就是指不从连接池中取得已有连接,而是直接连接Oracle数据库时的LoadBalance。

ConnectTimeLoadBalancing又细分为两种,分别是客户端的ConnectTimeLoadBalancing和Server端的ConnectTimeLoadBalancing。

在OracleRAC11gR2之前,客户端的ConnectT

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 动态背景

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1