11g叢集新特性-scan機制

muxinqing發表於2014-03-09
11g叢集新特性-scan機制




關於11g叢集跟10g有過一定的變化,雖然主要的叢集件原理相同,不過關於叢集的安裝由原來的clusterware叢集見改為GI,而asm則被封裝到GI中,不像10g時asm是被封裝到oracle database軟體中,關於叢集的管理也有些變化,例如叢集命令更加多了,用grid使用者來管理叢集和asm,而oracle使用者就只需要管理oracle database,asm上的工具變化也較多,出現了卷形式的asm檔案系統acfs,ohasd程式來管理原來的ocssd,crsd,evmd程式等,總之11g的叢集確實有一些新的特性和變化,來新公司工作一個多月了,算是基本穩定了,下半年需要花點時間研究o的東西了。
 
這裡小魚主要學習下11g GI中比較顯著的特點scan ip,scan(Single Client Access Name)的思想主要是在客戶端和伺服器端新增一個虛擬的服務層,就是所謂的scan ip以及scan ip listener,在客戶端僅僅只需要配置scan ip的tns資訊,然後用資料庫叢集的scan ip listener連線到資料庫叢集,scan ip listener轉發連線請求到local listener上。
 
簡單來講就是以前在10g環境下透過vip連線到叢集的各個節點,現在中間又多了一層scan ip listener,scan ip listener會先接收客戶端的scan ip請求,然後轉發到各個本地的local listener,無疑如果叢集環境做出變更,例如增加刪除節點都不會對scan ip和scan ip listener有影響,此時無需去更改客戶端的配置。
 
需要注意的是scan按照o的建議需要三個scan ip和三個scan ip listener來實現scan特性的負載均衡和故障切換,當然那種情況我們需要dns服務或者Grid Naming Server(GNS)實現,這裡由於小魚只分配一個scan ip,也就沒有配置dns或者gns來顯示scan ip的負載均衡和故障切換了,這個並不影響scan的原理。
 
[oracle@rac101 admin]$ cat /etc/hosts
 192.168.56.165 rac101
 192.168.56.166 rac102
 
10.10.0.11 rac101-priv
 10.10.0.12 rac102-priv
 
192.168.56.11 rac101-vip
 192.168.56.12 rac102-vip
 
192.168.56.215 racscan
 
這個測試庫的scan ip和scan ip listener是載入到rac101節點上的。
 [root@rac101 ~]# crsctl stat res -t
 --------------------------------------------------------------------------------
 NAME TARGET STATE SERVER STATE_DETAILS
 --------------------------------------------------------------------------------
 Local Resources
 --------------------------------------------------------------------------------
 ora.ACFS.dg
 ONLINE ONLINE rac101
 ONLINE ONLINE rac102
 ora.ASMDATA.dg
 ONLINE ONLINE rac101
 ONLINE ONLINE rac102
 ora.DATA.dg
 ONLINE ONLINE rac101
 ONLINE ONLINE rac102
 ora.LISTENER.lsnr
 ONLINE ONLINE rac101
 ONLINE ONLINE rac102
 ora.asm
 ONLINE ONLINE rac101 Started
 ONLINE ONLINE rac102 Started
 ora.eons
 ONLINE ONLINE rac101
 ONLINE ONLINE rac102
 ora.gsd
 ONLINE ONLINE rac101
 ONLINE ONLINE rac102
 ora.net1.network
 ONLINE ONLINE rac101
 ONLINE ONLINE rac102
 ora.ons
 ONLINE ONLINE rac101
 ONLINE ONLINE rac102
 ora.registry.acfs
 ONLINE ONLINE rac101
 ONLINE ONLINE rac102
 --------------------------------------------------------------------------------
 Cluster Resources
 --------------------------------------------------------------------------------
 ora.LISTENER_SCAN1.lsnr
 1 ONLINE ONLINE rac101
 ora.oc4j
 1 ONLINE ONLINE rac101
 ora.rac101.vip
 1 ONLINE ONLINE rac101
 ora.rac102.vip
 1 ONLINE ONLINE rac102
 ora.scan1.vip
 1 ONLINE ONLINE rac101
 ora.xiaoyu.db
 1 ONLINE ONLINE rac101 Open
 2 ONLINE ONLINE rac102 Open 


檢視程式:
 [root@rac101 ~]# ps -ef|grep lsn
 grid 3587 1 0 03:23 ? 00:00:00 /db/app/11.2.0/grid/bin/tnslsnr LISTENER_SCAN1 -inherit
 grid 3590 1 0 03:23 ? 00:00:00 /db/app/11.2.0/grid/bin/tnslsnr LISTENER -inherit
 root 12861 12680 0 06:10 pts/2 00:00:00 grep lsn
 
[root@rac102 ~]# ps -ef|grep lsn
 grid 4263 1 0 03:24 ? 00:00:00 /db/app/11.2.0/grid/bin/tnslsnr LISTENER -inherit
 root 11926 11853 0 06:11 pts/1 00:00:00 grep lsn
 
