oracle的TAF淺析

jeanron100發表於2015-08-23
在使用rac的時候,有幾個很閃亮的使用特性,一個就是load balance,這塊毋庸置疑,確實做了很大的改進,從10g版本開始的多個vip地址的load balance,到11g版本中的進一步load balance改進 scan-ip,確實做了很大的簡化。
而在failover的實現中,還是有一定的使用限定,比如11g中預設的scan-ip的實現其實還是預設沒有failover的選項,如果兩個節點,某個節點掛了,那麼原有的連線中繼續查詢就會提示session已經斷開,需要重連。
很多應用都在這樣使用scan-ip,也都相安無事,所以對於failover的選擇還是有一定選擇空間,如果說failover的實現方式,簡單來說,主要就是透過換取時間,或者換取資源來實現。
怎麼理解呢。
假設我們存在兩個節點,如果某個session連線到了節點2,突然節點2掛了,那麼故障轉移的方式就有透過換取時間或者換取資源。
比如說換取時間,為了更快達到failover的速度,failover method 有preconnect,這種預連線方式還是會佔用較多的資源使用,在各個節點上還是會預先佔用一部分額外的資源,在切換時會相對更加平滑,速度更快。這種就是preconect的方式
另外一種情況,則在發生failover的情況時,再去切換對應的資源,中間會有一些卡頓,但是對於資源的相對來說要小很多。這種就是預設的basic模式。

failover method側重於使用者對於何時建立到例項的連線,即basic方式會在故障發生時採取判斷,有一種delay的味道,而preconnect則是未雨綢繆,先準備後,在出現故障的時候,能夠更快切換,從實際的應用來說,還是basic這種方式更加通用。

而對於failover的型別來說,rac的實現更加豐富而且靈活,這在別的資料庫中真是不可想象。這個時候它的粒度就在於使用者對於sql的執行情況進行控制。
比如說,我們有個很大的查詢在節點2上進行,結果節點2突然掛了,然後這個時候,failover的型別就有兩種,即對於正在執行的查詢,比如說有1萬條資料,結果剛好故障發生的時候查出了8000條,那麼剩下的2000該怎麼處理。
一種方式就是使用select,即會完成故障切換,繼續把剩下的2000條記錄返回,當然中間會有一些上下文環境的切換,對於使用者基本還是透明的,但是會有一定的延時。
另外一種是直接斷開連線,要求重新查詢。這種type是session

在10g版本中藉助於vip的配置達到load balance+failover的配置如下:
racdb=

(DESCRIPTION =

  (ADDRESS= (PROTOCOL= TCP)(HOST=192.168.3.101)(PORT= 1521))

  (ADDRESS= (PROTOCOL= TCP)(HOST=192.168.3.201)(PORT= 1521))

  (LOAD_BALANCE = yes)

  (FAILOVER = ON)

   (CONNECT_DATA =

    (SERVER= DEDICATED)

     (SERVICE_NAME = racdb)

     (FAILOVER_MODE =

       (TYPE= SELECT)

       (METHOD= BASIC)

       (RETRIES = 30)

       (DELAY = 5))))

11g的scan-ip如果也想進一步擴充套件failover,也需要設定failover_mode和對應的type.

當然有一個不同之處是在10g中我們可以直接透過dbca來完成配置,就是簡單清晰。
在11g中,只能藉助於命令或者EM來實現了。不知道為什麼把這塊功能的圖形介面部分給去掉了。
透過命令其實也不算麻煩,我們可以使用下面的方式做一個簡單的配置。
比如我們選擇failover_mode為basic建立的taf為racdb_taf

srvctl add service -d RACDB -s racdb_taf -r "RACDB1,RACDB2" -P BASIC
bash-4.1$ crs_stat -t|grep taf
Name           Type           Target    State     Host       
------------------------------------------------------------  
ora....taf.svc ora....ce.type OFFLINE   OFFLINE     
我們手工開啟         
srvctl start service -d RACDB -s racdb_taf 
     

然後透過dbms_service來配置更多的屬性。
execute dbms_service.modify_service (service_name => 'racdb_taf', aq_ha_notifications => true, failover_method => dbms_service.failover_method_basic, failover_type => dbms_service.failover_type_select, failover_retries => 181,failover_delay => 5,clb_goal => dbms_service.clb_goal_long);

在資料庫中可以簡單檢視相關的service情況。
SQL> select service_id ,name from dba_services ;

SERVICE_ID NAME
---------- ----------------------------------------------------------------
  1 SYS$BACKGROUND
  2 SYS$USERS
  3 racdb_taf
  5 RACDBXDB
  6 RACDB
select name, failover_method, failover_type, failover_retries,goal, clb_goal,aq_ha_notifications  from dba_services where service_id =3;


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

相關文章