之前有網友在我Blog 留言說我的RAC 搭建中沒有寫SCAN 配置,這個之前應當是有寫過,但剛搜了1下,沒找到,正好重新整理1下,并做下實驗,實驗就用Oracle 12c 進行測試。
在Oracle 11g 之前,我們去連接RAC 集群,都是配置以下的內容:
dave_rac=
(DESCRIPTION =
(ADDRESS_LIST =
(LOAD_BALANCE = yes)
(FAILOVER=ON)
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.68)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.69)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = dave)
(failover_mode=(type=select)(method=basic))
)
)
這里的68和69 是VIP 的地址,是PUBLIC 網卡上的虛擬IP。 那我們這里只有2個節點,如果我們增加了RAC的集群數,那末就需要修改所有的客戶真個配置,這個就很麻煩。
所以在Oracle 11gR2 中,引入了SCAN(Single ClientAccess Name)的特性。SCAN是1個域名,可以解析最少1個IP,最多解析3個SCAN IP,客戶端可以通過這個SCAN 名字來訪問數據庫,另外SCAN ip必須與public ip和VIP在1個子網。
啟用SCAN 以后,會在數據庫與客戶端之間,添加了1層虛擬的服務層,就是SCAN IP和SCAN IP Listener,在客戶端僅需要配置SCAN IP的tns信息,通過SCANIP Listener,連接后臺集群數據庫。這樣,不論集群數據庫是不是有添加或刪除節點的操作,均不會對客戶端產生影響,也就不需要修改配置。
配置SCAN有3種方法:
1. 使用/etc/hosts文件
這個是我們目前用的最多的方式,但是缺點只能對應1個SCAN IP,該方法Oracle 不推薦,但是簡單,不需要單獨的DNS 服務器,使用該方法,客戶端還是需要VIP來鏈接。 Oracle 推薦使用其他的2種方法來實現SCAN 功能。
2. 在DNS中定義域名,只需要在DNS中配置便可實現SCAN 功能。
3. 通過Grid Naming Server(GNS),需要配置DNS 和DHCP才能實現SCAN 功能。
配置好以后,直接在客戶真個tnsnames里寫SCAN NAME就能夠了,以下:
RACSCAN =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = rac-scan.gns.cndba.com)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = dave)
)
)
以后RAC 增加刪除節點,客戶端都不需要修改。
在啟用SCAN 特性以后,除多幾個SCAN IP 以外,還會多幾個SCAN IP Listener,每一個SCAN IP對應1個SCAN IP Listener,為了性能斟酌,每一個SCAN IP和其對應的SCAN IP Listener將被獨立的分配到各個節點上。
如果Cluster中其中某個運行SCAN IP的節點出現異常,則其余正常的SCAN IP節點將自動接收。
如果客戶端是11g R2的版本,則客戶端只需在tns中配置域名解析,便可實現failover,如果客戶端版本低于11g R2,則沒法通過域名解析出多個SCAN IP地址,因此如果要實現failover,必須在客戶真個tns中配置3個SCAN IP的地址進行解析,這也是為什么Oracle強烈建議在使用11g R2數據庫時,客戶端也最好使用11g R2的緣由。
上圖是SCAN 的工作流程圖,圖的右側是1個4個節點的RAC 集群,所以有4個Local Listener。 配置了3個SCAN IP和3個 SCAN Listeners。這3個SCAN IP 是隨機的落在RAC節點上。
客戶端鏈接的時候,會隨機的連接到某1個某1個SCAN IP及起對應的SCAN IP Listner上, SCAN IP Listener接收到連接要求時,會根據 LBA 算法(least loaded instance),將該客戶真個連接要求,轉發給對應的Instance上的VIP Listener,從而完成了全部客戶端與服務器的連接進程。
簡單點就是:
client -> scan listener -> locallistener -> local instance
SCAN VIP,即SCAN IP,是由DNS或GNS、hosts解析出來的IP地址。目前SCANVIP最多能有3個,它們循環地被客戶端所要求到。
SCAN VIP數量和節點數沒有關系,正如上圖所示,4個節點,3個SCAN VIP,SCAN VIP是隨機的落在哪一個節點上的,這個進程也是動態變化的。
GNS VIP同SCAN VIP, GNS VIP是提供GNS服務的IP地址,它綁定到某個節點的PUBLIC IP所在網卡上,當節點出現故障,GNS資源會自動切換到其他正常的節點繼續提供GNS解析服務。如果我們不使用GNS解析方法,那末也不會存在GNS VIP。
SCAN監聽器,實現SCAN的負載均衡功能。如果RAC上有3個SCAN VIP,那末SCAN監聽器也有3個,它們各自監聽SCAN VIP的連接要求。
SCAN監聽器的注冊是由REMOTE_LISTENER參數控制的,任何實例都會向所有的SCAN監聽器注冊,所以SCAN LISTENER 會包括所有實例的名稱。
這樣SCAN監聽器可以實時了解所有實例的運行情況的,因此能夠準確地將連接重定向到空閑服務器的本地監聽器上。
SCAN監聽器是隨著SCAN VIP隨機分配到節點服務器上,如果某個節點產生故障,運行在此節點上的SCANVIP會進行漂移,這時候候SCAN監聽器也隨著漂移到正常的節點上,繼續為SCAN VIP監聽連接要求,當PMON進程下次動態更新實例信息到該SCAN監聽器以后,它又重新接受客戶真個連接。
Oracle 參數,設置該參數以后,任何實例都會向SCAN監聽器注冊,所以SCAN監聽器能夠負載均衡地分發連接要求到節點本地監聽器上。
由于SCAN IP有多個,他們對應的是同1個域名,因此在數據庫中,需要使用easyconnect naming method方式,需要修改sqlnet.ora的配置文件添加ezconnect,如:
NAMES.DIRECTORY_PATH=(tnsnames,ezconnect)。
設置格式:REMOTE_LISTENER=SCAN:PORT,如REMOTE_LISTENER=rac-scan.cndba.cn:1521。
配置以后,RAC數據庫的每一個節點的PMON進程,會用廣播的方式向每一個SCAN Listener進行注冊,同時CRS的后臺進程ONS,會收集各個節點的負載狀態,通知SCAN Listener,以便SCAN Listener根據負載情況,將新連接分配到當前負載最低的節點上。
管理理論部份,就這么多,接下來,會整理2篇Oracle 12c 環境下使用DNS和GNS 實現SCAN 的Blog,具體的了解下如何實現這類功能。
參考:
Grid Infrastructure Single ClientAccess Name (SCAN) Explained (文檔 ID 887522.1)
--------------------------------------------------------------------------------------------
版權所有,文章制止轉載,否則追究法律責任!
AboutDave:
--------------------------------------------------------------------------------------------
QQ: 251097186
Email: tianlesoftware@gmail.com
Blog: http://blog.csdn.net/tianlesoftware
Weibo: http://weibo.com/tianlesoftware
Twitter: http://twitter.com/tianlesoftware
Facebook: http://www.facebook.com/tianlesoftware
Linkedin: http://cn.linkedin.com/in/tianlesoftware
Dave 的QQ群:
--------------------------------------------------------------------------------------------
注意:加群必須注明表空間和數據文件關系 | 不要重復加群
CNDBA_1: 62697850 (空) CNDBA_2: 62697716 (滿) CNDBA_3: 283816689
CNDBA_4: 391125754 CNDBA_5: 104207940 CNDBA_6: 62697977 CNDBA_7: 142216823(滿)