服務器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是可以結合在一起混合使用的,互不干擾。