注意上面的scan ip listener的使用者宿主是grid使用者,這裡需要特別注意的,接下來看看這個scan ip listener上面註冊了哪些服務。
 [grid@rac101 ~]$ lsnrctl status LISTENER_SCAN1
 
LSNRCTL for Linux: Version 11.2.0.1.0 - Production on 08-JUL-2013 21:20:00
 
Copyright (c) 1991, 2009, 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.1.0 - Production
 Start Date 08-JUL-2013 21:05:36
 Uptime 0 days 0 hr. 14 min. 27 sec
 Trace Level off
 Security ON: Local OS Authentication
 SNMP OFF
 Listener Parameter File /db/app/11.2.0/grid/network/admin/listener.ora
 Listener Log File /db/app/11.2.0/grid/log/diag/tnslsnr/rac101/listener_scan1/alert/log.xml
 Listening Endpoints Summary...
 (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=LISTENER_SCAN1)))
 (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.215)(PORT=1521)))
 Services Summary...
 Service "xiaoyu" has 2 instance(s).
 Instance "xiaoyu1", status READY, has 1 handler(s) for this service...
 Instance "xiaoyu2", status READY, has 1 handler(s) for this service...
 Service "xiaoyuXDB" has 2 instance(s).
 Instance "xiaoyu1", status READY, has 1 handler(s) for this service...
 Instance "xiaoyu2", status READY, has 1 handler(s) for this service...
 The command completed successfully
 這裡我們發現這個scan ip listener上面註冊了service xiaoyu服務,而這個服務下裝載了兩個instance xiaoyu1和xiaoyu2,這裡也就說明了如果透過scan ip listener的xiaoyu服務去連線資料庫有可能會把這個服務會把這個連線漂移到不同的instance中,還有需要注意的是這個scan ip listen接受的僅僅只有scan ip 192.168.56.215的請求服務。
 
透過上面的描述我們基本知道了scan ip和scan ip listener特性及其在scan機制中發揮的作用,接下來我們看看11g下scan機制來實現負載均衡和TAF。
 
負載均衡:由於scan的機制特性會將連線對映到本地的local listener上面的,scan機制需要初始化引數檔案中的引數remote_listener,如果這個引數配置錯誤會影響scan ip listener無法去監聽scan ip的請求。
 
SQL> show parameter remote_listener;
 
NAME TYPE VALUE
 ------------------------------------ ----------- ------------------------------
 remote_listener string racscan:1521
 remote_listener引數預設取值就是scan_name:1521,這裡也就是racscan:1521,我們也不需要去配置remote_listener來實現負載均衡。
 
Load_balance的測試用例:
 SQL> conn sy/oracle@192.168.56.215:1521/oracle
 Connected.
 SQL> select instance_name from v$instance;
 
INSTANCE_NAME
 ----------------
 db2
 
SQL> conn xiaoyu/xiaoyu@192.168.56.215:1521/xiaoyu;
 Connected.
 SQL> select instance_name from v$instance;
 
INSTANCE_NAME
 ----------------
 db1
 透過上面的看出透過scan ip可能會隨機連線到不同的節點。
 
TAF切換:關於client side的failover這裡由於比較簡單就不演示了,client side的failover會根據連線的tns的address列表連線在建立連線時就會做出failover的選擇,選擇一個可用的連線。
 
接下來要測試的是TAF(transaction application failover)切換,首先我們需要在客戶端進行配置TAF的tns連結檔案。
 列出利用scan特性來連線叢集的tnsnames.ora檔案
 [oracle@rac101 admin]$ less tnsnames.ora
 
db =
 (DESCRIPTION =
 (ADDRESS = (PROTOCOL = TCP)(HOST = racscan)(PORT = 1521))
 (LOAD_BALANCE = yes)
 (CONNECT_DATA =
 (SERVER = DEDICATED)
 (SERVICE_NAME = xiaoyu)
 (FAILOVER_MODE =
 (TYPE = SELECT)
 (METHOD = BASIC)
 (RETRIES = 8)
 (DELAY = 5)
 )
 )
 ) 


看出這裡的 (ADDRESS = (PROTOCOL = TCP)(HOST = racscan)(PORT = 1521))這裡用的是racscan,也就是scan ip地址.
 
測試TAF:
 SQL> conn sys/oracle@db;
 Connected.
 SQL> select FAILOVER_TYPE,FAILOVER_METHOD,inst_id from gv$session where sid in (select userenv('sid') from dual);
 
FAILOVER_TYPE FAILOVER_M INST_ID
 ------------- ---------- ----------
 SELECT BASIC 1
 
關閉節點1的例項xiaoyu1
 [oracle@rac101 ~]$ srvctl stop instance -d db -i db1
 
此時這個session依然還在連線,不過已經透過scan 漂移到及節點2例項xiaoyu2上面。
 SQL> select * from dual;
 
D
 -
 X
 
SQL> select instance_name from v$instance;
 
INSTANCE_NAME
 ----------------
 db2

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

相關文章