Oracle RAC是一個叢集資料庫,可以實現負載平衡和故障無縫切換。如何知道RAC資料庫已經實現了這些功能呢,下面就對此進行功能測試。
一、 負載平衡測試
RAC資料庫的負載平衡是指對資料庫連接的負載平衡,當一個新的會話串連到RAC資料庫時,通過指定的分配演算法將請求分配到叢集的任一節點上,這就是RAC資料庫完成的功能。負載平衡在RAC中分為兩種:一種是基於用戶端串連的負載平衡;一種是基於伺服器端的負載平衡。
1. RAC用戶端負載平衡
用戶端串連的負載平衡配置起來非常簡單,與RAC資料庫的執行個體負載和監聽沒有任何關係,因此也就不需要在叢集節點進行任何設定,只要在用戶端機器上的tnsnames.ora檔案中添加負載平衡策略配置即可。這裡以Linux用戶端為例進行介紹。
1) 修改/etc/hosts檔案
編輯/etc/hosts檔案,將RAC資料庫相關的IP地址資訊添加進去,例如:
192.168.12.231 node-rac1
192.168.12.232 node-rac2
192.168.12.230 node-vip1
192.168.12.240 node-vip2
2) 查看RAC資料庫的service_names
[oracle@node-rac1 ~]$ sqlplus "/as sysdba"
SQL*Plus: Release 11.1.0.6.0 - Production on Sun Sep 12 22:05:53 2010
Copyright (c) 1982, 2007, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production
With the Partitioning, Real Application Clusters, OLAP, Data Mining
and Real Application Testing options
NAME TYPE VALUE
---------------------- -------------- -------------
service_names string racdb
這裡需要說明的是,在配置RAC負載平衡時,用戶端串連的是RAC資料庫的服務名,而不是執行個體名,也就是SERVICE_NAME必須設定為“SERVICE_NAME = racdb”
3) 修改Oracle用戶端的設定檔tnsnames.ora
RACDB=
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = node-vip2)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = node-vip1)(PORT = 1521))
(LOAD_BALANCE = yes)
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = racdb)
)
)
這個設定檔的說明如下:
LOAD_BALANCE = yes,表示啟用串連負載平衡。在預設情況下“LOAD_BALANCE = no”,因此如果要配置負載平衡,必須添加設定“LOAD_BALANCE = yes”。啟用負載平衡後,SQLNet會隨機播放ADDRESS_LIST列表中的任意一個監聽,然後將請求分發到此監聽上,通過這種方式完成負載平衡。如果“LOAD_BALANCE = no”,那麼SQLNet會按照ADDRESS_LIST列表中的順序選擇監聽,只要這個監聽正常就一直使用該監聽。
SERVICE_NAME = racdb,這個“racdb“是RAC資料庫的服務名,而非執行個體名。
4)在用戶端測試負載平衡
在用戶端開啟一個sqlplus串連,執行如下操作:
[oracle@client ~]$ sqlplus system/xxxxxx@racdb
SQL*Plus: Release 11.1.0.7.0 - Production on Sun Sep 12 21:24:55 2010
Copyright (c) 1982, 2008, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production
With the Partitioning, Real Application Clusters, OLAP, Data Mining
and Real Application Testing options
SQL> show parameter instance_name
NAME TYPE VALUE
--------------------- --------------- -------------------
instance_name string racdb1
繼續開啟第二個sqlplus串連,執行如下操作:
[oracle@client ~]$ sqlplus system/xxxxxx@racdb
SQL*Plus: Release 11.1.0.7.0 - Production on Sun Sep 12 21:31:53 2010
Copyright (c) 1982, 2008, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production
With the Partitioning, Real Application Clusters, OLAP, Data Mining
and Real Application Testing options
SQL> show parameter instance_name
NAME TYPE VALUE
-------------------- -------------- ------------------
instance_name string racdb2
按照這種方法,陸續開啟多個sqlplus串連,可以看到,每次串連到的執行個體都在racdb1和racdb2之間變化,這樣就實現了RAC資料庫連接的負載平衡。
2. 伺服器端的負載平衡
用戶端的負載平衡解決了串連資料庫的負載問題,但是由於串連是由用戶端發起的,它並不知道RAC資料庫叢集中各個節點的繁忙狀態和串連資訊,因此負荷較大的節點仍然會增加新的串連,這樣就可能導致RAC節點無法真正做到負載平衡。不過幸運的是,從Oracle 10g開始,伺服器端負載平衡就可以根據RAC中各節點的負荷及串連數情況,將新的請求分配到叢集中負載較低、串連數較少的節點上來,這樣就從根本上實現了資料庫的負載平衡,並且使用戶端串連的負載平衡與伺服器端的負載平衡可以配合使用,互不影響。
每個叢集節點的負載情況是由PMON進程來定期更新的。PMON進程每3秒會將叢集中每個節點的負載資訊及串連數寫入service_register中,當節點的負載發生變化時,將會立刻通知監聽程式,最後由監聽程式來決定將新的用戶端串連分配到哪個節點上,通過這種方式,RAC資料庫實現了真正的負載平衡。
伺服器端負載平衡配置也非常簡單,只需在各節點的tnsnames.ora檔案中添加一個對串連到各個節點進行監聽的配置,然後在初始化參數中設定remote_listener即可。
1)修改伺服器端的tnsnames.ora
只需添加如下內容即可:
LISTENERS_RACDB =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = node-vip2)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = node-vip1)(PORT = 1521))
)
2)修改參數remote_listener
查看RAC資料庫的參數remote_listener:
SQL> show parameter remote_listener
NAME TYPE VALUE
--------------- ----------- -----------
remote_listener string LISTENERS_RACDB
可以看到,remote_listener已經設定為“LISTENERS_RACDB”了。
如果remote_listener的值為空白,可以通過如下命令修改每個執行個體的remote_listener參數:
SQL> alter system set remote_listener='LISTENERS_RACDB' sid='node-rac1';
SQL> alter system set remote_listener='LISTENERS_RACDB' sid='node-rac2';
這樣,伺服器端的負載平衡就配置完成了。
二、 透明應用失敗切換測試
透明應用失敗切換Transparent Application Failover,TAF),這是用戶端的一種功能。TAF包含兩層意思:失敗切換是指用戶端串連到某個執行個體,如果串連失敗,可以串連到另外一個執行個體;透明應用是指用戶端應用程式在串連失敗後可以自動重新串連到另一個資料庫執行個體,而這個過程對應用程式是不可見的。
要使用TAF功能,只需修改用戶端的tnsnames.ora檔案中的設定即可,結合前面介紹的用戶端負載平衡功能,一個包含負載平衡和TAF功能的用戶端設定如下:
RACDB =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = node-vip2)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = node-vip1)(PORT = 1521))
(LOAD_BALANCE = yes)
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = racdb)
(FAILOVER_MODE =
(TYPE=SELECT)
(MODE=BASIC)
(RETRY=3)
(DEALY=5)
)
)
)
其中的幾個參數的含義如下:
TYPE,用於指定FAILOVER_MODE的類型,有3種類型可選,分別是SESSION、SELECT和NONE。
SESSION,表示當一個正在串連的會話執行個體發生故障時,系統可以自動將會話切換到其他可用的執行個體,而應用程式無需再次發起串連請求,但是執行個體故障時正在執行的SQL需要重新執行。
SELECT,表示如果正在串連的執行個體發生故障,將使用遊標和之前的快照繼續執行SELECT操作,其他動作必須要重新執行。
NONE,這個是用戶端預設值,表示禁止SQL接管功能。
MODE,表示串連模式,有兩種類型,分別是BASIC和PRECONNECT。
BASIC表示在建立初始串連時僅串連到一個節點,並且只有在發生節點故障時才串連到備用節點。
PRECONNECT表示在建立初始串連時就串連到主節點和備用節點。
RETRY:表示當前節點失敗後,失敗切換功能嘗試串連備用節點的次數。
DELAY:表示兩次嘗試之間等待的秒數。
設定完用戶端監聽後,重啟用戶端服務,然後執行下面的操作:
[oracle@client ~]$sqlplus system/xxxxxx@racdb
SQL*Plus: Release 11.1.0.7.0 - Production on Sun Sep 12 23:23:15 2010
Copyright (c) 1982, 2008, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production
With the Partitioning, Real Application Clusters, OLAP, Data Mining
and Real Application Testing options
SQL> COLUMN instance_name FORMAT a10
SQL> COLUMN host_name FORMAT a10
SQL> COLUMN failover_method FORMAT a15
SQL> COLUMN failed_over FORMAT a10
SQL> SELECT instance_name, host_name, NULL AS failover_type, NULL AS failover_method, NULL AS failed_over FROM v$instance UNION SELECT NULL, NULL, failover_type , failover_method, failed_over FROM v$session WHERE username = 'SYSTEM';
INSTANCE_ NAME HOST_NAME FAILOVER_TYPE FAILOVER_METHOD FAILED_OVER
------------- ------------------ ------------- --------------- -------------
racdb2 node-rac2 SELECT BASIC NO
此時,不斷開此串連,然後在RAC資料庫的任意一個節點上執行如下語句:
[oracle@node-rac2 ~]$ srvctl stop instance -d racdb -i racdb2
關閉node-rac2節點的racdb2執行個體後,繼續執行與前面那個SQL命令相同的語句,結果如下:
INSTANCE_ NAME HOST_NAME FAILOVER_TYPE FAILOVER_METHOD FAILED_OVER
------------- ------------------ ------------- --------------- -------------
racdb1 node-rac1 SELECT BASIC YES
從輸出可以看到,上面的SQL會話已經切換到了node-rac1的執行個體racdb1上,也就是實現了故障自動切換功能。
至此,關於RAC資料庫的功能測試已經驗證完畢了。
本文出自 “技術成就夢想” 部落格,請務必保留此出處http://ixdba.blog.51cto.com/2895551/988650