Oracle 10g RAC TAF

zhouxianwang發表於2015-05-07

Oracle  RAC 同時具備HA(High Availiablity) 和LB(LoadBalance). 而其高可用性的基礎就是Failover(故障轉移). 它指叢集中任何一個節點的故障都不會影響使用者的使用,連線到故障節點的使用者會被自動轉移到健康節點,從使用者感受而言, 是感覺不到這種切換。  
Oracle 10g RAC 的Failover 可以分為3種:
1. Client-Side Connect time Failover
2. TAF
3. Service-Side TAF
注意事項: 不能在listener.ora 檔案中設定GLOBAL_NAME, 因為這個引數會禁用Connect-time Failover 和 Transparent Application Failover.
Client-Side Connect Time Failover
Client-Side Connect Time Failover的含義:如果使用者端tnsname 中配置了多個地址,使用者發起連線請求時,會先嚐試連線地址表中的第一個地址,如果這個連線嘗試失敗,則繼續嘗試使用第二個地址,直至連線成功或者遍歷了所有的地址。
這種Failover的特點:只在建立連線那一時刻起作用,也就是說,這種Failover方式只在發起連線時才會去感知節點故障,如果節點沒有反應,則 自動嘗試地址列表中的下一個地址。一旦連線建立之後,節點出現故障都不會做處理,從客戶端的表現就是會話斷開了,使用者程式必須重新建立連線。
啟用這種Failover的方法就是在客戶端的tnsnames.ora中新增FAILOVER=ON 條目,這個引數預設就是ON,所以即使不新增這個條目,客戶端也會獲得這種Failover能力。
TAF(Transparent Application Failover)
這塊的配置,參考:
10g & 11g Configuration of TAF(Transparent Application Failover) and Load Balancing [ID 453293.1]
現在的大部分流行的應用系統(如:weblogic, Jboss),都是啟動時就建立若干到資料庫的長連線,在應用程式整個生命週期內重用這些連線。 而Client-Side Connet Time Failover的工作方式使它對應用程式的可用性沒有太大幫助。
所以從Oracle 8.1.5 版本只有引入了新的Failover 機制—TAF。 所謂TAF,就是連線建立以後,應用系統執行過程中,如果某個例項發生故障,連線到這個例項上的使用者會被自動遷移到其他的健康例項上。對於應用程式而言, 這個遷移過程是透明的,不需要使用者的介入,當然,這種透明要是有引導的,因為使用者的未提交事務會回滾。 相對與Client-Side Connect Time Failover的使用者程式中斷,丟擲連線錯誤,使用者必須重啟應用程式,TAF 這種方式在提高HA上有了很大的進步。
TAF 的配置也很簡單,只需要在客戶端的tnsnames.ora中新增FAILOVER_MODE配置項。這個條目有4個子專案需要定義。
1.METHOD: 使用者定義何時建立到其例項的連線,有BASIC 和 PRECONNECT 兩種可選值。
BASIC: 是指在感知到節點故障時才建立到其他例項的連線。
PRECONNECT: 是在最初建立連線時就同時建立到所有例項的連線,當發生故障時,立刻就可以切換到其他鏈路上。
兩種方法比較: BASIC方式在Failover時會有時間延遲,PRECONNECT方式雖然沒有時間延遲,但是建立多個冗餘連線會消耗更多資源,兩者就是是用時間換資源和用資源換時間的區別。
2. TYPE: 用於定義發生故障時對完成的SQL 語句如何處理,其中有2種型別:session 和select.
這2種方式對於未提交的事務都會自動回滾,區別在於對select 語句的處理,對於select,使用者正在執行的select語句會被轉移到新的例項上,在新的節點上繼續返回後續結果集,而已經返回的記錄集則拋棄。
假設使用者正在節點1上執行查詢,整個結果集共有100條記錄,現在已從節點1上返回10條記錄,這時節點1當機,使用者連線被轉移到節點2上,如果是 session模式,則需要重新執行查詢語句;如果是select方式,會從節點2上繼續返回剩下的90天記錄,而已經從節點1返回的10條記錄不會重複 返回給使用者,對於使用者而言,感受不到這種切換。
顯然為了實現select 方式,Oracle 必須為每個session儲存更多的內容,包括遊標,使用者上下文等,需要更多的資源也是用資源換時間的方案。
3. DELAY 和 RETRIES: 這2個引數分別代表重試間隔時間和重試次數。
示例:
RAC =
  (DESCRIPTION =
     (ADDRESS = (PROTOCOL = TCP)(HOST = rac1-vip)(PORT = 1521))
     (ADDRESS = (PROTOCOL = TCP)(HOST = rac2-vip)(PORT = 1521))
      (LOAD_BALANCE=YES)
      (
 CONNECT_DATA=
     (SERVER=DEDICATED)
 (SERVICE_NAME=RAC)
 (
    FAILOVER_MODE=
(TYPE=session)
(METHOD=basic)
(RETRIES=180)
(DELAY=5)
 )
      )
    )

