Oracle 11g R2 RAC 高可用连接特性
轉(zhuǎn)自-阿里巴巴許春值
1、scan概念
什么叫 SCAN,SCAN (Single Client Access Name) 是 Oracle 從11g R2 開始推出的,客戶端可以通過 SCAN 特性負載均衡地連接到 RAC 數(shù)據(jù)庫。SCAN 提供一個域名來訪問 RAC,域名可以解析 1個 到 3個 SCAN IP,我們可以通過 DNS 或者 GNS 來解析實現(xiàn)。其中 DNS 大家都很熟悉,這里不多說。GNS (Grid Naming Service) 則是 Oracle 11g R2 的新功能,可以通過 DHCP 服務為節(jié)點和 SCAN 分配 VIP 和 SCAN IP。另外還有個優(yōu)點是,對于新加入集群的節(jié)點,它會自動分配 VIP 地址,更新集群資源,客戶端依然通過 SCAN 特性負載均衡地連接到新增集群節(jié)點上。
除了 DNS 和 GNS 解析方法外,SCAN 也可以使用 hosts 文件來解析,但用過的人都知道,此方法不僅在安裝 RAC 的時候產(chǎn)生問題(RAC 安裝的時候的確會報錯),后期使用也是存在問題的,比如 SCAN 域名只能定義一個 SCAN IP。所以這種方法也是 Oracle 不推薦使用的。但盡管如此,我見過很多生產(chǎn)上依然這樣使用,也就是廢棄了11g 的新特性 SCAN,而是依然采用 VIP 連接方式。
SCAN 最明顯的優(yōu)點就是,當集群中新增加了節(jié)點或者刪除了節(jié)點,不需要額外維護客戶端。
2、RAC中網(wǎng)絡ip概念
在 RAC 部署的時候,我們都會接觸到很多關于地址的概念,以下簡要介紹一下。
PUBLIC IP : 這是我們網(wǎng)卡上配置的真實 IP 地址,我們稱為公共 IP,這個 IP 的存在關系到下面介紹的 VIP 能不能正確漂在其所在網(wǎng)卡上。注意,Public IP 是不提供給客戶端去連接配置的,這并不是說通過 PUBLIC IP 無法連接實例,而是它會存在節(jié)點服務器宕機的時候所有向它請求的客戶端都會有等待現(xiàn)象并且最后得到超時信息的缺點。
PRIVATE IP : 稱為私網(wǎng) IP(私有 IP),它是用于心跳同步的,也就是保證兩臺服務器數(shù)據(jù)同步。說到私網(wǎng) IP,我簡單說下 Oracle 另一個高可用性連接特性 – HAIP。其實 Cache Fusion 會消耗節(jié)點服務器很大的私網(wǎng)資源,另外,私網(wǎng)間無法通信還會引起 Brain Split(腦裂),以前為解決這種問題,可以采用網(wǎng)卡 bonding 技術,而 Oracle 在 11g R2 的時候 HAIP 技術來實現(xiàn),HAIP - Highly Available Virtual IP 用于節(jié)點間的私網(wǎng)通信,支持同時使用多個網(wǎng)絡連接來滿足網(wǎng)卡間的負載均衡,并且還提高了 Cache Fusion 資源通信能力。
VIP : RAC 的每個節(jié)點都需要有一個虛擬 IP,這就是 VIP。VIP 需要和 PUBLIC IP 同一個子網(wǎng),它們是由 GI 的 Clusterware 來管理的。VIP 在其節(jié)點服務器發(fā)生故障的時候會自動漂移到另外正常的節(jié)點服務器上,如果 RAC 是多個節(jié)點運行的,那具體漂移到哪個活動的節(jié)點將由 Clusterware 決定。VIP 發(fā)生漂移現(xiàn)象之后,其當前的節(jié)點服務器 LOCAL LISTENER 是不會監(jiān)聽它的請求的,所以有客戶端向這個 VIP 發(fā)送請求時,Clusterware 的 FAN 會通知客戶端向別的 VIP 發(fā)送請求,客戶端收到通知后通過 Failover 機制把請求重新發(fā)送到 ADDRESS 列表中的其他 VIP 上。雖然有這種較復雜的過程,但始終對客戶端是透明進行的,而且這個過程完成時間非常短暫,客戶端也就幾乎感受不到有節(jié)點宕機。等故障節(jié)點恢復正常,漂移的 VIP 也回到此節(jié)點上,繼續(xù)提供服務。
SCAN VIP : SCAN VIP 就是我在剛開始常說的 SCAN IP,也就是由 DNS 或者 GNS、hosts 解析出來的 IP 地址。上面也說過,SCAN VIP 最多能有三個,它們循環(huán)地被客戶端所請求到。這里大家可能會存在這樣的問題,SCAN VIP 只有三個,那 RAC 是四節(jié)點或更多的節(jié)點情況怎么辦?存在這種問題的原因歸咎于對 SCAN VIP 的了解不足。其實,SCAN VIP 數(shù)量和節(jié)點數(shù)是沒有任何關系的,SCAN VIP 會落到哪個節(jié)點上都是隨機的。
GNS VIP : GNS VIP 同 SCAN VIP,也是 Oracle 從 11g R2 開始提供的。GNS VIP 是提供 GNS 服務的 IP 地址,它綁定到某個節(jié)點的 PUBLIC IP 所在網(wǎng)卡上,當節(jié)點出現(xiàn)故障,GNS 資源會自動切換到其他正常的節(jié)點繼續(xù)提供 GNS 解析服務。如果我們不使用 GNS 解析方法,那么也不會存在 GNS VIP。
LOCAL LISTENER : 本地監(jiān)聽器,RAC 的每個節(jié)點上都會有獨立的本地監(jiān)聽器,它會監(jiān)聽該節(jié)點的 Public IP 和 VIP,而每個節(jié)點的實例在啟動的時候也向本地監(jiān)聽器進行注冊,當然它也會向 SCAN 監(jiān)聽器注冊,當 VIP 或者 PUBLIC IP(這種情況比較少見)有連接請求的時候,本地監(jiān)聽器就接受處理并和本地實例建立連接。如果某個節(jié)點故障,其上面的 VIP 會進行漂移,但本地監(jiān)聽器并不會產(chǎn)生漂移。
SCAN LISTENER : SCAN 監(jiān)聽器,它是實現(xiàn) SCAN 負載均衡的原理所在。如果 RAC 上有三個 SCAN VIP,那么 SCAN 監(jiān)聽器也有三個,它們各自監(jiān)聽 SCAN VIP 的連接請求。SCAN 監(jiān)聽器跟著 SCAN VIP 隨機分配到節(jié)點服務器上,如果某個節(jié)點發(fā)生故障,運行在此節(jié)點上的 SCAN VIP 會進行漂移,這時候 SCAN 監(jiān)聽器也跟著漂移到正常的節(jié)點上,繼續(xù)為 SCAN VIP 監(jiān)聽連接請求,當 PMON 進程下次動態(tài)更新實例信息到該 SCAN 監(jiān)聽器之后,它又重新接受客戶端的連接。這和 VIP 產(chǎn)生漂移的時候是有所區(qū)別的。
3、兩個參數(shù)
LOCAL_LISTENER : 這是 Oracle 的參數(shù),這個參數(shù)控制著本地監(jiān)聽器的注冊,因為本地監(jiān)聽器的工作機制關系,通過本地監(jiān)聽器的數(shù)據(jù)庫連接請求只會連接到本地節(jié)點的實例上。
REMOTE_LISTENER :? 同 LOCAL_LISTENER 是 Oracle 的參數(shù),通過這個設置,任何實例都會向 SCAN 監(jiān)聽器注冊,所以 SCAN 監(jiān)聽器能夠負載均衡地分發(fā)連接請求到節(jié)點本地監(jiān)聽器上,也就是連接到其本地節(jié)點上實例上。
4、scan解析與配置
SCAN 是在安裝 GI(Grid Infrastructure) 時配置的,作為 Clusterware 資源被管理。忽略 hosts 解析之后,有兩種方式配置和解析 SCAN: DNS 和 GNS(Grid Naming Service)。
這里重點說一下 DNS 解析 SCAN 方式
使用 DNS 解析 SCAN 的時候,DNS 服務器會采用 rr(round-robin) 的方式循環(huán)解析為它準備的3個 IP 地址,與 Oracle 11g R2 的客戶端配合使不同的客戶端能夠連接到不同的 SCAN Listener 上,這相當于是 Oracle 10g 中配置的客戶端負載均衡(通過 LOAD_BALANCE=yes 配置)。
下面看一下客戶端通過 SCAN 連接到數(shù)據(jù)庫的過程,首先由 DNS 服務器解析 SCAN 名稱,DNS 服務器返回 SCAN 對應的3個 IP 地址的列表,客戶端會選擇使用其中一個 SCAN VIP 地址作為連接地址,將命名方法解析后的連接信息發(fā)送到 SCAN VIP 對應的 SCAN Listener 上,SCAN Listener 通過負載均衡機制再把請求轉(zhuǎn)發(fā)給比較空閑的服務器上的本地監(jiān)聽器,由本地監(jiān)聽器完成實例與客戶端之間的連接。
使用 SCAN 連接數(shù)據(jù)庫實例,整個過程實現(xiàn)了客戶端的 Failover(Oracle 10g R2 是通過 FAILOVER=on 來配置),DNS 服務器返回的是一個 SCAN VIP 列表,客戶端會選擇其中一個連接到 RAC,如果這個 IP 地址不能正常訪問,客戶端會選擇另一個 IP 地址繼續(xù)連接,直到所有的地址都不能正常連接,才返回錯誤給客戶端,整個過程對客戶端程序來說依然是透明的。
需要注意的是,使用 SCAN 連接到數(shù)據(jù)庫,不再需要客戶端能解析節(jié)點的 PUBLIC IP 和 VIP,只需要客戶端能夠通過 DNS 服務器正常解析 SCAN 就可以了。負載均衡工作交給服務器端的 SCAN 實現(xiàn)。
至于 GNS 解析 SCAN,因為目前 GNS 服務存在不穩(wěn)定的情況,也很少有企業(yè)將其投入到生產(chǎn)環(huán)境使用,而且其工作原理也較為復雜,所以在這里并不深入說明。
5、實例的動態(tài)注冊
上面已經(jīng)介紹了 LOCAL_LISTENER 和 REMOTE_LISTENER 兩個和動態(tài)注冊有關的參數(shù),那我們看看它們在數(shù)據(jù)庫中的表現(xiàn)形式:
本地監(jiān)聽器注冊是由實例的 LOCAL_LISTENER 參數(shù)所控制的:
LOCAL_LISTENER 設置為向本地VIP地址進行注冊,由于本地監(jiān)聽器是在本地的 PUBLIC IP 和 VIP 上監(jiān)聽,所以向 VIP 監(jiān)聽注冊就能保證成功向本地監(jiān)聽器注冊。
查看本地監(jiān)聽器的狀態(tài):
--這里注意:查看本地監(jiān)聽器信息的時候每個節(jié)點只能看到其上運行的實例。
SCAN 監(jiān)聽器的注冊是由 REMOTE_LISTENER 參數(shù)控制的,任何實例都會向所有的 SCAN 監(jiān)聽器注冊:
SQL> show parameter remote_listener
NAME???????????????????????????????? TYPE?????????????????? VALUE
———————————— ———————- ——————————
remote_listener????????????????????? string???????????????? pos-cluster-scan:1521
下面是 LISTENER_SCAN1 的一個狀態(tài)信息,當然你也可以查看LISTENER_SCAN2和 LISTENER_SCAN3 的狀態(tài)。
由于任何實例啟動都會向所有的 SCAN 監(jiān)聽器動態(tài)注冊,從 LISTENER_SCAN1 的 SCAN 監(jiān)聽器運行狀態(tài)來看,SERVICE pos 包括了所有的實例名稱。 SCAN 監(jiān)聽器是實時了解所有實例的運行情況的,因此它能夠準確地將連接重定向到空閑服務器的本地監(jiān)聽器上。
下面我們通過日志查看實例的動態(tài)注冊與動態(tài)更新
1)本地監(jiān)聽器動態(tài)注冊日志:
[grid@pos2 ~]$ cd $ORACLE_BASE/diag/tnslsnr/pos2/listener/alert
[grid@pos2 alert]$ grep service_register log_1.xml | head -3
<txt>18-JUN-2012 13:58:23 * service_register * LsnrAgt * 0
<txt>18-JUN-2012 13:58:30 * service_register * +ASM2 * 0
<txt>18-JUN-2012 15:54:15 * service_register * pos2 * 0
-- 之所以選擇log_1.xml歷史文件是因為發(fā)現(xiàn)我的log.xml里基本都是更新日志,沒有注冊日志。
2)本地監(jiān)聽器動態(tài)更新日志:
[grid@pos2 alert]$ grep service_update log.xml | head -3
<txt>16-OCT-2012 16:07:09 * service_update * pos2 * 0
<txt>16-OCT-2012 16:07:33 * service_update * pos2 * 0
<txt>16-OCT-2012 16:08:03 * service_update * pos2 * 0
3)SCAN監(jiān)聽器動態(tài)注冊日志:
[grid@rac1 ~]$ cd $ORACLE_BASE/diag/tnslsnr/rac1/listener_scan2/alert/
[grid@rac1 ~]$ grep service_register log.xml | head -3
<txt>13-AUG-2012 05:25:00 * service_register * LsnrAgt * 0
<txt>13-AUG-2012 20:29:07 * service_register * luocs1 * 0
<txt>13-AUG-2012 20:58:05 * service_register * luocs1 * 0
-- 這是我另一套測試RAC環(huán)境。
4)SCAN監(jiān)聽器動態(tài)更新日志:
[grid@rac1 ~]$ grep service_update log.xml | head -3
<txt>13-AUG-2012 20:29:19 * service_update * luocs1 * 0
<txt>13-AUG-2012 20:30:19 * service_update * luocs1 * 0
<txt>13-AUG-2012 20:30:46 * service_update * luocs1 * 0
注意,如果你的 RAC 是通過 hosts 解析了 SCAN 域名的,那么系統(tǒng)里就找不到上面的 SCAN 監(jiān)聽器日志的路徑。
實例的動態(tài)注冊和動態(tài)更新過程是由實例的 PMON 進程完成的,正是因為 SCAN 監(jiān)聽器能夠?qū)崟r了解實例的負載情況,所以 SCAN 監(jiān)聽器能夠負載均衡地將連接請求轉(zhuǎn)發(fā)給合適實例的本地監(jiān)聽器來處理。
這里談到負載均衡,那么就說下負載均衡中的優(yōu)先級
共享服務器配置中:
· 低負載節(jié)點
· 低負載實例
· 實例相關的低負載調(diào)度器
專用服務器配置中:
· 低負載節(jié)點
· 低負載實例
6、scan兼容性配置
介紹 SCAN 差不多了,這里還有個兼容性問題不能不說。要完美實現(xiàn) SCAN 功能特性,其實對客戶端的要求也是存在的。下面看下不同版本和 SCAN 之間的兼容性。
| 編號 | 客戶端軟件版本 | 服務器端軟件版本 | SCAN 特性的使用 |
| 1 | 11g R2 | 11g R2 | 能夠充分使用 SCAN 的特性 |
| 2 | 早于11g R2 版本 | 11g R2 | 不能充分感受到 SCAN 特性 |
| 3 | 11g R2 | 早于11g R2 版本 | 在服務器端沒有 SCAN 的概念 |
| 4 | 早于11g R2 版本 | 早于11g R2 版本 | 在服務器端沒有 SCAN 的概念 |
這里稍微詳細說一下第2種情況,如果客戶端低于11g R2 的版本,在 DNS 解析的3個 VIP 地址中,可能只能固定地使用第一個 SCAN VIP 連接數(shù)據(jù)庫;如果該 SCAN VIP 對應的監(jiān)聽器出現(xiàn)故障,那么整個連接將會失敗,客戶端也會收到到錯誤信息。
那針對兼容性問題我們拿出各種客戶端配置方法
1)客戶端和服務器端軟件版本都是11g R2的時候Tnsnames.ora RACSCAN = ? (DESCRIPTION = ??? (ADDRESS = (PROTOCOL = TCP)(HOST = luocs-cluster-scan.grid.luocs.com)(PORT = 1521)) ??? (CONNECT_DATA = ????? (SERVER = DEDICATED) ???????????? (SERVICE_NAME = luocs10g) ??? ) ? )
2)客戶端是早于11g R2的版本,服務器端是11g R2的時候
RACSCAN = ? (DESCRIPTION = ??? (ADDRESS_LIST = ????? (LOAD_BALANCE=on) ????? (FAILOVER=on) ????? (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.193)(PORT = 1521)) ????? (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.194)(PORT = 1521)) ????? (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.195)(PORT = 1521)) ??? ) ??? (CONNECT_DATA = ????? (SERVICE_NAME = luocs10g) ??? ) ? )
為了確保在早于11g R版本的客戶端負載均衡和失敗切換,我們需要在tnsnames.ora中添加3個SCAN VIP。
3)傳統(tǒng)的RAC客戶端配置方法
先從客戶端正常地解析服務器所有節(jié)點的主機名稱和相應的VIP名稱,
最好和服務端/etc/hosts一致。當然,我們不解析名稱的情況下還可以使用VIP地址,比如:
LUOCSRAC = ? (DESCRIPTION = ??? (ADDRESS_LIST = ????? (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.193)(PORT = 1521)) ????? (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.194)(PORT = 1521)) ????? (LOAD_BALANCE = yes) ????? (FAILOVER = on) ??? ) ??? (CONNECT_DATA = ????? (SERVER = DEDICATED) ????? (SERVICE_NAME = luocs) ??? ) ? )
本地客戶端hosts解析之后,使用名稱:
LUOCSRAC = ? (DESCRIPTION = ??? (ADDRESS_LIST = ????? (ADDRESS = (PROTOCOL = TCP)(HOST = rac1-vip.luocs.com)(PORT = 1521)) ????? (ADDRESS = (PROTOCOL = TCP)(HOST = rac2-vip.luocs.com)(PORT = 1521)) ????? (LOAD_BALANCE = yes) ????? (FAILOVER = on) ??? ) ??? (CONNECT_DATA = ????? (SERVER = DEDICATED) ????? (SERVICE_NAME = luocs) ??? ) ? )
注意:傳統(tǒng)的客戶端配置方法其實還有多種,這個在這里不細說。
4)JDBC字符串配置
早期版本:
jdbc:oracle:thin:@(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = rac1-vip.luocs.com)(PORT = 1521))(ADDRESS = (PROTOCOL = TCP)(HOST = rac2-vip.luocs.com)(PORT = 1521))(LOAD_BALANCE = yes)(FAILOVER = on))(CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = luocs)))
11g R2:
jdbc:oracle:thin@luocs-cluster-scan:1521/luocs
注意:JDBC 是不支持 TAF 的,所以通過 JDBC 連接無法實現(xiàn) Failover,那有沒有解決方法,我們可以使用應用的連接池來實現(xiàn),也就是當連接的時候發(fā)現(xiàn)某些連接有故障,那自動切換到正常實例的連接。
最后我貼一下 SCAN 配置信息的檢查方法和 DNS、GNS 方式 SCAN 解析實例。
首先 SCAN 配置信息的檢查:
DNS 方式配置 SCAN:
然后我們在安裝 GI 的時候使用 scan.luocs.com 即可,當然要不選擇 Configure GNS。
GNS方式配置SCAN:
然后我們在安裝GI的時候使用SCAN Name填寫:rac-cluster-scan.gns-server.rac.com,選擇Configure GNS,GNS Sub Domain填寫gns-server.rac.com,GNS VIP Address填寫192.168.77.95。其中SCAN Name的填寫有講究的,就是再不包含域名的情況下前面的字符不能超過15個,另外192.168.77.95就是GNS VIP。
總結
以上是生活随笔為你收集整理的Oracle 11g R2 RAC 高可用连接特性的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Docker 从Docker Hub 拉
- 下一篇: iOS原生布局简介