我們都知道oracle rac中每個節點都有一個虛拟ip,簡稱vip,與公網ip在同一個網段。
沒有vip時,oracle用戶端是靠“tcp/ip協定棧逾時”來判斷伺服器故障。而tcp/ip協定棧是作為os kernel的一部分來實作,不同的os有不同的閥值,使用者獲悉資料庫異常的時間完全取決于os kernel的實作,雖然有些os允許修改這個閥值,但是會對其它程式産生未知影響。是以,oracle rac引入了vip,進而避開對tcp協定棧逾時的依賴。
vip和ip最主要的不同之處在于:vip是浮動的,而ip是固定的。在所有節點都正常運作時,每個節點的vip會被配置設定到public nic上;在linux下ifconfig檢視,public網卡上是2個ip位址;如果一個節點當機,這個節點的vip會被轉移到還在運作的節點上。也就是幸存的節點的public nic這個網卡上,會有3個ip位址。
當一個節點當機,這個節點真實ip就連接配接不上了,但是這個節點的虛拟ip是可以連接配接的,他會自動把用戶端的連接配接請求轉接給存活的節點。
在tnsname.ora檔案裡,指定address清單,用戶端會随機選擇一個節點來連接配接資料庫,而不是順序選擇的。
vip特點:
1 vip是在clusterware安裝最後階段,通過腳本vipca建立的;
2 vip作為一個nodeapps類型的crs resource注冊到ocr中,并由crs維護狀态;
3 vip會綁定到節點的public 網卡上;那麼public網卡就有兩個位址了;
4 當某個節點發生故障時,crs會把故障節點的vip轉移到其他節點上;
5 每個節點的listener會同時在public網卡的public ip和vip兩個位址上監聽;
6 用戶端的tnsname.ora一般會配置指向節點的vip;
從上面第6條可以引出一個問題。如果增加一個節點,那麼用戶端的tnsname.ora需要加入新增節點的vip。那麼想象一下:多個用戶端,增加多個節點,那麼維護起來特别麻煩。是以到了oracle11gr2,引入了一個scan的概念。
scan,single client access name。簡單用戶端連接配接名,這是一個唯一的名稱,在整個公司網絡内部唯一,并且在dns中可以解析為三個ip位址,用戶端連接配接的時候隻需要知道這個名稱,并連接配接即可, 每個scan vip對應一個scan listener,cluster内部的service在每個scan listener上都有注冊,scan listener接受用戶端的請求,并foward到不同的local listener中去,還是由local 的listener提供服務給用戶端。
注意:scan不一定要resolve到三個ip,一個也夠了。隻不過為了防止scan單點故障而推薦3個。