Service-Side TAF
Service-Side TAF的配置參考:
How To Configure Server Side Transparent Application Failover [ID 460982.1]
Service-SideTAF 可以看作是TAF的一種變種,首先Service-SideTAF也是TAF,所有TAF的特點它都有,其次這種TAF是在伺服器上配置的,而不像TAF是在客戶端配置的。
Client-Side TAF 是在客戶端修改tnsnames.ora 檔案來配置的,如果有很多客戶端使用這個資料庫,那麼每次微笑調整都需要把所有的計算機更改一遍,既低效又容易出錯。而Service-Side TAF 透過結合Service,在資料庫裡儲存FAIL_MODE的配置,把所有的TAF配置儲存在資料字典中,從而省去了客戶端的配置工作,現在客戶端的 TNS檔案就不需要任何TAF的配置選項了。
從配置引數而言,Service-Side TAF和TAF 相比多了一個Instance Role(例項角色)的概念。 所謂的例項角色,就是當有多個Instance 參與一個Service時,可以配置優先使用哪一個Instance為使用者提供服務。使用者共有兩種可選角色。
PREFERRED:首選例項,會優先選擇擁有這個角色的例項提供服務。
AVAILABLE: 後備例項,使用者連線會優先連線PREFFERRED的Instance,當PREFERRED的Instance不可用時,才會被轉到AVAILBALE的Instance上。
要使用Server-Side TAF必須配置Service。 Service 可以在建立資料庫時建立,也可以在建立資料庫之後修改,既可以使用dbca 配置嚮導,也可以用命令列的方式配置。
用DBCA 配置Service
1、執行DBCA,選擇ORACLE RAC Application Clusters database
2、在第二個介面選擇:Services Management
3、第三個介面會出現RAC 資料庫列表,使用者可以在這個列表中選擇要配置Service 的資料庫
4、在Serice配置介面中,單擊Add 建立新的Service,輸入service名字。在Instance列表框定義例項角色,選擇那個service1 作為 Preferred(首選例項),Service2 作為availiable(後備例項)。 TAF Policy有三個選項: None, Basic,Pre-connect。 我們選Basic。 最後點選Finish,完成Service 配置。
5、在結束Service配置後,服務會自動啟動。
用srvctl 命令配置Service
用命令列方式配置Service 對遠端維護很有用。 先來看一下相關命令
建立service
#Srvctl add service -d -s -r "preferred-instance-list" -a "available-instance-list" -P
其中TAF-Policy可選:basic 和 preconnect。 例如:
srvctl add service -d RAC -s Service2 -r "RAC1,RAC2" -a "RAC3,RAC4" -P basic
注意:srvctl add service中,只有perferred才會建立服務。 即在OCR中註冊一個ora.raw.dmm.Raw1.Srv的服務。
檢視配置資訊
#srvctl config service -d database-name [-s service-name] [-a]
如果這裡不指定"-s service-name",就會顯示所有Service的配置,這些配置包括preferred 和available instance. 使用-a 選項,還會顯示TAF 相關資訊。
是否自動執行service
資料庫啟動時,會自動啟動所有的Service。有時為了為了維護需要,需要禁用這個特性,在維護完成後再啟動這個特性。
#srvctl enable/disable service -d database-name -s service-name -i instance-name
啟動service
#srvctl start service -d -s -i instance-name -o start-option -c connect-string -q

