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和導入數據出現了些問題,還好都搞定了,晚上我又測試了一下集群的數據源,明天希望上午可以正式的測試完畢。


 


 

 



柴油發電機
發電機
柴油機
柴油發電機
13636374743(上海)
13291526067(嘉興)