乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      Oracle RAC 環(huán)境下的連接管理(二)

       scfangbin 2016-01-11

      三、接著介紹 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:
      這里假設(shè)是一個(gè) 4 節(jié)點(diǎn)的 Oracle RAC 9iR2,tnsnames.ora 中的連接串是如下這樣:


      (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 9iR2 數(shù)據(jù)庫(kù)到底采用哪種判斷依據(jù)。prefer_least_loaded_node_ 的默認(rèn)值是 on,意味著 Listener 會(huì)把連接轉(zhuǎn)移(redirect)到 CPU 負(fù)載較低的節(jié)點(diǎn),即這種情況下判斷負(fù)載的依據(jù)是各節(jié)點(diǎn) CPU 的負(fù)載情況;如果把它設(shè)為 off,則意味著 Listener 在轉(zhuǎn)移(redirect)連接的時(shí)候會(huì)考慮各個(gè)節(jié)點(diǎn)已連接 session 的數(shù)量并且會(huì)盡量保證各個(gè)節(jié)點(diǎn)所連接 session 數(shù)量的均衡,即這種情況下判斷負(fù)載的依據(jù)是各節(jié)點(diǎn)已連接 session 的數(shù)量。


      接著再來(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ū)別是:
      THROUGHPUT:表示判斷負(fù)載的依據(jù)是吞吐量(THROUGHPUT),這通常用于那些并發(fā)的 transaction 具有相似的完成時(shí)間、相似的完成速率的系統(tǒng),比如在線交易系統(tǒng);
      SERVICE_TIME:表示判斷負(fù)載的依據(jù)是響應(yīng)時(shí)間(response time),這通常用于那些并發(fā)的 transaction 具有不同的完成時(shí)間、不同的完成速率的系統(tǒng),比如在線購(gòu)物系統(tǒng),不同的人完成一次在線購(gòu)物,所購(gòu)買的產(chǎn)品、所耗費(fèi)的時(shí)間可能有很大差異;
      NONE:表示不啟用 LBA。


      如果再結(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)有啟用;
      2、Oracle RAC 10gR2 里如果把 service 的 CLB_GOAL 設(shè)為 SHORT,同時(shí)把 GOAL 設(shè)為 THROUGHPUT 或 SERVICE_TIME,則意味著 Server 端 Connect Time Load Balancing 判斷節(jié)點(diǎn)負(fù)載的依據(jù)是 LBA。此時(shí)如果 GOAL 設(shè)為 THROUGHPUT,則 v$servicemetric 的對(duì)應(yīng) service 的 GOODNESS 值是根據(jù) CPUPERCALL 和 DBTIMEPERCALL 來(lái)計(jì)算;如果 GOAL 設(shè)為 SERVICE_TIME,則 v$servicemetric 的對(duì)應(yīng) service 的 GOODNESS 值是根據(jù) CALLSPERSEC 和 DBTIMEPERSEC 來(lái)計(jì)算。


      接下來(lái)再看一下 Oracle RAC 11gR2 下的 Server 端 Connect Time Load Balancing:
      Oracle RAC 11gR2 下的 Server 端 Connect Time Load Balancing 和 Oracle RAC 10gR2 下的 Server 端 Connect Time Load Balancing 類似,只不過(guò)因?yàn)?Oracle RAC 11gR2 里引入了 SCAN,所以 Oracle RAC 11gR2 環(huán)境下 remote_listener 應(yīng)設(shè)置為 SCAN:port。

      這里假設(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:
      ora11g:/nbsdu01/app/oracle/product/11.2/network/admin>cat tnsnames.ora


      # 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 Balancing


      Runtime 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
      這里的 JDBC 連接是指 JDBC thin 連接,要實(shí)現(xiàn) JDBC Runtime Connection Load Balancing,只需要做如下兩步即可:
      1、首先要按照“例一:JDBC Fast Connection Failover (FCF)”里那樣把 JDBC FCF 設(shè)置好;
      2、啟用 LBA events:
      srvctl modify service -d RAC11g -s Email -B SERVICE_TIME -j SHORT
      這里首先把 CLB_GOAL 設(shè)置成了 SHORT,接著把 GOAL 設(shè)置成了 SERVICE_TIME,這兩者缺一不可,CLB_GOAL 和 GOAL 的各個(gè)值的詳細(xì)含義已經(jīng)在 Connect Time Load Balancing 里詳細(xì)解釋過(guò),這里不再贅述。


      例四:ODP.NET Runtime Connection Load Balancing
      ODP.NET的Runtime Connection Load Balancing的 啟用跟“例二:ODP.NET Fast Connection Failover (FCF)”里的步驟類似,只需要做如下 4 步就好,注意這里第 1 步和第 4 步跟“例二:ODP.NET Fast Connection Failover (FCF)”里的相應(yīng)步驟是不一樣的:
      1、把對(duì)應(yīng) service的AQ Notification 打開(kāi),同時(shí)設(shè)置 CLB_GOAL和GOAL:
      srvctl modify service -d RAC11g -s Email -q TRUE -B SERVICE_TIME -j SHORT
      2、把 aq_tm_processes 的值設(shè)為 1;
      3、賦予指定用戶 de-queue 的權(quán)限:
      exec dbms_aqadm.grant_queue_privilege('DEQUEUE','SYS.SYS$SERVICE_METRICS', );
      4、在.NET連接串里設(shè)置 Load Balancing=true,如下所示:


      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;


      ERROR:ORA-12170: TNS: 連接超時(shí)16:27:49 SQL>


      這里可以看到,從開(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>


      這里可以看到,從開(kāi)始連接到連接超時(shí)的間隔時(shí)間是 17 秒,去掉輸入上述連接串“conn scott/tiger@cuihua112”所耗費(fèi)的時(shí)間,可以知道是 15 秒超時(shí)的設(shè)置生效了。


      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)容。


        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多