Oracle RAC 同時具有HA(High Availiablity) 和LB(LoadBalance). 而其高可用性的基礎就是Failover(故障轉移). 它指集羣中任何一個節點的故障都不會影響用戶的使用,鏈接到故障節點的用戶會被自動轉移到健康節點,從用戶感覺而言, 是感受不到這種切換。 linux
Oracle 10g RAC 的Failover 能夠分爲3種: web
1. Client-Side Connect time Failover 數據庫
2. TAF session
3. Service-Side TAF ide
注意事項: 不能在listener.ora 文件中設置GLOBAL_NAME, 由於這個參數會禁用Connect-time Failover 和 Transparent Application Failover. spa
一.Client-Side Connect Time Failover blog
Client-Side Connect Time Failover的含義:若是用戶端tnsname 中配置了多個地址,用戶發起鏈接請求時,會先嚐試鏈接地址表中的第一個地址,若是這個鏈接嘗試失敗,則繼續嘗試使用第二個地址,直至鏈接成功或者遍歷了全部的地址。 生命週期
這 種Failover的特色: 只在創建鏈接那一時刻起做用,也就是說,這種Failover方式只在發起鏈接時纔會去感知節點故障,若是節點沒有反應,則 自動嘗試地址列表中的下一個地址。一旦鏈接創建以後,節點出現故障都不會作處理,從客戶端的表現就是會話斷開了,用戶程序必須從新創建鏈接。 事務
啓用這種Failover的方法就是在客戶端的tnsnames.ora中添加FAILOVER=ON 條目,這個參數默認就是ON,因此即便不添加這個條目,客戶端也會得到這種Failover能力。 ip
示例:
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)
)
)
注:rac1-vip,rac2-vip要添加到hosts 文件中,否則可能解析不了。
二. 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)
)
)
)