WebLogic里面有多池的概念,其中High availability的含义是这样的,假设有PoolA和PoolB,正常的状况下,只有一个PoolA起做用,其poolB是stand-by,当起做用的那个poolA出现故障,则会被WLS标记为disable,并将请求转发到另一个poolB上,而且定时测试被标记为disable的poolA,若是从新链接成功后,则将请求再切换回PoolA上,PoolB继续stand-by.

而上周和一个客户讨论这个问题,客户的作法是这样的:

后台是Oracle的RAC数据库,他配置了一个多池,有2个Pool,PoolA主要连RAC的A实例,PoolB主要连RAC的B实例.其实他的PoolA和PoolB都是用了RAC格式的JDBC的写法,后面是一个主机列表,PoolA将A实例的IP写在了前面,PoolB将B实例的IP写在了前面,JDBC的算法是failover=yes load_banlance=no,这样每个Pool将请求都发送到本身的第一个host的Oracle的实例上,在第一个host的Oracle实例出现故障时候切换到另一个host的Oracle实例上.

PoolA和PoolB的JDBC的写法以下,注意failover=yes和load_banlance=yes,这样写的做用是当请求来的时候都转发给第一个host,只有出现第一个host有问题,才会将请求发送到第二个host:

WLS JDBC URL 的配置以下:

jdbc:oracle:thin:@(description=(address_list= (address=(host=172.18.137.231) (protocol=tcp)(port=1521))(address=(host=172.18.137.230)(protocol=tcp) (port=1521)) (load_balance=yes)(failover=yes))(connect_data=(service_name= slrac.bea.com)))

配置的多池的算法若是是High Availability的话,那么压力将始终压到一个Pool上面,另一个Pool处于stand-by的状态,除非处理请求的Pool出现故障.客户的监控状况也是如此,发现压力都压在了一个Oracle的实例上.

若是多池的算法是Load Banlance的话,那么压力将平均分配到2个Pool上面.若是想使用多池的high availability的算法,则不要设置test的重试次数,若是设置了,则会出错抛出异常.

为了能使被标记为disable的PoolA可以恢复正常的链接,则须要设置HealthCheckFrequencySeconds的值在config.xml里面,该值在console上面没有.

另外还要可以使用TestConnectionsOnReserve.

多池就是在JDBC的链接池上层又加了一层请求分流的算法层.

关于Orale的RAC的JDBC的配置请参见个人另外一篇笔记:

http://rabbit8.bokee.com/4962735.html

以上是个人理解,若有错误,请指正,由于你的指正将会让我理解更深入,谢谢!

本文参考了http://www.bea.com.cn/support_pattern/Investigating_JDBC_MultiPool_Issues_Pattern.html


 

当安装完了Oracle的RAC后,个人Oracle就是一个双机的集群了,支持load banlance 和failover,可是数据源里面的JDBC的URL须要一种不一样的格式:

1)BEA的例子:http://www.bea.com.cn/support_pattern/Oracle_RAC_Pattern.html

WLS JDBC URL 的配置以下:

jdbc:oracle:thin:@(description=(address_list= (address=(host=172.18.137.231) (protocol=tcp)(port=1521))(address=(host=172.18.137.230)(protocol=tcp) (port=1521)) (load_balance=yes)(failover=yes))(connect_data=(service_name= slrac.bea.com)))

2)IBM 的例子:http://publib.boulder.ibm.com/infocenter/wpdoc/v510/index.jsp?topic=/com.ibm.wp.ent.doc/wpf/plan_oracle_rac.html

 jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=PRIMARY_NODE_HOSTNAME)(PORT=1521))(ADDRESS=(PROTOCOL=TCP)(HOST=SECONDARY_NODE_HOSTNAME)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=DATABASE_SERVICENAME)))

个人试验的配置:

jdbc:oracle:thin:@(description=(address_list= (address=(host=p570_b) (protocol=tcp)(port=1521))(address=(host=p570_a)(protocol=tcp) (port=1521)) (load_balance=yes)(failover=yes))(connect_data=(service_name= orcl)))

      我一开始使用的是IP地址,但发现使用IP后,第一下测试链接成功,第二下失败,第三下成功,第四下失败,就是这个规律,缘由是RAC本身就有负载均衡的功能(load banlance),它会自动的分配负载(workload),而第二次的请求听说返回的不是IP,因此在个人IP的列表里面没有,天然找不到(这是另外一个工程师解释给个人,不过我不太相信,由于BEA的文档中使用的就是IP,但我又不知道为何)。

      后来遵从那个工程师建议改为主机名后,一切OK,但若是改主机名须要更改Windows下的WINNT/system32/drivers/etc/hosts文件,将主机名和IP对应起来。

      个人RAC的数据源的配置就OK了,51后还要作DB2的双机互备的集群,还不知道该怎么作,DataSource的JDBC的URL怎么配置呢,不知道是否是和这个同样呢?

     TNS的配置:

你的TNS的名字=
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = p570a)(PORT = 1521))
      (ADDRESS = (PROTOCOL = TCP)(HOST = p570b)(PORT = 1521))
    )
    (load_blance=yes)
    (CONNECT_DATA =
      (SERVICE_NAME = orcl)
      (failover_mode=
              (type=select)
              (method=basic))
    )
  )

 

      明天上午验收安装的AIX的HA和RAC,若是顺利的话,下午就能够回北京了,此次安装AIX和RAC都不顺利,那个安装RAC的工程师这2天被蹂躏够戗,不断的出现新的问题,一开始AIX的版本的补丁不对,结果IBM的那个工程师早早的跑了,后来找到了缘由,后来又是安装Oracle的Cluster层的软件有一个NODE没有启动,后来知道了那个NODE是否正常启动没有关系,今天又是创建RAW和导入数据出现了些问题,还好都搞定了,晚上我又测试了一下集群的数据源,明天但愿上午能够正式的测试完毕。