[zt] Oracle RAC Load Balance [final]

tolywang發表於2009-05-21

        雖然在Oracle的立場上,總是建議客戶能夠更好地規劃自己的應用,在有其它負載平衡方法的時候,儘量不要依賴於Oracle的Load Balance方法,但是往往在給客戶配置完Oracle RAC資料庫以後,客戶都會要求要測試負載平衡(Load Balance)和TAF(Transparent Application Failover),並且將這兩個測試作為RAC是否安裝成功的標準。

         這是一件很無奈的事情,像把旁枝末節看作了主要功能,甚至有些買櫝還珠的感覺,但是畢竟這是客戶,更瞭解Oracle Load Balance(後文用LB表示),才可以更好滿足客戶需求。

本文不牽涉TAF(可以參看老熊關於TAF的系列文章,,),如何在Oracle10g之後版本中在伺服器端service層面設定TAF,可以參看Metalink Note: 。

對於LB,在Oracle10g之前有Client端和Server端兩種,在Oracle10g之後又推出了Server端Service層面的LB配置,本文也不涉及Service層面的LB。

在Oracle9i,10g,11g版本中都適用的LB配置分為以下兩種。

(1) Client Side Connect Time Load Balance
(2) Server Side Listener Connection Load Balance (此處的Listener用以跟10g之後的Server Side Service Load Balance區分開)

1. Client Side Connect Time Load Balance
既然是Client端的LB,那麼也就是不需要在資料庫伺服器端配置任何引數,完全由客戶端機器上的tnsnames.ora檔案中對於TNS的配置來決定,實際上也就是LOAD_BALANCE引數。

看一個例子,下面這樣的TNS配置就是啟用了客戶端的LB。

CLIENT_LOADBALANCE =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = node1-vip)(PORT = 1521))
      (ADDRESS = (PROTOCOL = TCP)(HOST = node2-vip)(PORT = 1521))
      (LOAD_BALANCE = yes)
    )
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = rac_lb)
    )
  )

(LOAD_BALANCE = yes)指示SQLNet隨機選擇ADDRESS_LIST列表中的任意一個監聽,將客戶端請求傳送到此監聽上,透過這種方法來實現負載平衡。如果(LOAD_BALANCE = no)那麼將會按照ADDRESS_LIST列表中的順序選擇監聽,只要這個監聽能夠正常連線那麼就使用該監聽。

因此在某些負載平衡的解決方案中會使用(LOAD_BALANCE = no)但是在多個客戶端或者應用伺服器端配置順序不同的ADDRESS_LIST,以此來實現人為的負載平衡。

如果在TNS配置時使用的是ADDRESS_LIST語法,那麼必須顯示設定LOAD_BALANCE = yes,預設值LOAD_BALANCE = no。

2. Server Side Listener Connection Load Balance
要實現server side load balance要求監聽能夠知道在整個RAC環境中的各節點負載情況,節點負載情況是由PMON程式來定期更新的,而要讓PMON程式能夠通知其它節點自己節點的負載情況則需要設定資料庫初始化引數REMOTE_LISTENER。

在RAC資料庫伺服器端的每個節點上的tnsnames.ora檔案中設定如下的TNS名稱。

LISTENERS_RAC =
(DESCRIPTION =  
 (ADDRESS_LIST =   
  (ADDRESS = (PROTOCOL = TCP)(HOST=node1-vip)(PORT = 1521))   
  (ADDRESS = (PROTOCOL = TCP)(HOST=node2-vip)(PORT = 1521))   
 )  
)

然後設定REMOTE_LISTENER引數值為LISTENERS_RAC。

sql> ALTER system SET REMOTE_LISTENER='LISTENERS_RAC' scope=BOTH;

當某個例項的監聽收到客戶端連線請求,將會統籌考慮RAC環境中各個節點的負載情況,然後將該連線傳遞到具有最小負載的節點的最小負載例項上。

在10gR2版本之後,節點和例項的負載計算透過lbscore來完成,而lbscore則由兩個動態值決定:”goodness” 和 “delta”,這兩個值均由PMON來定期更新,計算公式如下:
Lbscore = Goodness (Received from PMON update)
Delta = New Delta (Received from PMON update)
在PMON定期更新的間隔,如果有新連線進入,那麼lbscore的計算公式是:
Lbscore = Lbscore(previous) + Listener Delta

可以透過新增監聽的trace(TRACE_LEVEL_LISTENER = 16)來獲取lbscore的產生情況,更詳細的文件請參看Metalink Note: 263599.1。

關於Failover,多說一句,其實Failover也有兩種,一種是Connect Time Failover,由客戶端TNS配置的(failover=on)引數控制,另外一種是TAF,由客戶端TNS配置中的failover_mode引數控制。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/35489/viewspace-600653/,如需轉載,請註明出處,否則將追究法律責任。

相關文章