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