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和导入数据出现了些问题,还好都搞定了,晚上我又测试了一下集群的数据源,明天希望上午可以正式的测试完毕。