Oracle 11g R2 RAC高可用連接特性 – SCAN詳解
SCAN 概念先介紹一下什么叫SCAN ,SCAN(Single Client Access Name)是Oracle 從11g R2開始推出的,客戶端可以通過SCAN 特性負(fù)載均衡地連接到RAC 數(shù)
SCAN 概念
先介紹一下什么叫SCAN ,SCAN(Single Client Access Name)是Oracle 從11g R2開始推出的,客戶端可以通過SCAN 特性負(fù)載均衡地連接到RAC 數(shù)據(jù)庫(kù)。SCAN 提供一個(gè)域名來訪問RAC ,域名可以解析1個(gè)到3個(gè)(注意,最多3個(gè))SCAN IP,我們可以通過DNS 或者GNS 來解析實(shí)現(xiàn)。其中DNS 大家都很熟悉,這里不多說。GNS(Grid Naming Service)則是Oracle 11g R2的新功能,可以通過DHCP 服務(wù)為節(jié)點(diǎn)和SCAN 分配VIP 和SCAN IP。另外還有個(gè)優(yōu)點(diǎn)是,對(duì)于新加入集群的節(jié)點(diǎn),它會(huì)自動(dòng)分配VIP 地址,更新集群資源,客戶端依然通過SCAN 特性負(fù)載均衡地連接到新增集群節(jié)點(diǎn)上。DNS 和GNS 配置與解析相關(guān)內(nèi)容在下面還有說明。
除了DNS 和GNS 解析方法外,SCAN 也可以使用hosts 文件來解析,但用過的人都知道,此方法不僅在安裝RAC 的時(shí)候產(chǎn)生問題,后期使用也是存在問題的,比如SCAN 域名只能定義一個(gè)SCAN IP。所以這種方法也是Oracle 不推薦使用的。但盡管如此,我見過很多生產(chǎn)上依然這樣使用,也就是廢棄了11g 的新特性SCAN ,而是依然采用VIP 連接方式。
備注:有人可能會(huì)注意到《此方法不僅在安裝RAC 的時(shí)候產(chǎn)生問題》這句,RAC 安裝的時(shí)候的確會(huì)報(bào)錯(cuò),但這并不影響后期Oracle 的使用。
SCAN 最明顯的優(yōu)點(diǎn)就是,當(dāng)集群中新增加了節(jié)點(diǎn)或者刪除了節(jié)點(diǎn),不需要額外維護(hù)客戶端。
PUBLIC IP, PRIVATE IP, VIP, SCAN VIP, GNS VIP, LOCAL_LISTENER, REMOTE_LISTENER , LOCAL LISTENER, SCAN LISTENER
在RAC 部署的時(shí)候,我們都會(huì)接觸到PUBLIC IP、PRIVATE I、VIP 等等,那下面就針對(duì)它們進(jìn)行介紹。 PUBLIC IP : 這是我們網(wǎng)卡上配置的真實(shí)IP 地址,我們稱為公共IP ,這個(gè)IP 的存在關(guān)系到下面介紹的VIP 能不能正確漂在其所在網(wǎng)卡上。注意,PUBLIC IP是不提供給客戶端去連接配置的,這并不是說通過PUBLIC IP 無(wú)法連接實(shí)例,而是它會(huì)存在節(jié)點(diǎn)服務(wù)器宕機(jī)的時(shí)候所有向它請(qǐng)求的客戶端都會(huì)有等待現(xiàn)象并且最后得到超時(shí)信息的缺點(diǎn)。
PRIVATE IP : 稱為私網(wǎng)IP (私有IP ),它是用于心跳同步的,也就是保證兩臺(tái)服務(wù)器數(shù)據(jù)同步。說道私網(wǎng)IP ,我簡(jiǎn)單說下Oracle 另一個(gè)高可用性連接特性 – HAIP 。其實(shí)Cache Fusion會(huì)消耗節(jié)點(diǎn)服務(wù)器很大的私網(wǎng)資源,另外,私網(wǎng)間無(wú)法通信還會(huì)引起brain split(腦裂) ,以前為解決這種問題,我們可以采用網(wǎng)卡bonding 技術(shù),而Oracle 在11g R2的時(shí)候HAIP 技術(shù)來實(shí)現(xiàn),HAIP(Highly Available Virtual IP)用于節(jié)點(diǎn)間的私網(wǎng)通信,支持同時(shí)使用多個(gè)網(wǎng)絡(luò)連接來滿足網(wǎng)卡間的負(fù)載均衡,并且還提高了Cache Fusion資源通信能力。HAIP 技術(shù)并不是主要內(nèi)容,所以在這里點(diǎn)到為止。
VIP : RAC 的每個(gè)節(jié)點(diǎn)都需要有一個(gè)虛擬IP ,這就是VIP 。VIP 需要和PUBLIC IP同一個(gè)子網(wǎng),它們是由GI 的Clusterware 來管理的。VIP 在其節(jié)點(diǎn)服務(wù)器發(fā)生故障的時(shí)候會(huì)自動(dòng)漂移到另外正常的節(jié)點(diǎn)服務(wù)器上,如果RAC 是多個(gè)節(jié)點(diǎn)運(yùn)行的,那具體漂移到哪個(gè)活動(dòng)的節(jié)點(diǎn)將由Clusterware 決定。VIP 發(fā)生漂移現(xiàn)象之后,其當(dāng)前的節(jié)點(diǎn)服務(wù)器LOCAL LISTENER是不會(huì)監(jiān)聽它的請(qǐng)求的,所以有客戶端向這個(gè)VIP 發(fā)送請(qǐng)求時(shí),Clusterware 的FAN 會(huì)通知客戶端向別的VIP 發(fā)送請(qǐng)求,客戶端收到通知后通過Failover 機(jī)制把請(qǐng)求重
,新發(fā)送到ADDRESS 列表中的其他VIP 上。雖然有這種較復(fù)雜的過程,但始終對(duì)客戶端是透明進(jìn)行的,而且這個(gè)過程完成時(shí)間非常短暫,客戶端也就幾乎感受不到有節(jié)點(diǎn)宕機(jī)。等故障節(jié)點(diǎn)恢復(fù)正常,漂移的VIP 也回到此節(jié)點(diǎn)上,繼續(xù)提供服務(wù)。
SCAN VIP : SCAN VIP就是我在剛開始常說的SCAN IP,也就是由DNS 或者GNS 、hosts 解析出來的IP 地址。上面也說過,SCAN VIP最多能有三個(gè),它們循環(huán)地被客戶端所請(qǐng)求到。這里大家可能會(huì)存在這樣的問題,SCAN VIP只有三個(gè),那RAC 是四節(jié)點(diǎn)或更多的節(jié)點(diǎn)情況怎么辦?存在這種問題的原因歸咎于對(duì)SCAN VIP的了解不足。其實(shí),SCAN VIP數(shù)量和節(jié)點(diǎn)數(shù)是沒有任何關(guān)系的,SCAN VIP會(huì)落到哪個(gè)節(jié)點(diǎn)上都是隨機(jī)的。
GNS VIP : GNS VIP同SCAN VIP,也是Oracle 從11g R2開始提供的。GNS VIP是提供GNS 服務(wù)的IP 地址,它綁定到某個(gè)節(jié)點(diǎn)的PUBLIC IP所在網(wǎng)卡上,當(dāng)節(jié)點(diǎn)出現(xiàn)故障,GNS 資源會(huì)自動(dòng)切換到其他正常的節(jié)點(diǎn)繼續(xù)提供GNS 解析服務(wù)。如果我們不使用GNS 解析方法,那么也不會(huì)存在GNS VIP。
LOCAL LISTENER : 本地監(jiān)聽器,RAC 的每個(gè)節(jié)點(diǎn)上都會(huì)有獨(dú)立的本地監(jiān)聽器,它會(huì)監(jiān)聽該節(jié)點(diǎn)的PUBLIC IP 和VIP ,而每個(gè)節(jié)點(diǎn)的實(shí)例在啟動(dòng)的時(shí)候也向本地監(jiān)聽器進(jìn)行注冊(cè),當(dāng)然它也會(huì)向SCAN 監(jiān)聽器注冊(cè),當(dāng)VIP 或者PUBLIC IP(這種情況比較少見) 有連接請(qǐng)求的時(shí)候,本地監(jiān)聽器就接受處理并和本地實(shí)例建立連接。如果某個(gè)節(jié)點(diǎn)故障,其上面的VIP 會(huì)進(jìn)行漂移,但本地監(jiān)聽器并不會(huì)產(chǎn)生漂移。
SCAN LISTENER : SCAN 監(jiān)聽器,它是實(shí)現(xiàn)SCAN 負(fù)載均衡的原理所在。如果RAC 上有三個(gè)SCAN VIP,那么SCAN 監(jiān)聽器也有三個(gè),它們各自監(jiān)聽SCAN VIP的連接請(qǐng)求。SCAN 監(jiān)聽器跟著SCAN VIP隨機(jī)分配到節(jié)點(diǎn)服務(wù)器上,如果某個(gè)節(jié)點(diǎn)發(fā)生故障,運(yùn)行在此節(jié)點(diǎn)上的SCAN VIP會(huì)進(jìn)行漂移,這時(shí)候SCAN 監(jiān)聽器也跟著漂移到正常的節(jié)點(diǎn)上,繼續(xù)為SCAN VIP監(jiān)聽連接請(qǐng)求,當(dāng)PMON 進(jìn)程下次動(dòng)態(tài)更新實(shí)例信息到該SCAN 監(jiān)聽器之后,它又重新接受客戶端的連接。這和VIP 產(chǎn)生漂移的時(shí)候是有所區(qū)別的。
LOCAL_LISTENER : 這是Oracle 的參數(shù),這個(gè)參數(shù)控制著本地監(jiān)聽器的注冊(cè),因?yàn)楸镜乇O(jiān)聽器的工作機(jī)制關(guān)系,通過本地監(jiān)聽器的數(shù)據(jù)庫(kù)連接請(qǐng)求只會(huì)連接到本地節(jié)點(diǎn)的實(shí)例上。
REMOTE_LISTENER : 同LOCAL_LISTENER是Oracle 的參數(shù),通過這個(gè)設(shè)置,任何實(shí)例都會(huì)向SCAN 監(jiān)聽器注冊(cè),所以SCAN 監(jiān)聽器能夠負(fù)載均衡地分發(fā)連接請(qǐng)求到節(jié)點(diǎn)本地監(jiān)聽器上,也就是連接到其本地節(jié)點(diǎn)上實(shí)例上。
關(guān)于LOCAL_LISTENER與REMOTE_LISTENER的配置,在下面講動(dòng)態(tài)注冊(cè)的時(shí)候再看一下。
SCAN 解析與配置
SCAN 是在安裝GI(Grid Infrastructure)時(shí)配置的,作為Clusterware 資源被管理。
忽略hosts 解析之后,有兩種方式配置和解析SCAN: DNS和GNS(Grid Naming Service)。
這里重點(diǎn)說一下DNS 解析SCAN 方式
使用DNS 解析SCAN 的時(shí)候,DNS 服務(wù)器會(huì)采用rr(round-robin)的方式循環(huán)解析為它準(zhǔn)備的3個(gè)IP 地
,址,與Oracle 11g R2的客戶端配合使不同的客戶端能夠連接到不同的SCAN Listener上,這相當(dāng)于是Oracle 10g中配置的客戶端負(fù)載均衡(通過LOAD_BALANCE=yes配置)。
下面看一下客戶端通過SCAN 連接到數(shù)據(jù)庫(kù)的過程,首先由DNS 服務(wù)器解析SCAN 名稱,DNS 服務(wù)器返回SCAN 對(duì)應(yīng)的3個(gè)IP 地址的列表,客戶端會(huì)選擇使用其中一個(gè)SCAN VIP地址作為連接地址,將命名方法解析后的連接信息發(fā)送到SCAN VIP對(duì)應(yīng)的SCAN Listener上,SCAN Listener通過負(fù)載均衡機(jī)制再把請(qǐng)求轉(zhuǎn)發(fā)給比較空閑的服務(wù)器上的本地監(jiān)聽器,由本地監(jiān)聽器完成實(shí)例與客戶端之間的連接。
使用SCAN 連接數(shù)據(jù)庫(kù)實(shí)例,整個(gè)過程實(shí)現(xiàn)了客戶端的Failover(Oracle 10g R2是通過FAILOVER=on來配置) ,DNS 服務(wù)器返回的是一個(gè)SCAN VIP列表,客戶端會(huì)選擇其中一個(gè)連接到RAC ,如果這個(gè)IP 地址不能正常訪問,客戶端會(huì)選擇另一個(gè)IP 地址繼續(xù)連接,直到所有的地址都不能正常連接,才返回錯(cuò)誤給客戶端,整個(gè)過程對(duì)客戶端程序來說依然是透明的。
需要注意的是,使用SCAN 連接到數(shù)據(jù)庫(kù),不再需要客戶端能解析節(jié)點(diǎn)的PUBLIC IP和VIP ,只需要客戶端能夠通過DNS 服務(wù)器正常解析SCAN 就可以了。負(fù)載均衡工作交給服務(wù)器端的SCAN 實(shí)現(xiàn)。
至于GNS 解析SCAN ,因?yàn)槟壳癎NS 服務(wù)存在不穩(wěn)定的情況,也很少有企業(yè)將其投入到生產(chǎn)環(huán)境使用,而且其工作原理也較為復(fù)雜,所以在這里并不深入說明。
實(shí)例的動(dòng)態(tài)注冊(cè)
上面已經(jīng)介紹了LOCAL_LISTENER和REMOTE_LISTENER兩個(gè)和動(dòng)態(tài)注冊(cè)有關(guān)的參數(shù),那我們看看它們?cè)跀?shù)據(jù)庫(kù)中的表現(xiàn)形式:
本地監(jiān)聽器注冊(cè)是由實(shí)例的LOCAL_LISTENER參數(shù)所控制的:
SQL> set line 150
SQL> show parameter local_listener
NAME TYPE VALUE
———————————— ———————- ——————————
local_listener string (DESCRIPTION=(ADDRESS_LIST=(AD
DRESS=(PROTOCOL=TCP)(HOST=192.
168.0.194)(PORT=1521))))
– 這是我管理的一套R(shí)AC 上的配置,當(dāng)然我已經(jīng)處理好IP 地址了。
LOCAL_LISTENER設(shè)置為向本地VIP 地址進(jìn)行注冊(cè),由于本地監(jiān)聽器是在本地的PUBLIC IP和VIP 上監(jiān)聽,所以向VIP 監(jiān)聽注冊(cè)就能保證成功向本地監(jiān)聽器注冊(cè)。
查看本地監(jiān)聽器的狀態(tài):
[grid@pos2 ~]$ lsnrctl status listener
LSNRCTL for Linux: Version 11.2.0.3.0 – Production on 23-OCT-2012 12:01:21
,Copyright (c) 1991, 2011, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER)))
STATUS of the LISTENER
————————
Alias LISTENER
Version TNSLSNR for Linux: Version 11.2.0.3.0 – Production
Start Date 19-JUL-2012 15:31:45
Uptime 95 days 20 hr. 29 min. 35 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /u01/app/11.2.0/grid/network/admin/listener.ora
Listener Log File /u01/app/grid/diag/tnslsnr/pos2/listener/alert/log.xml
Listening Endpoints Summary…
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=LISTENER)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.0.192)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.0.194)(PORT=1521)))
Services Summary…
Service " ASM" has 1 instance(s).
Instance " ASM2", status READY, has 1 handler(s) for this service…
Service "pos" has 1 instance(s).
Instance "pos2", status READY, has 1 handler(s) for this service…
Service "posXDB" has 1 instance(s).
Instance "pos2", status READY, has 1 handler(s) for this service…
The command completed successfully
– 這里注意:查看本地監(jiān)聽器信息的時(shí)候每個(gè)節(jié)點(diǎn)只能看到其上運(yùn)行的實(shí)例。
SCAN 監(jiān)聽器的注冊(cè)是由REMOTE_LISTENER參數(shù)控制的,任何實(shí)例都會(huì)向所有的SCAN 監(jiān)聽器注冊(cè): SQL> show parameter remote_listener
NAME TYPE VALUE
———————————— ———————- ——————————
remote_listener string pos-cluster-scan:1521
下面是LISTENER_SCAN1的一個(gè)狀態(tài)信息,當(dāng)然你也可以查看LISTENER_SCAN2和LISTENER_SCAN3的狀態(tài)。
[grid@pos2 ~]$ lsnrctl status listener_scan1
,LSNRCTL for Linux: Version 11.2.0.3.0 – Production on 23-OCT-2012 12:06:56
Copyright (c) 1991, 2011, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER_SCAN1))) STATUS of the LISTENER
————————
Alias LISTENER_SCAN1
Version TNSLSNR for Linux: Version 11.2.0.3.0 – Production
Start Date 19-JUL-2012 15:31:45
Uptime 95 days 20 hr. 35 min. 10 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /u01/app/11.2.0/grid/network/admin/listener.ora
Listener Log File /u01/app/11.2.0/grid/log/diag/tnslsnr/pos2/listener_scan1/alert/log.xml Listening Endpoints Summary…
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=LISTENER_SCAN1)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.0.195)(PORT=1521)))
Services Summary…
Service "pos" has 2 instance(s).
Instance "pos1", status READY, has 1 handler(s) for this service…
Instance "pos2", status READY, has 1 handler(s) for this service…
Service "posXDB" has 2 instance(s).
Instance "pos1", status READY, has 1 handler(s) for this service…
Instance "pos2", status READY, has 1 handler(s) for this service…
The command completed successfully
由于任何實(shí)例啟動(dòng)都會(huì)向所有的SCAN 監(jiān)聽器動(dòng)態(tài)注冊(cè),從LISTENER_SCAN1的SCAN 監(jiān)聽器運(yùn)行狀態(tài)來看,SERVICE pos包括了所有的實(shí)例名稱。
就像我昨天回答那位朋友的時(shí)候簡(jiǎn)單說“是通過內(nèi)部機(jī)制”一樣,大家可能看到上面的內(nèi)容并不知道SCAN 監(jiān)聽器如何找到比較空閑的實(shí)例的。
其實(shí)SCAN 監(jiān)聽器是實(shí)時(shí)了解所有實(shí)例的運(yùn)行情況的,因此它能夠準(zhǔn)確地將連接重定向到空閑服務(wù)器的本地監(jiān)聽器上。
下面我們通過日志查看實(shí)例的動(dòng)態(tài)注冊(cè)與動(dòng)態(tài)更新
,注意,如果你的RAC 是通過hosts 解析了SCAN 域名的,那么系統(tǒng)里就找不到上面的SCAN 監(jiān)聽器日志的路徑。
實(shí)例的動(dòng)態(tài)注冊(cè)和動(dòng)態(tài)更新過程是由實(shí)例的PMON 進(jìn)程完成的,正是因?yàn)镾CAN 監(jiān)聽器能夠?qū)崟r(shí)了解實(shí)例的負(fù)載情況,所以SCAN 監(jiān)聽器能夠負(fù)載均衡地將連接請(qǐng)求轉(zhuǎn)發(fā)給合適實(shí)例的本地監(jiān)聽器來處理。
這里談到負(fù)載均衡,那么就說下負(fù)載均衡中的優(yōu)先級(jí)
共享服務(wù)器配置中:
,?
? ?
低負(fù)載節(jié)點(diǎn) 低負(fù)載實(shí)例 實(shí)例相關(guān)的低負(fù)載調(diào)度器
專用服務(wù)器配置中:
?
? 低負(fù)載節(jié)點(diǎn) 低負(fù)載實(shí)例
SCAN 兼容性配置
介紹SCAN 差不多了,這里還有個(gè)兼容性問題不能不說。
要完美實(shí)現(xiàn)SCAN 功能特性,其實(shí)對(duì)客戶端的要求也是存在的。下面看下不同版本和SCAN 之間的兼容性
注意:JDBC 是不支持TAF 的,所以通過JDBC 連接無(wú)法實(shí)現(xiàn)Failover ,那有沒有解決方法,我們可以使用應(yīng)用的連接池來實(shí)現(xiàn),也就是當(dāng)連接的時(shí)候發(fā)現(xiàn)某些連接有故障,那自動(dòng)切換到正常實(shí)例的連接。 最后我貼一下SCAN 配置信息的檢查方法和DNS 、GNS 方式SCAN 解析實(shí)例:
首先SCAN 配置信息的檢查。
,