三、接著介紹 Connect Time Load Balancing Connect Time Load Balancing 就是指不從連接池中取得已有連接,而是直接連接 Oracle 數(shù)據(jù)庫(kù)時(shí)的 Load Balance。Connect Time Load Balancing 又細(xì)分為兩種,分別是客戶端的 Connect Time Load Balancing 和 Server 端的 Connect Time Load Balancing。 在 Oracle RAC 11gR2 之前,客戶端的 Connect Time Load Balancing 非常容易實(shí)現(xiàn),只需要在相關(guān)的 tnsnames.ora 中指定多個(gè) vip,同時(shí)指定 LOAD_BALANCE=ON 就好了。如下所示: (DESCRIPTION= (ADDRESS_LIST= (LOAD_BALANCE=ON) (ADDRESS=(PROTOCOL=TCP)(HOST=RAC1-vip)(PORT=1521)) (ADDRESS=(PROTOCOL=TCP)(HOST=RAC2-vip)(PORT=1521)) (ADDRESS=(PROTOCOL=TCP)(HOST=RAC3-vip)(PORT=1521)) (ADDRESS=(PROTOCOL=TCP)(HOST=RAC4-vip)(PORT=1521)) ) (CONNECT_DATA=(SERVICE_NAME=RAC10g)) ) 這樣客戶端在連接的時(shí)候,會(huì)隨機(jī)地從上述 4 個(gè) VIP 地址中選一個(gè)來(lái)連接 Oracle 數(shù)據(jù)庫(kù)以達(dá)到 Load Balance 的目的。 之前已經(jīng)提到,Oracle RAC 11gR2 中引入了 SCAN(Single Client Access Name),并且客戶端缺省是通過(guò) SCAN 來(lái)連接整個(gè) RAC 環(huán)境的,如果使用了 DNS 或者 GNS (Grid Naming Service),那么最多可以有 3 個(gè) SCAN VIP 和 3 個(gè) SCAN Listener;如果沒(méi)有使用 DNS 或者 GNS,而是選擇使用 hosts 文件,則只會(huì)有 1 個(gè) SCAN VIP 和 1 個(gè) SCAN Listener。 這里假設(shè)你在 tnsnames.ora 中這樣配置: (DESCRIPTION = (LOAD_BALANCE=ON) (ADDRESS = (PROTOCOL = TCP)(HOST = MySCAN)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME =RAC11g))) 嚴(yán)格意義上說(shuō),只有在 RAC 環(huán)境有 1 個(gè)以上 SCAN VIP 的時(shí)候,上述 LOAD_BALANCE=ON 才有意義——它表示的是客戶端在連接 Oracle 11gR2 RAC 的時(shí)候,會(huì)隨機(jī)的選擇三個(gè) SCAN VIP 中的一個(gè)來(lái)連接,所以 Oracle 11gR2 RAC 的客戶端 Connect Time Load Balancing 實(shí)際上是針對(duì) SCAN VIP 而言的,而不是像 Oracle RAC 10gR2 /9iR2 那樣直接針對(duì) RAC 節(jié)點(diǎn)的 VIP(Oracle RAC 9iR2 里沒(méi)有 VIP,此時(shí) Connect Time Load Balancing 是針對(duì) public ip)。 當(dāng)使用了 hosts 文件來(lái)指定 SCAN VIP 的時(shí)候,客戶端 Connect Time Load Balancing 實(shí)際上是不存在的,因?yàn)楝F(xiàn)在整個(gè) RAC 環(huán)境只有 1 個(gè) SCAN VIP。 現(xiàn)在再來(lái)介紹一下 Server 端的 Connect Time Load Balancing。Server 端的 Connect Time Load Balancing 相對(duì)來(lái)說(shuō)要復(fù)雜一些,下面針對(duì) Oracle 數(shù)據(jù)庫(kù)不同的版本來(lái)分別加以說(shuō)明。 首先要說(shuō)明的是:無(wú)論是 Oracle RAC 9iR2/10gR2,還是 Oracle RAC 11gR2,它們的 Server 端 Connect Time Load Balancing 都是通過(guò)聯(lián)合使用 local_listener 和 remote_listener 來(lái)實(shí)現(xiàn)的。 先來(lái)介紹 Oracle RAC 9iR2 下的 Server 端 Connect Time Load Balancing: (DESCRIPTION= (FAILOVER=ON) (ADDRESS_LIST= (LOAD_BALANCE=ON) (ADDRESS=(PROTOCOL=TCP)(HOST=RAC1-ip)(PORT=1521)) (ADDRESS=(PROTOCOL=TCP)(HOST=RAC2-ip)(PORT=1521)) (ADDRESS=(PROTOCOL=TCP)(HOST=RAC3-ip)(PORT=1521)) (ADDRESS=(PROTOCOL=TCP)(HOST=RAC4-ip)(PORT=1521)) ) (CONNECT_DATA=(SERVICE_NAME=RAC9i)) ) 再在各個(gè)節(jié)點(diǎn)的 tnsnames.ora 中加入如下設(shè)置: LISTENER_RAC1 = (ADDRESS = (PROTOCOL = TCP)(HOST = RAC1-ip)(PORT = 1521))LISTENER_RAC2 = (ADDRESS = (PROTOCOL = TCP)(HOST = RAC2-ip)(PORT = 1521))LISTENER_RAC3 = (ADDRESS = (PROTOCOL = TCP)(HOST = RAC3-ip)(PORT = 1521))LISTENER_RAC4 = (ADDRESS = (PROTOCOL = TCP)(HOST = RAC4-ip)(PORT = 1521))LISTENERS_RAC = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = RAC1-ip)(PORT = 1521)) (ADDRESS = (PROTOCOL = TCP)(HOST = RAC2-ip)(PORT = 1521)) (ADDRESS = (PROTOCOL = TCP)(HOST = RAC3-ip)(PORT = 1521)) (ADDRESS = (PROTOCOL = TCP)(HOST = RAC4-ip)(PORT = 1521)) ) 然后只需要在初始化參數(shù)文件里加入如下設(shè)置就能實(shí)現(xiàn) Server 端 Connect Time Load Balancing 了: RAC1.local_listener=LISTENER_RAC1RAC2.local_listener=LISTENER_RAC2RAC3.local_listener=LISTENER_RAC3RAC4.local_listener=LISTENER_RAC4*.remote_listener=LISTENERS_RAC 當(dāng)做了上述設(shè)置后,上述 4 個(gè)節(jié)點(diǎn)的 listener 實(shí)際上除了知道本節(jié)點(diǎn)負(fù)載的情況之外,同時(shí)也知道了其余節(jié)點(diǎn)的負(fù)載情況。所以當(dāng)先經(jīng)過(guò)一層客戶端的 Connect Time Load Balancing,比如這里隨機(jī)地連到了第二個(gè)節(jié)點(diǎn)上的 listener(即 LISTENER_RAC2)上,當(dāng) LISTENER_RAC2 發(fā)現(xiàn)自身的負(fù)載較高,是有可能把你的連接請(qǐng)求轉(zhuǎn)移(redirect)到其余負(fù)載較低的節(jié)點(diǎn)的 listener 上的——這就是所謂的第二層 Load Balancing,也就是 server 端的 Connect Time Load Balancing。 Oracle RAC 9iR2 里 server 端的 Connect Time Load Balancing 的依據(jù)是各節(jié)點(diǎn) CPU 的負(fù)載(CPU runqueue-based load)或各節(jié)點(diǎn)所連接的 session 的數(shù)量。我們可以在相應(yīng)節(jié)點(diǎn)的 listener.ora 中通過(guò)參數(shù) prefer_least_loaded_node_ 接著再來(lái)看 Oracle RAC 10gR2 下的 Server 端 Connect Time Load Balancing。Oracle RAC 10gR2 里 Server 端 Connect Time Load Balancing 也是通過(guò)聯(lián)合使用 local_listener 和 remote_listener 來(lái)實(shí)現(xiàn)的,只不過(guò) Oracle RAC 10gR2 里引入了 VIP,所以這里 local_listener 和 remote_listener 一定是要監(jiān)聽(tīng) VIP,而不是像 Oracle RAC 9iR2 那樣監(jiān)聽(tīng) public ip 了。 這里假設(shè)是一個(gè) 4 節(jié)點(diǎn)的 Oracle RAC 10gR2,tnsnames.ora 中的連接串是如下所示(注意這里的連接地址已經(jīng)是 VIP 了): (DESCRIPTION= (FAILOVER=ON) (ADDRESS_LIST= (LOAD_BALANCE=ON) (ADDRESS=(PROTOCOL=TCP)(HOST=RAC1-vip)(PORT=1521)) (ADDRESS=(PROTOCOL=TCP)(HOST=RAC2-vip)(PORT=1521)) (ADDRESS=(PROTOCOL=TCP)(HOST=RAC3-vip)(PORT=1521)) (ADDRESS=(PROTOCOL=TCP)(HOST=RAC4-vip)(PORT=1521)) ) (CONNECT_DATA=(SERVICE_NAME=RAC10g)) ) 再在各個(gè)節(jié)點(diǎn)的 tnsnames.ora 中加入如下設(shè)置(注意這里監(jiān)聽(tīng)的已經(jīng)是 VIP了): LISTENER_RAC1 = (ADDRESS = (PROTOCOL = TCP)(HOST = RAC1-vip)(PORT = 1521))LISTENER_RAC2 = (ADDRESS = (PROTOCOL = TCP)(HOST = RAC2-vip)(PORT = 1521))LISTENER_RAC3 = (ADDRESS = (PROTOCOL = TCP)(HOST = RAC3-vip)(PORT = 1521))LISTENER_RAC4 = (ADDRESS = (PROTOCOL = TCP)(HOST = RAC4-vip)(PORT = 1521))LISTENERS_RAC = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = RAC1-vip)(PORT = 1521)) (ADDRESS = (PROTOCOL = TCP)(HOST = RAC2-vip)(PORT = 1521)) (ADDRESS = (PROTOCOL = TCP)(HOST = RAC3-vip)(PORT = 1521)) (ADDRESS = (PROTOCOL = TCP)(HOST = RAC4-vip)(PORT = 1521)) ) 然后只需要在初始化參數(shù)文件里加入如下設(shè)置就能實(shí)現(xiàn) Server 端 Connect Time Load Balancing 了: RAC1.local_listener=LISTENER_RAC1RAC2.local_listener=LISTENER_RAC2RAC3.local_listener=LISTENER_RAC3RAC4.local_listener=LISTENER_RAC4*.remote_listener=LISTENERS_RAC 當(dāng)做了上述設(shè)置后,與 Oracle RAC 9iR2 一樣,也可以實(shí)現(xiàn) Server 端 Connect Time Load Balancing。只不過(guò)這里判斷負(fù)載的依據(jù)有了變化。(注:如果客戶端不能解析 RAC1-vip 這樣的主機(jī)名,則在連接時(shí)很可能報(bào) ORA-12545 錯(cuò)誤,local_listener 對(duì)應(yīng)的 TNS 配置中應(yīng)該使用 VIP 地址,而不要用主機(jī)名,這里寫(xiě)主機(jī)名只是出于演示的目的) Oracle 10g 引入了 Service,所以在 Oracle 10g 里,判斷負(fù)載的依據(jù)就跟 Service 綁定在了一起。Oracle RAC 10gR2 里 Server 端 Connect Time Load Balancing 判斷負(fù)載的依據(jù)是由相關(guān) service 的參數(shù) CLB_GOAL 和 GOAL 聯(lián)合來(lái)決定的。 Oracle RAC 10gR2 里的負(fù)載可以通過(guò) v$servicemetric 來(lái)查看: SQL> desc v$servicemetric;Name Type Nullable Default Comments ----------------- ------------ -------- ------- -------- BEGIN_TIME DATE Y END_TIME DATE Y INTSIZE_CSEC NUMBER Y GROUP_ID NUMBER Y SERVICE_NAME_HASH NUMBER Y SERVICE_NAME VARCHAR2(64) Y CTMHASH NUMBER Y ELAPSEDPERCALL NUMBER Y CPUPERCALL NUMBER Y DBTIMEPERCALL NUMBER Y CALLSPERSEC NUMBER Y DBTIMEPERSEC NUMBER Y GOODNESS NUMBER Y DELTA NUMBER Y FLAGS NUMBER Y 其中每個(gè) service 在 v$servicemetric 里會(huì)對(duì)應(yīng)兩條記錄,一條記錄每5秒采樣一次,另外一條記錄每 60 秒采樣一次。 這里衡量每個(gè) service 的負(fù)載情況,主要是通過(guò) GOODNESS、DELTA和FLAGS 這三列來(lái)說(shuō)明的,如下是它們各自的含義: GOODNESS 表示這個(gè)節(jié)點(diǎn)成為 Server 端 Connect Time Load Balancing 的目標(biāo)節(jié)點(diǎn)的可能性,這個(gè)值越高,可能性就越低。即這個(gè) service 在某個(gè)節(jié)點(diǎn)上的 GOODNESS 的值越大,則表明這個(gè)節(jié)點(diǎn)的負(fù)載越重,這個(gè)節(jié)點(diǎn)成為 Server 端 Connect Time Load Balancing 的目標(biāo)節(jié)點(diǎn)的可能性就越低。 DELTA 表示當(dāng)節(jié)點(diǎn)增加了一個(gè)額外的 session 后對(duì)負(fù)載增加情況的估算。 FLAGS 是一個(gè)標(biāo)志位,它的各個(gè)值的含義如下: 0 – all good 1 – blocked 2 – crossed threshold 4 – goodness unknown (usually when no sessions connected) 每個(gè) service 所對(duì)應(yīng)的 CLB_GOAL 實(shí)際上表示 Client Load Balance Goal,它的值要么為 LONG,要么為 SHORT,默認(rèn)值是 LONG。 LONG 和 SHORT 的區(qū)別是:LONG 是 CLB_GOAL 的缺省值,通常用于那些需要長(zhǎng)時(shí)間保持的連接,比如一些第三方的連接池或者 SQL*Form 應(yīng)用;而 SHORT 則通常用于那些連接持續(xù)時(shí)間較短的應(yīng)用,如果使用了支持訂閱 LBA(Load Balancing Advisory)的連接池,則應(yīng)該把 CLB_GOAL 的值設(shè)為 SHORT。 如果一個(gè) service 的 CLB_GOAL 被設(shè)為 LONG,則意味著衡量這個(gè) service 所在節(jié)點(diǎn)的負(fù)載情況是依據(jù)連接到這個(gè)節(jié)點(diǎn)的 session 的數(shù)量,此時(shí)與 CLB_GOAL 相對(duì)應(yīng)的另外一個(gè)參數(shù) GOAL 的設(shè)置將不再生效。 如果你把一個(gè) service 的 CLB_GOAL 設(shè)為 SHORT,則意味著衡量這個(gè) service 的負(fù)載情況是依據(jù) LBA,在根據(jù) LBA 判斷負(fù)載情況時(shí)根據(jù)對(duì)應(yīng) service 的 GOAL 的設(shè)置的值的不同,又可以細(xì)分為是依據(jù) SERVICE_TIME 還是依據(jù) THROUGHPUT。也就是說(shuō),每個(gè) service 所對(duì)應(yīng)的 GOAL 實(shí)際上表示 LBA GOAL,它的值要么為 THROUGHPUT,要么為 SERVICE_TIME,要么是 NONE,GOAL 的默認(rèn)值是 NONE。即當(dāng)你把 CLB_GOAL 設(shè)為 SHORT 后,這種情況下 Server 端 Connect Time Load Balancing 判斷負(fù)載的依據(jù)就是由 GOAL 的設(shè)置來(lái)決定了。 GOAL 所對(duì)應(yīng)的三個(gè)值 THROUGHPUT、SERVICE_TIME 和 NONE 的區(qū)別是: 如果再結(jié)合 service 的 CLB_GOAL 和 GOAL,以及 v$servicemetric,就可以歸納出 Oracle RAC 10gR2 里 Server 端 Connect Time Load Balancing 判斷負(fù)載的依據(jù): 1、Oracle RAC 10gR2 里 Server 端 Connect Time Load Balancing 默認(rèn)情況下判斷負(fù)載的依據(jù)是連接到每個(gè)節(jié)點(diǎn)的 session 的數(shù)量,即當(dāng) CLB_GOAL 為默認(rèn)值 LONG 的時(shí)候,v$servicemetric 的對(duì)應(yīng) service 的 GOODNESS=number of connected sessions,DELTA=1,注意此時(shí) LBA 并沒(méi)有啟用; 接下來(lái)再看一下 Oracle RAC 11gR2 下的 Server 端 Connect Time Load Balancing: 這里假設(shè)是一個(gè) 4 節(jié)點(diǎn)的 Oracle RAC 11gR2 環(huán)境,tnsnames.ora 中的連接串是如下這樣: (DESCRIPTION = (FAILOVER=ON)(LOAD_BALANCE=ON) (ADDRESS = (PROTOCOL = TCP)(HOST = MySCAN)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME =RAC11g))) 再在各個(gè)節(jié)點(diǎn)的 tnsnames.ora 中加入如下設(shè)置(注意這里監(jiān)聽(tīng)的是各個(gè)節(jié)點(diǎn)的 VIP): LISTENER_RAC1 = (ADDRESS = (PROTOCOL = TCP)(HOST = RAC1-vip)(PORT = 1521))LISTENER_RAC2 = (ADDRESS = (PROTOCOL = TCP)(HOST = RAC2-vip)(PORT = 1521))LISTENER_RAC3 = (ADDRESS = (PROTOCOL = TCP)(HOST = RAC3-vip)(PORT = 1521))LISTENER_RAC4 = (ADDRESS = (PROTOCOL = TCP)(HOST = RAC4-vip)(PORT = 1521)) 然后只需要在初始化參數(shù)文件里加入如下設(shè)置就能實(shí)現(xiàn) Server 端 Connect Time Load Balancing 了: RAC1.local_listener=LISTENER_RAC1RAC2.local_listener=LISTENER_RAC2RAC3.local_listener=LISTENER_RAC3RAC4.local_listener=LISTENER_RAC4*.remote_listener= MySCAN:1521 當(dāng)做了上述設(shè)置后,Oracle 11gR2 RAC 的 Server 端 Connect Time Load Balancing 也就配好了。此時(shí)所有的 SCAN Listener 實(shí)際上是都知道所有RAC節(jié)點(diǎn)的負(fù)載情況的。當(dāng)先經(jīng)過(guò)一層客戶端的 Connect Time Load Balancing,比如這里隨機(jī)的連到了第二個(gè) SCAN VIP 所對(duì)應(yīng)的 SCAN Listener 上后,這時(shí)候這個(gè) SCAN Listener 會(huì)選擇一個(gè)實(shí)際負(fù)載較低的 RAC 節(jié)點(diǎn),然后把連接請(qǐng)求轉(zhuǎn)移(redirect)到這個(gè)負(fù)載較低的 RAC 節(jié)點(diǎn)的 Local Listener 上——這就是 Oracle RAC 11gR2 的 server 端的 Connect Time Load Balancing。 實(shí)際上,local_listener 和 remote_listener 支持復(fù)雜的連接串的寫(xiě)法。所以,可以在初始化參數(shù)里面直接設(shè)置 local_listener 和 remote_listener,而不需要在 $ORACLE_HOME/network/admin 下的 tnsnames.ora 中做上述設(shè)置。 來(lái)看一個(gè)兩節(jié)點(diǎn)的 Oracle 11gR2 RAC 的實(shí)例。這個(gè)環(huán)境中用了 hosts 文件,hosts 文件內(nèi)容如下所示: 10.1.15.64 P550-05-LA 10.1.15.84 P550-05-LA-vip 9.2.1.64 P550-05-LA-priv 10.1.15.65 P550-05-LB 10.1.15.85 P550-05-LB-vip 9.2.1.65 P550-05-LB-priv10.1.15.86 nbsdev-scan 從上述內(nèi)容可以看到,現(xiàn)在節(jié)點(diǎn) 1 的 vip 是 10.1.15.84,節(jié)點(diǎn) 2 的 vip 是 10.1.15.85,整個(gè) RAC 環(huán)境的 SCAN vip 是 10.1.15.86。 先登陸節(jié)點(diǎn) 1,看一下節(jié)點(diǎn) 1 上的 local_listener 和 remote_listener 的設(shè)置: SQL> show parameter instance_name; NAME TYPE VALUE------------------------------------ ----------- ------------------------------instance_name string NBSDEV1 SQL> show parameter local_listener; NAME TYPE VALUE------------------------------------ ----------- ------------------------------local_listener string (DESCRIPTION=(ADDRESS_LIST= (ADDRESS=(PROTOCOL=TCP)(HOST=10.1.15.84)(PORT=1522)))) SQL> show parameter remote_listener; NAME TYPE VALUE------------------------------------ ----------- ------------------------------remote_listener string nbsdev-scan:1522 再登陸節(jié)點(diǎn) 2,看一下節(jié)點(diǎn) 2 上的 local_listener 和 remote_listener 的設(shè)置: SQL> show parameter instance_name; NAME TYPE VALUE------------------------------------ ----------- ------------------------------instance_name string NBSDEV2 SQL> show parameter local_listener; NAME TYPE VALUE------------------------------------ ----------- ------------------------------local_listener string (DESCRIPTION=(ADDRESS_LIST=(ADDRESS= (PROTOCOL=TCP)(HOST=10.1.15.85)(PORT=1522)))) SQL> show parameter remote_listener; NAME TYPE VALUE------------------------------------ ----------- ------------------------------remote_listener string nbsdev-scan:1522 上述環(huán)境 server 端的 Connect Time Load Balancing 實(shí)際上已經(jīng)配置好了,但從如下內(nèi)容可以看到,我們并沒(méi)有在 $ORACLE_HOME/network/admin 下的 tnsnames.ora 中配置相關(guān)的 local_listener 和 remote_listener: # tnsnames.ora Network Configuration File: /nbsdu01/app/oracle/product/11.2/network/admin/tnsnames.ora# Generated by Oracle configuration tools.NBSDEV = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = nbsdev-scan)(PORT = 1522)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = NBSDEV) ) ) 四、最后來(lái)介紹 Runtime Connection Load BalancingRuntime Connection Load Balancing 是指從連接池中取得已有連接時(shí)的 Connection Load Balancing。 之前無(wú)論是 Oracle RAC 9iR2/10gR2,還是 Oracle RAC 11gR2,在存在連接池的情況下,單純的 server 端的 Connect Time Load Balancing 并不能保證當(dāng)應(yīng)用需要從連接池里取得一個(gè)已有連接的時(shí)候,這個(gè)連接就指向了節(jié)點(diǎn)負(fù)載較低的那個(gè)節(jié)點(diǎn)。因?yàn)檫@個(gè)時(shí)候應(yīng)用從連接池里取得的連接很可能就是連接池初始化的時(shí)候形成的連接,只是反映了連接池初始化那個(gè)時(shí)間點(diǎn)的各個(gè)節(jié)點(diǎn)的負(fù)載情況,而隨著時(shí)間的推移,各個(gè)節(jié)點(diǎn)的負(fù)載情況可能發(fā)生了很大的變化,所以這種情況下連接池的連接很可能并不是真正的 Load Balance。 實(shí)際上 FAN 就是為了解決上述問(wèn)題而設(shè)計(jì)的。能支持 FAN events 的連接池通過(guò)訂閱 FAN HA events,就可以保證當(dāng)應(yīng)用需要從連接池里取得一個(gè)已有連接的時(shí)候,這個(gè)連接肯定是有效的連接,不會(huì)指向那些 service 宕掉或者 instance 崩潰的節(jié)點(diǎn)(之前已經(jīng)提到過(guò),這是通過(guò) FCF 來(lái)實(shí)現(xiàn)的:當(dāng)支持 FAN events 的連接池接收到包含 instance/service 宕掉的 FAN HA events 后,原先 cache 在連接池里的跟這個(gè) instance/service 相關(guān)的連接馬上會(huì)被標(biāo)記為失效,同時(shí)這些連接會(huì)被清除);另外一個(gè)方面,能支持 FAN events 的連接池通過(guò)訂閱 LBA events,就能近乎實(shí)時(shí)地知道各個(gè) RAC 節(jié)點(diǎn)實(shí)際的負(fù)載情況,所以當(dāng)應(yīng)用需要從連接池里取得一個(gè)已有連接的時(shí)候,連接池就能提供給用戶一個(gè)真正的負(fù)載較低的 RAC 節(jié)點(diǎn),這樣就實(shí)現(xiàn)了真正的 Runtime Connection Load Balancing。 現(xiàn)在介紹兩個(gè)通過(guò)訂閱 LBA events 實(shí)現(xiàn) Runtime Connection Load Balancing 的例子。 例三:JDBC Runtime Connection Load Balancing 例四:ODP.NET Runtime Connection Load Balancing con.ConnectionString = 'User Id=user_name;Password=password;Data Source=odpapp;' + 'Min Pool Size=10;Connection Lifetime=120;Connection Timeout=60;' + 'Load Balancing=true;Incr Pool Size=5;Decr Pool Size=2'; 至此我們已經(jīng)詳細(xì)的描述了 RAC 環(huán)境下的連接管理。 作為這篇文章的結(jié)束,最后我們來(lái)闡述一下如何在 Oracle 數(shù)據(jù)庫(kù)里設(shè)置 TCP timeout。 1、32 位 Windows上Oracle 數(shù)據(jù)庫(kù) 11.2.0.1 默認(rèn)的操作系統(tǒng)TNS連接 timeout 的時(shí)間大概是 20 秒: 16:27:26 SQL> conn scott/tiger@cuihua112; 這里可以看到,從開(kāi)始連接到連接超時(shí)的間隔時(shí)間是 23 秒,去掉輸入上述連接串“conn scott/tiger@cuihua112”所耗費(fèi)的時(shí)間,可以知道在 32 位 Windows上Oracle 數(shù)據(jù)庫(kù) 11.2.0.1 默認(rèn)的操作系統(tǒng)TNS連接 timeout 的時(shí)間大概是 20 秒。 2、修改一下 client 端 sqlnet.ora 文件,將 TNS 連接 timeout 時(shí)間修改為 5 秒(這是通過(guò)設(shè)置 SQLNET.OUTBOUND_CONNECT_TIMEOUT 來(lái)實(shí)現(xiàn)的): # sqlnet.ora Network Configuration File: C:\app\cuihua\product\11.2.0\dbhome_1\network\admin\sqlnet.ora# Generated by Oracle configuration tools.# This file is actually generated by netca. But if customers choose to # install 'Software Only', this file wont exist and without the native # authentication, they will not be able to connect to the database on NT.SQLNET.AUTHENTICATION_SERVICES= (NTS)SQLNET.OUTBOUND_CONNECT_TIMEOUT = 5NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT) 從如下結(jié)果可以看到,從開(kāi)始連接到連接超時(shí)的間隔時(shí)間是 7 秒,去掉輸入上述連接串“conn scott/tiger@cuihua112”所耗費(fèi)的時(shí)間,可以知道上述 5 秒超時(shí)的設(shè)置確實(shí)生效了。 16:28:34 SQL> conn scott/tiger@cuihua112;ERROR:ORA-12170: TNS: 連接超時(shí)16:28:41 SQL> 3、注釋掉上述 SQLNET.OUTBOUND_CONNECT_TIMEOUT = 5,在 tnsnames.ora 的 cuihua112 的連接串中將 TNS 連接 timeout 時(shí)間設(shè)置為 15 秒: CUIHUA112 = (DESCRIPTION = (CONNECT_TIMEOUT=5)(RETRY_COUNT=2) (ADDRESS = (PROTOCOL = TCP)(HOST = 172.20.190.11)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = cuihua112) ) ) 從如下結(jié)果可以看到,從開(kāi)始連接到連接超時(shí)的間隔時(shí)間是 17 秒,去掉輸入上述連接串“conn scott/tiger@cuihua112”所耗費(fèi)的時(shí)間,可以知道上述 15 秒超時(shí)的設(shè)置確實(shí)生效了。 16:31:08 SQL> conn scott/tiger@cuihua112;ERROR:ORA-12170: TNS: 連接超時(shí)16:31:25 SQL> 4、同時(shí)啟用 SQLNET.OUTBOUND_CONNECT_TIMEOUT = 5 和上述 cuihua112 的連接串,從結(jié)果里可以看到,tnsnames.ora 中的設(shè)置取代了(override)了 sqlnet.ora 中的 TNS 連接 timeout 的設(shè)置。即在同時(shí)啟用的情況下,現(xiàn)在的 TNS 連接 timeout 設(shè)置還是為 15 秒。 16:33:12 SQL> conn scott/tiger@cuihua112;ERROR:ORA-12170: TNS: 連接超時(shí)16:33:29 SQL>
5、在 tnsnames.ora 的 cuihua112 的連接串中將 TNS 連接 timeout 時(shí)間設(shè)置為 40 秒,這已經(jīng)超過(guò)了 TNS 連接默認(rèn)的 timeout 值,從如下測(cè)試?yán)锟梢钥吹?,Oracle 數(shù)據(jù)庫(kù)會(huì)以 tnsnames.ora 中的設(shè)置為準(zhǔn)(當(dāng)然,這里前提條件是單次連接的 CONNECT_TIMEOUT 設(shè)置不要超過(guò)操作系統(tǒng) TNS 連接默認(rèn)的 timeout 值,如果超過(guò)了則 CONNECT_TIMEOUT 設(shè)置失效,但 RETRY_COUNT 的設(shè)置依然有效)。 CUIHUA112 = (DESCRIPTION = (CONNECT_TIMEOUT=10)(RETRY_COUNT=3) (ADDRESS = (PROTOCOL = TCP)(HOST = 172.20.190.11)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = cuihua112) ) ) 這里 CONNECT_TIMEOUT 設(shè)置為 10 秒,RETRY_COUNT 設(shè)置為 3,實(shí)際上就將 TNS 連接 timeout 時(shí)間設(shè)置成了40秒 16:52:52 SQL> conn scott/tiger@cuihua112;ERROR:ORA-12170: TNS: 連接超時(shí)16:53:33 SQL> 這里可以看到,從開(kāi)始連接到連接超時(shí)的間隔時(shí)間是 41 秒,去掉輸入上述連接串“conn scott/tiger@cuihua112”所耗費(fèi)的時(shí)間,可以知道是 40 秒超時(shí)的設(shè)置生效了。 五、總結(jié)這篇文章詳細(xì)介紹了 RAC 環(huán)境下的連接管理及其相關(guān)內(nèi)容,主要針對(duì) RAC 環(huán)境下連接管理所涉及到的 Connect Time Load Balancing、Runtime Connection Load Balancing、Connect Time Connection Failover 和 Runtime Connection Failover 等內(nèi)容,同時(shí)也描述了包括 TAF、ONS、FCF、FAN 和 LBA 等其它一些相關(guān)內(nèi)容。 |
|