配置RAC負載均衡

服務器IP信息如下:
[grid@rac1 bin]$ more /etc/hosts
# Do not remove the following line, or various programs
# that require network functionality will fail.
127.0.0.1       localhost.localdomain localhost
::1             localhost6.localdomain6 localhost6

#Public
192.168.8.10 rac1.localdomain rac1
192.168.8.11 rac2.localdomain rac2
#Private
192.168.100.10 rac1-priv.localdomain rac1-priv
192.168.100.11 rac2-priv.localdomain rac2-priv
#Virtual
192.168.8.8 rac1-vip.localdomain rac1-vip
192.168.8.7 rac2-vip.localdomain rac2-vip
#Scan
192.168.8.6 rac-scan.localdomain rac-scan
安裝RAC的時候用的是openfiler做共享存儲,那就不多說了,這裏主要介紹RAC的負載均衡配置。
一般來說我們只需要通過配置客戶端$ORACLE_HOME/network/admin/tnsnames.ora文件就可以實現RAC負載均衡,這種方式是連接數上的負載均衡。
ORARAC =
  (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.8.8)(PORT = 1521))
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.8.7)(PORT = 1521))
     (LOAD_BALANCE = yes) #啓用負載均衡
     (CONNECT_DATA =
     (SERVER = DEDICATED)
     (SERVICE_NAME = rac.localdomain)
     (FAILOVER_MODE =
     (TYPE = session) #session當一個連接好的會話的實例發生故障,系統會自動將會話切換到其他可用的實例,前臺應用無須再度發起連接,但會話正在執行的SQL需要重新執行。可選參數還有select和none,對於select,用戶正在執行的select語句會被轉移到新的實例上,在新的節點上繼續返回後續結果集,而已經返回的記錄集則拋棄。none,這個是客戶端默認值,表示禁止SQL接管功能
     (METHOD = basic) #在感知到節點故障時才創建到其他實例的連接,有時間延遲,還有個可選參數preconnect是初始連接所有的接點,沒有時間延遲,這個參數一般認爲是資源浪費
     (RETRIES = 180) #重試次數
     (DELAY = 5) #重試間隔時間
     )
    )
   )
經過測試發現,在客戶端的tnsnames.ora文件中配置監聽服務名的時候,如果寫上“ADDRESS_LIST=”這句話,那麼連接到的總是第一個VIP地址,不會起到負載均衡的功能,所以必須刪除掉這句話。

由於連接是由客戶端發起的,它並不知道RAC數據庫集羣中各個節點的繁忙狀態和連接信息,因此負荷較大的節點仍然會增加新的連接,這樣就可能導致RAC節點無法真正做到負載均衡。不過幸運的是,從Oracle 10g開始,服務器端負載均衡就可以根據RAC中各節點的負荷及連接數情況,將新的請求分配到集羣中負載較低、連接數較少的節點上來,這樣就從根本上實現了數據庫的負載均衡,並且使客戶端連接的負載均衡與服務器端的負載均衡可以配合使用,互不影響。
每個集羣節點的負載情況是由PMON進程來定期更新的。PMON進程每3秒會將集羣中每個節點的負載信息及連接數寫入service_register中,當節點的負載發生變化時,將會立刻通知監聽程序,最後由監聽程序來決定將新的客戶端連接分配到哪個節點上,通過這種方式,RAC數據庫實現了真正的負載均衡。
服務器端listener.ora配置如下(這裏只寫其中一個節點,每一個節點都需要更改節點名稱與IP地址等,做類似的配置):
LISTENER_RAC1 =  
      (DESCRIPTION_LIST =  
        (DESCRIPTION =  
          (ADDRESS = (PROTOCOL = TCP)(HOST = rac1-vip.localdomain)(PORT = 1521)(IP = FIRST))  
          (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.8.10)(PORT = 1521)(IP = FIRST))  
        )  
      )  
      
    SID_LIST_LISTENER_RAC1 =  
      (SID_LIST =  
        (SID_DESC =  
          (SID_NAME = rac.localdomain)  
          (ORACLE_HOME = /u01/app/oracle)  
          (PROGRAM = extprocrac)  
        )  
      )
如果想根據節點的連接數進行分配,可以加上這句話(本人認爲加上這句話是沒有任何實際的用途,如果想通過連接數來分配session的話,服務器端直接刪除掉listener.ora文件即可實現):
PREFER_LEAST_LOADED_NODE=OFF

服務器端tnsnames.ora配置如下(每個節點都一樣的配置):
RAC =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.8.8)(PORT = 1521))
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.8.7)(PORT = 1521))
    (LOAD_BALANCE = yes)
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = rac.localdomain)
      (FAILOVER_MODE =
        (TYPE = session)
        (METHOD = basic)
        (RETRIES = 180)
        (DELAY = 5)
      )
    )
  )
 
RAC1 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.8.8)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = rac.localdomain)
      (INSTANCE_NAME = rac1)
      )
    )
 
RAC2 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.8.7)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = rac.localdomain)
      (INSTANCE_NAME = rac2)
      )
    )
 
LISTENERS_RAC=                                                           
  (ADDRESS_LIST =                                                          
       (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.8.8)(PORT = 1521))  
       (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.8.7)(PORT = 1521))  
  )
LISTENERS_RAC1 =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.8.8)(PORT = 1521))
)
LISTENERS_RAC2 =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.8.7)(PORT = 1521))
    )


接下來配置參數文件remote_listener
SQL> alter system set remote_listener='LISTENERS_RAC' scope=both sid='*';

然後重啓監聽服務:
[oracle@rac1 ~]$ srvctl stop listener
[oracle@rac1 ~]$ srvctl start listener
正確配置參數後,通過lsnrctl status命令應該要看到監聽器上有rac1和rac2兩個instance。
[oracle@rac1 ~]$ lsnrctl status

LSNRCTL for Linux: Version 11.2.0.1.0 - Production on 27-NOV-2012 00:38:11

Copyright (c) 1991, 2009, Oracle.  All rights reserved.

Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 11.2.0.1.0 - Production
Start Date                27-NOV-2012 00:12:58
Uptime                    29 days 10 hr. 25 min. 13 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /u01/app/11.2.0/grid/network/admin/listener.ora
Listener Log File         /u01/app/grid/diag/tnslsnr/rac1/listener/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=LISTENER)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.8.10)(PORT=1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.8.8)(PORT=1521)))
Services Summary...
Service "+ASM" has 1 instance(s).
  Instance "+ASM1", status READY, has 1 handler(s) for this service...
Service "rac.localdomain" has 2 instance(s).
  Instance "rac1", status READY, has 2 handler(s) for this service...
  Instance "rac2", status READY, has 1 handler(s) for this service...
Service "racXDB.localdomain" has 2 instance(s).
  Instance "rac1", status READY, has 1 handler(s) for this service...
  Instance "rac2", status READY, has 1 handler(s) for this service...
The command completed successfully

這樣,服務器端的負載均衡就配置完成了。
服務器端的負載均衡主要是通過REMOTE_LISTENER參數控制的,在連接被定位到某個接點後,系統會根據REMOTE_LISTENER考慮多個接點的負載,把連接再次分發出去,這個和客戶端的load balance是可以結合在一起混合使用的,互不干擾。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章