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

yangtingkun發表於2009-07-10

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

這篇解決其中一個節點沒有啟動時帶來的連線失敗問題。

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

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

 

 

上一篇的配置基本實現了負載均衡配置的需要,但是存在一點問題,當節點3失敗的時候,當前連線到節點3上的會話會自動FAILOVER到節點1和節點2上,但是新的會話嘗試連線到節點3,就會報錯。

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

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

下面關閉例項3

$ srvctl stop inst -d testrac -i testrac3

再次檢查剛才的例項:

SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;

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

FAILOVER設定生效了,連線到例項3的會話自動切換到例項2上,但是這種配置沒有解決新連線的問題,如果這時再次連線例項3,則會報錯:

SQL> CONN TEST/TEST@SERVICEB
ERROR:
ORA-12521: TNS:
監聽程式無法解析連線描述符中給定的 INSTANCE_NAME


警告: 您不再連線到 ORACLE

其實這個問題不難解決,修改TNSNAMES.ORA中的配置如下:

SERVICEB =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS_LIST =
        (ADDRESS = (PROTOCOL = TCP)(HOST = 172.25.198.227)(PORT = 1521))
      )
      (CONNECT_DATA =
        (SERVER = DEDICATED)
        (SERVICE_NAME = TESTRAC)
        (INSTANCE_NAME = TESTRAC3)
        (FAILOVER_MODE =
          (TYPE = SELECT)
          (METHOD = BASIC)
          (BACKUP = SERVICEA)
        )
      )
    )
    (DESCRIPTION =
      (ADDRESS_LIST =
        (ADDRESS = (PROTOCOL = TCP)(HOST = 172.25.198.224)(PORT = 1521))
        (ADDRESS = (PROTOCOL = TCP)(HOST = 172.25.198.225)(PORT = 1521))
      )
      (CONNECT_DATA =
        (SERVER = DEDICATED)
        (SERVICE_NAME = TESTRAC)
        (FAILOVER_MODE =
          (TYPE = SELECT)
          (METHOD = BASIC)
          (BACKUP = SERVICEA_BACKUP)
        )
      )
    )
    (LOAD_BALANCE = no)
  )

由於只牽扯到節點3的問題,因此只需要修改SERVICEB的配置,其他兩個配置SERVICEASERVICEA_BACKUP的配置不需要修改。

下面重現啟動例項3,再次執行剛才的測試:

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

現在3個節點都處於啟動狀態,下面仍然關閉節點3

$ srvctl stop inst -d testrac -i testrac3

再次檢查當前連線的例項:

SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;

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

FAILOVER起作用了,連線到節點3上的會話重現連線到節點1上。再次透過SERVICEB服務連線到節點3上:

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

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

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

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

這次連線節點3沒有再次報錯,而是在節點1和節點2的例項上以負載均衡的方式實現連線,這樣新連線到例項3上的會話,就會例項3上已經建立的會話保持一致了。

 

 

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

相關文章