靈活實現RAC三節點的負載均衡及TAF配置(二)

yangtingkun發表於2009-04-19

這兩天配置了一個三節點的RAC環境,想起前一段時間Thomas Zhang給我出的一個題目,配置一個三節點RAC環境的複雜負載均衡以及Transparent Application Failover的服務名。現在有環境了,可以將給出驗證後的結果了。

這篇文章檢驗給出的實現是否滿足需求。

靈活實現RAC三節點的負載均衡及TAF配置(一):http://yangtingkun.itpub.net/post/468/482683

 

 

上一篇給出了一個靈活設定負載均衡以及TAF的需求,同時給出了這個需求首先的TNSNAMES配置。這篇來驗證一下配置是否正確。

首先在客戶端的TNSNAMES.ORA中新增配置,由於篇幅的問題,這裡就不重複了,具體配置可以參考第一篇文章。

下面首先驗證第一點,透過SERVICEA服務是否實現在例項1和例項2上的負載均衡,透過SERVICEB服務是否可以登陸例項3

SQL> CONN TEST/TEST@SERVICEA
已連線。
SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;

INSTANCE_NAME
----------------
testrac2

SQL> CONN TEST/TEST@SERVICEA
已連線。
SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;

INSTANCE_NAME
----------------
testrac1

SQL> CONN TEST/TEST@SERVICEA
已連線。
SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;

INSTANCE_NAME
----------------
testrac1

SQL> CONN TEST/TEST@SERVICEA
已連線。
SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;

INSTANCE_NAME
----------------
testrac2

SQL> CONN TEST/TEST@SERVICEA
已連線。
SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;

INSTANCE_NAME
----------------
testrac2

SQL> CONN TEST/TEST@SERVICEA
已連線。
SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;

INSTANCE_NAME
----------------
testrac1

可以看到在目前兩個例項的負載都很小的情況下,SERVICEA以一種近似輪巡的方式分別連線到例項TESTRAC1TESTRAC2上。

SQL> CONN TEST/TEST@SERVICEB
已連線。
SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;

INSTANCE_NAME
----------------
testrac3

SQL> CONN TEST/TEST@SERVICEB
已連線。
SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;

INSTANCE_NAME
----------------
testrac3

SQL> CONN TEST/TEST@SERVICEB
已連線。
SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;

INSTANCE_NAME
----------------
testrac3

SQL> CONN TEST/TEST@SERVICEB
已連線。
SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;

INSTANCE_NAME
----------------
testrac3

SERVICEB顯然只能連線到例項TESTRAC3上。

下面驗證第二點需求,分別驗證TESTRAC1TESTRAC2例項失敗的情況:

SQL> CONN TEST/TEST@SERVICEA
已連線。
SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;

INSTANCE_NAME
----------------
testrac1

客戶端透過SERVICEA連線到TESTRAC1上,下面透過SRVCTL命令關閉TESTRAC1:

bash-3.00$ srvctl status db -d testrac
例項 testrac1 正在節點 racnode1 上執行
例項 testrac2 正在節點 racnode2 上執行
例項 testrac3 正在節點 racnode3 上執行
bash-3.00$ srvctl stop inst -d testrac -i testrac1

下面檢查剛才的會話是否已經遷移到TESTRAC2上:

SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;

INSTANCE_NAME
----------------
testrac2

SQL> SELECT INSTANCE_NAME FROM GV$INSTANCE;

INSTANCE_NAME
----------------
testrac2
testrac3

下面啟動TESTRAC1例項:

bash-3.00$ srvctl start inst -d testrac -i testrac1

檢查目前資料庫例項狀態:

SQL> SELECT INSTANCE_NAME FROM GV$INSTANCE;

INSTANCE_NAME
----------------
testrac2
testrac1
testrac3

SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;

INSTANCE_NAME
----------------
testrac2

下面關閉例項TESTRAC2

bash-3.00$ srvctl stop inst -d testrac -i testrac2

檢查會話的所在例項:

SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;

INSTANCE_NAME
----------------
testrac1

SQL> SELECT INSTANCE_NAME FROM GV$INSTANCE;

INSTANCE_NAME
----------------
testrac1
testrac3

可以看到這個配置已經滿足需求的第二點,當TESTRAC1例項異常,切換到TESTRAC2,如果TESTRAC2例項異常則切換到TESTRAC1,下面驗證需求的第三點,如果例項1和例項2都發生異常的情況。

利用srvctl關閉例項1

bash-3.00$ srvctl stop inst -d testrac -i testrac1

檢查會話所在例項:

SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;

INSTANCE_NAME
----------------
testrac3

SQL> SELECT INSTANCE_NAME FROM GV$INSTANCE;

INSTANCE_NAME
----------------
testrac3

現在滿足了負載均衡的第三點需求,當兩個例項都失敗時,切換到第三個例項TESTRAC3上。最後驗證最後一個需求。

bash-3.00$ srvctl status db -d testrac
例項 testrac1 沒有在 racnode1 節點上執行
例項 testrac2 沒有在 racnode2 節點上執行
例項 testrac3 正在節點 racnode3 上執行
bash-3.00$ srvctl start inst -d testrac -i "testrac1,testrac2"

檢查例項啟動情況:

SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;

INSTANCE_NAME
----------------
testrac3

SQL> SELECT INSTANCE_NAME FROM GV$INSTANCE;

INSTANCE_NAME
----------------
testrac3
testrac2
testrac1

下面關閉例項TESTRAC3

bash-3.00$ srvctl stop inst -d testrac -i testrac3

檢查會話所在例項:

SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;

INSTANCE_NAME
----------------
testrac2

SQL> SELECT INSTANCE_NAME FROM GV$INSTANCE;

INSTANCE_NAME
----------------
testrac2
testrac1

啟動例項TESTRAC3

bash-3.00$ srvctl start inst -d testrac -i testrac3

重新以SERVICEB服務登陸:

SQL> CONN TEST/TEST@SERVICEB
已連線。
SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;

INSTANCE_NAME
----------------
testrac3

SQL> SELECT INSTANCE_NAME FROM GV$INSTANCE;

INSTANCE_NAME
----------------
testrac3
testrac2
testrac1

使用其他客戶端,多建立幾個連線,連線到TESTRAC2例項,然後再次關閉TESTRAC3例項:

bash-3.00$ srvctl stop inst -d testrac -i testrac3

檢查例項所在會話:

SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;

INSTANCE_NAME
----------------
testrac1

SQL> SELECT INSTANCE_NAME FROM GV$INSTANCE;

INSTANCE_NAME
----------------
testrac1
testrac2

這個配置顯然也滿足了第四點需求,在例項3出現問題的時候在例項TESTRAC1和例項TESTRAC2上實現負載均衡的切換。

至此所有驗證工作完成,這個TNSNAMES.ORA的配置滿足所有的負載均衡和TAF的需求。

 

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

相關文章