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

yangtingkun發表於2009-04-18

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

這篇文章給出問題以及問題的實現。

 

 

首先描述一下3RAC伺服器,IP地址分別為172.25.198.222172.25.198.223172.25.198.226,對應的VIP分別是172.25.198.224172.25.198.225172.25.198.227。資料庫版本是10203 for Solaris sparc 64

資料庫名為testrac,三個例項分別為testrac1testrac2testrac3

首先看一下Thomas Zhang給出的題目需求:

給你個題目,我上次搞了好一會兒,呵呵

需求:一個RAC,三個節點node1,node2,node3

兩臺app server AB

要求:1)正常情況下,server A透過node1node2訪問資料庫,server B透過node3訪問資料。

server A透過node1node2時要load balance

2)當node1異常,server A上的應用透過node2訪問
node2異常,server A上的應用透過node1訪問
3
)當node1,node2同時異常,server A上的應用透過node3全部接管

4)當node3異常,server B上的應用透過node1/node2接管並Load Balance.

TNSNAMES中的配置可是是很靈活的,使用者可以透過配置服務名,使得使用者訪問RAC環境中的一個、多個或全部的例項,可以在訪問的例項中實現輪巡檢查機制或負載均衡機制,還可以配置Transparent Application Failover功能。比如上面這個要求,就非常的靈活,不但要求不同的伺服器訪問不同的例項,還要求配置負載均衡以及TAF,這就使得TNSNAMES服務的配置比較複雜,不過也正好體現了TNS配置的靈活性。

下面給出根據這個要求的TNSNAMES.ORA的配置:

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

SERVICEB =
  (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)
      )
    )
  )

SERVICEA_BACKUP =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS_LIST =
        (ADDRESS = (PROTOCOL = TCP)(HOST = 172.25.198.224)(PORT = 1521))
      )
      (CONNECT_DATA =
        (SERVER = DEDICATED)
        (SERVICE_NAME = TESTRAC)
        (INSTANCE_NAME = TESTRAC1)
        (FAILOVER_MODE =
          (TYPE = SELECT)
          (METHOD = BASIC)
          (BACKUP = SERVICEA_BACKUP)
        )
      )
    )
    (DESCRIPTION =
      (ADDRESS_LIST =
        (ADDRESS = (PROTOCOL = TCP)(HOST = 172.25.198.225)(PORT = 1521))
      )
      (CONNECT_DATA =
        (SERVER = DEDICATED)
        (SERVICE_NAME = TESTRAC)
        (INSTANCE_NAME = TESTRAC2)
        (FAILOVER_MODE =
          (TYPE = SELECT)
          (METHOD = BASIC)
          (BACKUP = SERVICEA_BACKUP)
        )
      )
    )
    (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)
        )
      )
    )
    (LOAD_BALANCE = no)
  )

簡單描述一下配置的思路。將上面3個服務名的配置分別新增到server Aserver BTNSNAMES.ORA檔案中。

server A中透過SERVICEA服務名進行訪問,在server B中透過SERVICEB服務名進行訪問。SERVICEA_BACKUPSERVICEA所需的TAFBACKUP服務。

SERVICEA指定了兩個DESCRIPTION,一個指定訪問TESTRAC1例項(透過指定INSTANCE_NAME來實現),一個指定訪問TESTRAC2例項,且在兩個DESCRIPTION之間實現負載均衡(透過指定LOAD_BALANCE=YES來實現)。

SERVICEB很簡單,就是配置TESTRAC3例項的連線方式。

這樣server A上的程式透過SERVICEA可以負載均衡的訪問例項TESTRAC1TESTRAC2,而server B上的程式透過SERVICEB可以訪問例項TESTRAC3。這滿足了第一點要求。

剩下的3點都是TAF有關,先來看看最簡單的最後一條要求,當node3異常,server B上的應用透過node1/node2接管並Load Balance。而SERVICEBTAF配置的BACKUP服務指向的就是SERVICEA,也就是說,如果例項TESTRAC3出現了失敗,server B會使用SERVICEA作為切換服務名,很自然的實現了在TESTRAC1TESTRAC2上負載均衡的接管失敗會話。

剩下的兩點的實現透過SERVICEA_BACKUP來實現。可以看到,SERVICEA中配置了的兩個DESCRIPTION,分別對應TESTRAC1例項和TESTRAC2例項。而這兩個例項的FAILOVER_MODEBACKUP配置是一樣的,都是指向SERVICEA_BACKUP服務,也就是說,無論TESTRAC1例項異常,還是TESTRAC2例項異常,都會使用SERVICEA_BACKUP服務作為切換服務。

下面來看看SERVICEA_BACKUP服務,這個服務順序配置了TESTRAC1TESTRAC2TESTRAC3三個服務的DESCRIPTION,且這三個服務之間沒有采用負載均衡的策略(LOAD_BALANCE=no,這樣使用者在使用這個配置的時候,會首先嚐試第一個DESCRIPTIONTESTRAC1,如果TESTRAC1服務可以連線成功,就使用這個服務,否則會嘗試第二個DESCRIPTIONTESTRAC2,同樣如果連線成功,就使用TESTRAC2,否則使用最後一個DESCRIPTIONTESTRAC3

當例項TESTRAC1發生異常,透過TAF切換到SERVICEA_BACKUP,首先找到的就是TESTRAC1DESCRIPTION,但是TESTRAC1已經發生故障,因此會繼續尋找下一個DESCRIPTION,於是就找到了TESTRAC2服務。

當例項TESTRAC2發生異常,透過TAF切換到SERVICEA_BACKUP,首先找到的是TESTRAC1DESCRIPTION,如果TESTRAC1正常,就會連線到TESTRAC1上。

如果恰好TESTRAC1TESTRAC2例項都發生異常,切換到SERVICEA_BACKUP後,會先後跳過失敗TESTRAC1TESTRAC2DESCRIPTION,最終找到TESTRAC3,並連線。從而滿足了第二和第三點需求。

上面配置就實現了3個節點間靈活的負載均衡以及透明應用失敗切換的配置。

 

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

相關文章