Oracle 10g RAC TAF介紹html
轉自:http://www.cnblogs.com/einyboy/archive/2012/11/19/2777855.htmlnode
Oracle RAC 同時具有HA(High Availiablity) 和LB(LoadBalance). 而其高可用性的基礎就是Failover(故障轉移). 它指集羣中任何一個節點
的故障都不會影響用戶的使用,鏈接到故障節點的用戶會被自動轉移到健康節點,從用戶感覺而言, 是感受不到這種切換。
Oracle 10g RAC 的Failover 能夠分爲3種:
1. Client-Side Connect time Failover
2. Client-Side 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能力。
示例:
VICTOR =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = node01-vip)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = node02-vip)(PORT = 1521))
(LOAD_BALANCE = yes)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = vic)
)
)
注:node01-vip,node02-vip要添加到hosts 文件中,否則可能解析不了。
二. Client-Side TAF(Transparent Application Failover)
如今的大部分流行的應用系統(如: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:是在最初創建鏈接時就同時創建到全部實例的鏈接,當發生故障時,馬上就能夠切換到其餘鏈路上。
注意:server-side TAF的failover方式沒法設置爲PRECONNECT,只能設置爲BASIC,10g,11g都是如此。因此,若是failover方式要設定
爲PRECONNECT,就只能使用client-side TAF。
兩種方法比較: BASIC方式在Failover時會有時間延遲,PRECONNECT方式雖然沒有時間延遲,可是創建多個冗餘鏈接會消耗更多資源,
二者就是是用時間換資源和用資源換時間的區別。
2. TYPE: 用於定義發生故障時對完成的SQL 語句如何處理,其中有2種類型:session 和select.
這2種方式對於未提交的事務都會自動回滾,區別在於對select 語句的處理,對於select,用戶正在執行的select語句會被轉移到新的實例
上,在新的節點上繼續返回後續結果集,而已經返回的記錄集則拋棄。
假設用戶正在節點1上執行查詢,整個結果集共有10000條記錄,如今已從節點1上返回9000條記錄,這時節點1宕機,用戶鏈接被轉移到節
點2上,若是是session模式,則須要從新執行查詢語句;若是是select方式,會從節點2上繼續返回剩下的1000條記錄,而已經從節點1返
回的9000條記錄不會重複返回給用戶,對於用戶而言,感覺不到這種切換。
顯然爲了實現select 方式,Oracle 必須爲每一個session保存更多的內容,包括遊標,用戶上下文等,須要更多的資源也是用資源換時間
的方案。
3. DELAY 和 RETRIES: 這2個參數分別表明重試間隔時間和重試次數。
示例:
DCSRV =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = node01-vip)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = node02-vip)(PORT = 1521))
(LOAD_BALANCE = yes)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = dcsrv)
(FAILOVER_MODE =
(TYPE = SELECT)
(METHOD = BASIC)
(RETRIES = 180)
(DELAY = 5)
)
)
)
三. Service-Side TAF
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 配置嚮導,也能夠用命令行的 方式配置。第二步,必須經過dbms_service包來配置TAF策略選項。
注意:server-side的TAF策略會覆蓋掉client-side的TAF策略,因此若是使用client-side TAF鏈接數據庫而不想使用server-side的策略,
就只能使用另一個service。
3.1 用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配置後,服務會自動啓動。
3.2 用srvctl 命令配置Service
用命令行方式配置Service 對遠程維護頗有用。 先來看一下相關命令
1) 建立service
#Srvctl add service -d <database-name> -s <service-name> -r "preferred-instance-list" -a "available-instance-list" -P <TAF-policy>
其中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.vic.dcsrv.vic1.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;
3.3 配置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) 若是客戶端想經過Service 方式鏈接數據庫,須要在tns條目中使用service_name 方式引用數據庫。 如:
VICTOR =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = node01-vip)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = node02-vip)(PORT = 1521))
(LOAD_BALANCE = yes)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = vic)
)
)
注意:不管是使用dbca 工具仍是使用srvctl 命令來配置service,都沒法配置TAF的TYPE,DELAY,RETRIES 三個屬性,必須使用
dbms_service包來修改這些屬性。
四. Srvctl 命令測試實例
先查看一下RAC 啓動狀況:
[[oracle@node1 ~]# ./crs_stat -t
Name Type Target State Host
------------------------------------------------------------
ora.vic.db application ONLINE ONLINE node1
ora.vic.vic.cs application ONLINE ONLINE node1
ora....ic1.srv application ONLINE ONLINE node1
ora....ic2.srv application ONLINE ONLINE node2
ora....w1.inst application ONLINE ONLINE node1
ora....w2.inst application ONLINE ONLINE node2
ora....SM1.asm application ONLINE ONLINE node1
ora....W1.lsnr application ONLINE ONLINE node1
ora.vic1.gsd application ONLINE ONLINE node1
ora.vic1.ons application ONLINE ONLINE node1
ora.vic1.vip application ONLINE ONLINE node1
ora....SM2.asm application ONLINE ONLINE node2
ora....W2.lsnr application ONLINE ONLINE node2
ora.vic2.gsd application ONLINE ONLINE node2
ora.vic2.ons application ONLINE ONLINE node2
ora.vic2.vip application ONLINE ONLINE node2
[[oracle@node1 ~]# ps -ef|grep smon
root 12489 5411 0 09:30 pts/1 00:00:00 grep smon
oracle 19466 1 0 09:06 ? 00:00:03 asm_smon_+ASM1
oracle 19985 1 0 09:06 ? 00:00:02 ora_smon_vic1
一切正常。
1) 查看現有的service
[[oracle@node1 ~]$ export ORACLE_SID=vic1
[[oracle@node1 ~]$ sqlplus /nolog
SQL*Plus: Release 10.2.0.4.0 - Production on Mon Aug 6 11:01:31 2012
Copyright (c) 1982, 2005, Oracle. All rights reserved.
SQL> conn / as sysdba
Connected.
SQL> show parameter service
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
service_names string vic
SQL>
2)使用srvctl 命令建立dcsrv 服務
[[oracle@node1 ~]$ srvctl add service -d vic -s dcsrv -r "vic1,vic2" -P basic
[[oracle@node1 ~]$ crs_stat -t
Name Type Target State Host
------------------------------------------------------------
ora.vic.db application ONLINE ONLINE node1
ora.vic.dcsrv.cs application OFFLINE OFFLINE
ora....ic1.srv application OFFLINE OFFLINE
ora....ic2.srv application OFFLINE OFFLINE
ora....c1.inst application ONLINE ONLINE node1
ora....c2.inst application ONLINE ONLINE node2
ora....SM1.asm application ONLINE ONLINE node1
ora....W1.lsnr application ONLINE ONLINE node1
ora.vic1.gsd application ONLINE ONLINE node1
ora.vic1.ons application ONLINE ONLINE node1
ora.vic1.vip application ONLINE ONLINE node1
ora....SM2.asm application ONLINE ONLINE node2
ora....C2.lsnr application ONLINE ONLINE node2
ora.vic2.gsd application ONLINE ONLINE node2
ora.vic2.ons application ONLINE ONLINE node2
ora.vic2.vip application ONLINE ONLINE node2
[[oracle@node1 ~]$ srvctl add service -d vic -s dcsrv -r vic1 -a vic2 -P basic
注意:srvctl add service中,只有perferred纔會建立服務。 即在OCR中註冊一個ora.vic.dcsrv.vic1.Srv的服務。
3)確認服務建立成功,offline 表示尚未啓動
[[oracle@node1 ~]$ crs_stat -t
Name Type Target State Host
------------------------------------------------------------
ora.vic.db application ONLINE ONLINE node1
ora.vic.dcsrv.cs application OFFLINE OFFLINE
ora....ic1.srv application OFFLINE OFFLINE
ora.vic.vic.cs application ONLINE ONLINE node1
ora....ic1.srv application ONLINE ONLINE node1
ora....c1.inst application ONLINE ONLINE node1
ora....c2.inst application ONLINE ONLINE node2
ora....SM1.asm application ONLINE ONLINE node1
ora....W1.lsnr application ONLINE ONLINE node1
ora.vic1.gsd application ONLINE ONLINE node1
ora.vic1.ons application ONLINE ONLINE node1
ora.vic1.vip application ONLINE ONLINE node1
ora....SM2.asm application ONLINE ONLINE node2
ora....C2.lsnr application ONLINE ONLINE node2
ora.vic2.gsd application ONLINE ONLINE node2
ora.vic2.ons application ONLINE ONLINE node2
ora.vic2.vip application ONLINE ONLINE node2
4)配置這個服務自啓動
[[oracle@node1 ~]$ srvctl enable service -d vic -s dcsrv
PRKP-1018 : Service dcsrv already enabled.
5)啓動服務
[[oracle@node1 ~]$ srvctl start service -d vic -s dcsrv
6)確認服務狀態。Online 說明已啓動
[[oracle@node1 ~]$ crs_stat -t
Name Type Target State Host
------------------------------------------------------------
ora.vic.db application ONLINE ONLINE node1
ora.vic.dcsrv.cs application ONLINE ONLINE node1
ora....ic1.srv application ONLINE ONLINE node1
ora.vic.vic.cs application ONLINE ONLINE node1
ora....w1.inst application ONLINE ONLINE node1
ora....w2.inst application ONLINE ONLINE node2
ora....SM1.asm application ONLINE ONLINE node1
ora....W1.lsnr application ONLINE ONLINE node1
ora.vic1.gsd application ONLINE ONLINE node1
ora.vic1.ons application ONLINE ONLINE node1
ora.vic1.vip application ONLINE ONLINE node1
ora....SM2.asm application ONLINE ONLINE node2
ora....W2.lsnr application ONLINE ONLINE node2
ora.vic2.gsd application ONLINE ONLINE node2
ora.vic2.ons application ONLINE ONLINE node2
ora.vic2.vip application ONLINE ONLINE node2
新建的服務會自動添加到初始話參數中:
SQL> show parameter service
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
service_names string dcsrv, vic
7)用service TAF 修改配置,須要用dbms_service.modify_service包。
SQL> begin
dbms_service.modify_service(
service_name=>'dcsrv',
failover_method=>dbms_service.failover_method_basic,
failover_type=>dbms_service.failover_type_select,
failover_retries=>180,
failover_delay=>5);
end;
/
PL/SQL procedure successfully completed.
8) 確認參數已經生效
SQL> select name,failover_method,failover_type,goal,clb_goal from dba_services;
NAME FAILOVER_METHOD FAILOVER_TYPE GOAL CLB_G
-------------------- ------------------------------------ -------------------------------- --------------- -------------
SYS$BACKGROUND NONE SHORT
SYS$USERS NONE SHORT
vic LONG
dcsrv BASIC SELECT NONE LONG
9) 也能夠用srvctl 命令查看配置狀況
[[oracle@node1 ~]$ srvctl config service -d vic -s dcsrv -a
dcsrv PREF: vic1 AVAIL: vic2 TAF: basic
10) 刪除Service
先關閉service:
[[oracle@node1 ~]$ srvctl stop service -d vic -s dcsrv
[[oracle@node1 ~]$ srvctl disable service -d vic -s dcsrv
刪除服務:
[[oracle@node1 ~]$ srvctl remove service -d vic -s dcsrv
dcsrv PREF: vic1 AVAIL: vic2
Service dcsrv is disabled.
Remove service dcsrv from the database vic? (y/[n]) y
若是該命令清楚不掉,咱們能夠加上-f 參數
[[oracle@node1 ~]# ./srvctl remove service -d vic -s dcsrv -f
OCR中的信息已經被刪除了,可是數據字典中的還有該service的內容,繼續清除數據字典中的內容。
先查看數據字典內容:
SQL> select name,failover_method,failover_type,goal,clb_goal from dba_services;
NAME FAILOVER_METHOD FAILOVER_TYPE GOAL CLB_G
-------------------- ------------------------------- ---------------------------- --------------- -------------
SYS$BACKGROUND NONE SHORT
SYS$USERS NONE SHORT
vic LONG
dcsrv BASIC SELECT NONE LONG
清除數據字典裏的內容:
SQL> begin
2 dbms_service.delete_service(service_name=>'dcsrv');
3 end;
4 /
PL/SQL procedure successfully completed.
再次查詢數據字典,沒有了數據。清除完成
SQL> select name,failover_method,failover_type,goal,clb_goal from dba_services;
NAME FAILOVER_METHOD FAILOVER_TYPE GOAL CLB_G
-------------------- ------------------------------- ---------------------------- --------------- -------------
SYS$BACKGROUND NONE SHORT
SYS$USERS NONE SHORT
vic LONGweb