Failover 之 Client-Side Connect time Failover、Client-Side TAF、Service-Side TAF

張衝andy發表於2017-02-25
                           三種 Failover 之 Client-Side Connect time Failover、Client-Side TAF、Service-Side TAF




理論背景


Oracle  RAC 同時具備HA(High Availiablity) 和LB(LoadBalance). 而其高可用性的基礎就是Failover(故障轉移). 
它指叢集中任何一個節點的故障都不會影響使用者的使用,連線到故障節點的使用者會被自動轉移到健康節點,從使用者感受而言, 
是感覺不到這種切換。正是因為這樣,才能根據業務的不同實行分機分業務分負載。


一:Failover介紹


Oracle RAC 的Failover 可以分為3種:
1. Client-Side Connect time Failover
2. Client-Side TAF
3. Service-Side TAF




一.1  Client-Side Connect Time Failover


tnsnames.ora檔案配置示例:


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)
      )
    )




一.2  Client-Side TAF(Transparent Application Failover) 


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語句會被轉移到新的例項上,在新的節點上繼續返回後續結果集,而已經返回的記錄集則拋棄。


顯然為了實現select 方式,Oracle 必須為每個session儲存更多的內容,包括遊標,使用者上下文等,需要更多的資源也是用資源換時間的方案。


3. DELAY :  這個引數分別代表重試間隔時間。
4. RETRIES: 這個引數分別代表重試次數。


示例:
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)
 )
      )
    )




一.3  Service-Side TAF
Service-Side TAF 可以看作是TAF的一種變種,首先Service-SideTAF也是TAF,所有TAF的特點它都有,其次這種TAF是在伺服器上配置的,而不像TAF是在客戶端配置的。


PREFERRED: 首選例項,會優先選擇擁有這個角色的例項提供服務。
AVAILABLE: 後備例項,使用者連線會優先連線PREFFERRED的Instance,當PREFERRED的Instance不可用時,才會被轉到AVAILBALE的Instance上。




要使用Server-Side TAF必須配置Service。 Service 可以在建立資料庫時建立,也可以在建立資料庫之後修改,既可以使用dbca 配置嚮導,也可以用命令列的 方式配置。 


操作流程


10g:


用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配置後,服務會自動啟動。






11g:
用srvctl 命令配置Service


1 建立service
#Srvctl add service -d <database-name> -s <service-name> -r "preferred-instance-list" -a "available-instance-list" -P <TAF-policy> 


例如:
srvctl add service -d RAC -s Service2 -r "RAC1,RAC2" -a "RAC3,RAC4" -P basic


注意:srvctl add service中,只有perferred才會建立服務。 即在OCR中註冊一個ora.raw.dmm.rac1.Srv的服務。
 
2 檢視配置資訊
#srvctl config service -d database-name [-s service-name] [-a]


如果這裡不指定"-s service-name",就會顯示所有Service的配置,這些配置包括preferred 和available instance. 使用-a 選項,還會顯示TAF 相關資訊。


3 是否自動執行service
資料庫啟動時,會自動啟動所有的Service。有時為了為了維護需要,需要禁用這個特性,在維護完成後再啟動這個特性。
#srvctl enable/disable service -d database-name -s service-name -i instance-name


4 啟動service
#srvctl start service -d <database-name> -s <service-name> -i instance-name -o start-option -c connect-string -q


如果不指定service-name, 則所有的service 都會被啟動,可以使用逗號分隔方式,同時啟動多個service。 -i 指定在那個例項上啟動service。


5 停止service
#srvctl stop service -d <database-name> -s <service-name> -i instance-name -c connect-string -q -f


其中-f 選項可以強制關閉service,並中斷了其所有使用者的連線。


6 檢視service 狀態
#srvctl status service -d <database-name> -s  service-name -i instance-name -f -v


其中-f 可以顯示被disable的instance 資訊,而-v 可以顯示詳細輸出


7 刪除service
#srvctl remove service -d database-name -s service-name -i instance-name [-f]
 
注意:在使用srvctl 建立service時,需要注意TAF策略選項必須透過dbms_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;










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

相關文章