vip原理以及使用

fei890910發表於2014-07-08
一、VIP 原理和特點
Oracle 的TAF 就是建立在VIP 技術之上的。 IP 和VIP 區別在與: IP 是利用TCP層超時, VIP 利用的是應用層的立即響應。VIP 它是浮動的IP. 當一個節點出現問題時會自動的轉到另一個節點上。
假設有一個2個節點的RAC,正常執行時每個節點上都有一個VIP。 VIP1 和VIP2. 當節點2發生故障,比如異常關係。 RAC 會做如下操作:
1). CRS 在檢測到rac2節點異常後,會觸發Clusterware 重構,最後把rac2節點剔除叢集,由節點1組成新的叢集。
2). RAC的Failover 機制會把節點2的VIP轉移到節點1上,這時節點1的PUBLIC 網路卡上就有3個IP 地址: VIP1,VIP2, PUBLIC IP1.
3). 使用者對VIP2的連線請求會被IP層路由轉到節點1
4). 因為在節點1上有VIP2的地址,所有資料包會順利透過路由層,網路層,傳輸層。
5). 但是,節點1上只監聽VIP1和public IP1的兩個IP地址。並沒有監聽VIP2,故應用層沒有對應的程式接收這個資料包,這個錯誤立即被捕獲。
6). 客戶段能夠立即接收到這個錯誤,然後客戶段會重新發起向VIP1的連線請求。
   VIP 特點:
     1). VIP 是透過VIPCA指令碼建立的
     2). VIP 作為Nodeapps型別的CRS Resource 註冊到OCR中,並由CRS 維護狀態。
     3). VIP 會繫結到節點的public 網路卡上,故public 網路卡有2個地址。
     4). 當某個節點發生故障時,CRS 會把故障節點的VIP 轉移到其他節點上。
5). 每個節點的Listener 會同時監聽public 網路卡上的 public ip 和VIP
6). 客戶端的tnsnames.Ora 一般會配置指向節點的VIP.
二、vip以及taf的使用
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 -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.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 -s -i instance-name -o start-option -c connect-string -q
如果不指定service-name, 則所有的service 都會被啟動,可以使用逗號分隔方式,同時啟動多個service。 -i 指定在那個例項上啟動service。
5) 停止service
#srvctl stop service -d -s -i instance-name -c connect-string -q -f
其中-f 選項可以強制關閉service,並中斷了其所有使用者的連線。
6) 檢視service 狀態
#srvctl status service -d -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                                                                                                                     LONG

注:資料來源於網路

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

相關文章