如果不指定service-name, 則所有的service 都會被啟動,可以使用逗號分隔方式,同時啟動多個service。 -i 指定在那個例項上啟動service。
停止service
#srvctl stop service -d -s -i instance-name -c connect-string -q -f
其中-f 選項可以強制關閉service,並中斷了其所有使用者的連線。
檢視service 狀態
#srvctl status service -d -s  service-name -i instance-name -f -v
其中-f 可以顯示被disable的instance 資訊,而-v 可以顯示詳細輸出
刪除service
#srvctl remove service -d database-name -s service-name -i instance-name [-f]
配置資料字典中的service資訊
Begin
Dbms_service.modify_service(
Service_name='>Service1',
Failover_method=>dbms_service.failover_method_basic,
Failover_type=>dbms_service.failover_type_select,
Failover_retries=>180,
Failover_delay=>5
);
    End;

刪除資料字典裡的service資訊
begin
      dbms_service.delete_service(service_name=>'dmm');
end;

配置Service 的注意事項
1、資料庫的服務名是用service_name 引數來指定的,一個資料庫可以有多個服務名,但是service_name最長是4kb,不要手工來修改這個引數
2、最多可以建立64個service,每個資料庫有2個隱含的service,因此留給使用者的就只有62個service。不能修改這兩個隱含 service的配置,並且也不能手工啟動或停止這2個服務。 這兩個隱含的service分別是:SYS$BACKGROUND 和 SYS$USERS.
3、當使用dbca配置Service 時,dbca 會自動更新OCR,啟動Service, 當刪除service時,會停止service,並更新OCR.
4、使用srvctl 這個工具時,命令只更新OCR中的配置,不會更新data dctionary和listener中的資訊,因此還需要使用dbma_servie 包來更新data dictionary,手工更改listener配置檔案。 故推薦使用DBCA工具來配置更改service配置

5、無論使用DBCA還是srvctl 建立service,都需要使用dbms_service包來配置TAF策略。使用srvctl刪除service時需手動停止service,否則會失敗。
6、如果客戶端想透過Service方式連線資料庫,需要在tns條目中使用service_name 方式引用資料庫。 如:
RAC =
  (DESCRIPTION =
     (ADDRESS = (PROTOCOL = TCP)(HOST = rac1-vip)(PORT = 1521))
     (ADDRESS = (PROTOCOL = TCP)(HOST = rac2-vip)(PORT = 1521))
      (LOAD_BALANCE=YES)
      (
    CONNECT_DATA=
     (SERVER=DEDICATED)
 (SERVICE_NAME=RAC)
      )
           )

注意:
客戶端tnsnames.ora 中的service_name 要寫我們的service-side TAF的名稱。可以透過一下方式檢視:
SQL> showparameter service
NAME                                 TYPE       VALUE
----------------------------------------------- -----------------
service_names                        string      dave, dave_taf

然後可以驗證:
SQL> show parameter instance_name
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------
instance_name                        string      rac1
SQL> select sid from v$mystat where rownum=1;
       SID
----------
       146
SQL> select failover_type,failover_method,failed_over from v$session where sid=146;
FAILOVER_TYPE FAILOVER_M FAILED_OVE
------------- ---------- ----------       
SELECT        BASIC      YES

--如果客戶端寫的不是SERVICE-SIDE TAF的名稱,而是例項的名稱,那麼不影響資料庫的連線,但是無法實現TAF功能。

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

相關文章