負載均衡(LB)具體解釋


二、LB

LoadBalance就是把負載均衡分配到集群的各個節點,從而提高總體的吞吐能力。Oracle 10g RAC提供了兩種手段來實現負載,其一是通過Connection Balancing。依照某種算法把用戶分配到不同的節點。其二是通過service。在應用層面上進行分散。

 

Connection Balancing

Connection Balancing這樣的負載均衡是在用戶連接這個層次上進行的。也就是在用戶請求建立連接時。依據每一個的負載決定把連接分配到哪個實例上。而一旦建立連接之后,會話的全部操作就都在這個實力上完畢,而不會再分配給其它實例。

 

client均衡(Client-Side LB)

client均衡(Client-Side LB)是oracle 8i使用的方法。配置方法是在client的tnsnames.ora文件里增加LOAD_BALANCE=YES條目。當client發起連接時,會從地址列表中隨機選取一個,再使用隨機算法吧連接請求分散到各個實例。

 

一個Client-Side LB的TNS配置實比例如以下:

TAF_SERVER =

 (DESCRIPTION =

    (ADDRESS= (PROTOCOL = TCP)(HOST = felix1-vip)(PORT = 1521))

    (ADDRESS= (PROTOCOL = TCP)(HOST = felix2-vip)(PORT = 1521))

    (LOAD_BALANCE= yes)

   (CONNECT_DATA =

     (SERVER = DEDICATED)

     (SERVICE_NAME = taf_server)

     (FAILOVER_MODE =

       (TYPE = SELECT)

       (METHOD = BASIC)

       (RETRIES = 180)

       (DELAY = 5)

      )

    )

  )

 

這樣的方法的缺點非常明顯。由於在分配連接時沒有考慮每一個節點的真是負載,最后分配結果不一定是平衡的。而且隨機算法須要長時間片。假設在短時間內同一時候發起多個連接,這些連接有可能都被分配到一個節點上;甚至更壞的情況下,連接可能會被分配到故障節點上。因此Oracle又引入了server端(Server-Side LB)方式。

 

總結:client均衡的最大缺點就是不能依據各個實例的真實負載來分散用戶連接

 

server端均衡(Server-Side)

server端負載均衡的實現依賴於listener(監聽)手機的負載信息。在數據庫執行過程中,PMON后台進程會手機系統的負載信息,然后登記到Listener中。最少一分鍾,最多十分鍾PMON就要做一次信息更新。而且假設節點的負載越高,更新頻率就越高,以保證Listener可以掌握每一個節點准確的負載情況。假設Listener關閉,PMON進程會每隔1妙檢查Listener是否重新啟動,除了這個自己主動的、定時的更新任務外,用戶也可以有用altersystem register命令來手工進行這個過程。

這個自己主動更新動作能夠從listener的日志中看到。

注意:實例啟動時PMON進程進行的第一次登記過程叫做Server-Rgister,而后的更新過程叫做service-update;

 

TNSLSNR for Linux: Version 10.2.0.5.0 - Productionon 03-JUN-2014 11:51:54

 

Copyright (c) 1991, 2010, Oracle.  All rights reserved.

 

System parameter file is/u01/oracle/10.2.0/db_1/network/admin/listener.ora

Log messages written to/u01/oracle/10.2.0/db_1/network/log/listener.log

Trace information written to/u01/oracle/10.2.0/db_1/network/trace/listener.trc

Trace level is currently 0

 

Started with pid=25371

Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=felix1)(PORT=1521)))

Listener completed notification to CRS on start

 

TIMESTAMP * CONNECT DATA [* PROTOCOL INFO] * EVENT[* SID] * RETURN CODE

03-JUN-2014 11:51:54 *(CONNECT_DATA=(CID=(PROGRAM=)(HOST=felix1)(USER=oracle))(COMMAND=status)(ARGUMENTS=64)(SERVICE=LISTENER)(VERSION=169870592))* status * 0

03-JUN-2014 11:52:15 * service_register * felix2 *0

03-JUN-2014 11:52:15 * service_register * felix1 *0

03-JUN-2014 11:52:15 * service_update * felix1 * 0

03-JUN-2014 11:52:15 * service_register * +ASM1 *0

 

 

Listener日志盡管記錄了PMON進程的注冊和更新動作。可是注冊的內容卻沒有體現,要想獲得這些內容,能夠通過各種1025事件來獲得,這個時間是跟中PMON活動的。

 

SQL> alter session set events '10257 trace namecontext forever,level 16';

 

Session altered.

 

SQL>

 

獲取跟蹤文件:

CREATE OR REPLACE FUNCTION get_trace  return varchar is

  Resultvarchar2(4000);

begin

 dbms_output.enable(1000000);

  begin

    for x in(SELECT      d.VALUE

         ||'/'

         ||LOWER (RTRIM (i.INSTANCE, CHR (0)))

         ||'_ora_'

         ||p.spid

         ||'.trc'

           trace_file_name

  FROM   (SELECT  p.spid

           FROM   v$mystat m, v$session s,v$process p

          WHERE   m.statistic# = 1 AND s.SID= m.SID AND p.addr = s.paddr) p,

        (SELECT   t.INSTANCE

           FROM   v$thread t, v$parameter v

          WHERE   v.NAME = 'thread'

                  AND (v.VALUE = 0 OR t.thread# = TO_NUMBER (v.VALUE))) i,

        (SELECT   VALUE

           FROM   v$parameter

          WHERE   NAME = 'user_dump_dest')d) loop

      Result:= Result || x.trace_file_name;

    End loop;

  End;

 return(substr(Result, 1, 4000));

end get_trace;

 

 

 

 

 

select get_trace from dual;

 

GET_TRACE

--------------------------------------------------------------------------------

/u01/oracle/admin/felix/udump/felix1_ora_27465.trc

 

 

PMON進程不僅回憶本地的Listener注冊。還能夠向其它節點的listener注冊。但究竟要向何處注冊,是由remote_listener和local_listener這兩個參數決定。Local_Listener不用設置,而remote須要設置。參數值是一個tnsnames項。

 

SQL> show parameter listener

 

NAME                                 TYPE        VALUE

------------------------------------ -----------------------------------------

local_listener                       string      LISTENER_FELIX1

remote_listener                      string      LISTENERS_FELIX

SQL>

 

Tnsnames.ora中相應的LISTENERS_FELIX的內容例如以下:

 

LISTENERS_FELIX =

  (ADDRESS_LIST=

    (ADDRESS= (PROTOCOL = TCP)(HOST = felix1-vip)(PORT = 1521))

    (ADDRESS= (PROTOCOL = TCP)(HOST = felix2-vip)(PORT = 1521))

  )

 

有了PMON的自己主動注冊機制后。集群的每一個節點的Listener都掌握全部節點的負載狀態,當收到client的連接請求時,就會把連接轉給負載最小的節點,這個節點有可能是自己也可能是其它節點,也就是Listener會轉發用戶連接的請求listener的節點選擇方法依據用戶所請求的連接方式會有所不同:

a.       假設用戶請求的是Dedicate專有連接,Listener首先選擇負載最小的節點,假設多個節點負載同樣。則從中選擇負載最小的實例;

b.       假設用戶請求的是shared server共享連接,除了做節點負載比較和實例負載比較之外,還要在所選實例上,選擇最小的Dispatcher進行轉發。

 

兩種LB的配置方法:

對於client-Side LB。須要在客戶的tnsnames條目中增加LOAD_BALANCE=YES。對於Server-Side LB,須要配置REMOTE_LISTENER這個參數。

在配置LB時有一點須要注意:須要從各個實例的listener文件里卻掉缺省的SID_LIST_LISTENER_NAME條目,這樣才干保證Listener獲得的信息都是動態注冊的。而不是從文件里讀出的靜態信息。

 

改動前:

[oracle@felix2 admin]$ cat listener.ora

# listener.ora.felix2 Network Configuration File:/u01/oracle/10.2.0/db_1/network/admin/listener.ora.felix2

# Generated by Oracle configuration tools.

 

LISTENER_FELIX2 =

 (DESCRIPTION_LIST =

   (DESCRIPTION =

     (ADDRESS = (PROTOCOL = TCP)(HOST = felix2-vip)(PORT = 1521)(IP = FIRST))

     (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.10.102)(PORT = 1521)(IP =FIRST))

    )

  )

 

----------------------------------------

SID_LIST_LISTENER_FELIX2 =

  (SID_LIST=

   (SID_DESC =

     (SID_NAME = PLSExtProc)

     (ORACLE_HOME = /u01/oracle/10.2.0/db_1)

     (PROGRAM = extproc)

    )

  )

 

[oracle@felix2 admin]$

 

 

 

改動后配置例如以下:

[oracle@felix2 admin]$ catlistener.ora

# listener.ora.felix2 Network Configuration File:/u01/oracle/10.2.0/db_1/network/admin/listener.ora.felix2

# Generated by Oracle configuration tools.

 

LISTENER_FELIX2 =

 (DESCRIPTION_LIST =

   (DESCRIPTION =

     (ADDRESS = (PROTOCOL = TCP)(HOST = felix2-vip)(PORT = 1521)(IP = FIRST))

     (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.10.102)(PORT = 1521)(IP =FIRST))

    )

  )

 

[oracle@felix2 admin]$

 

 

利用service分散負載

Connection Balancing方法的不足之處,Oracle的集群時“共享一切“的架構,全部節點都共享一份磁盤數據。

實例間通過cachefusion機制進行數據同步,所以RAC的性能在非常大程度上受限於cache fusion的性能。因此。要提高RAC的性能能夠從雙方面入手,一方面提高cache fusion的能力。這能夠通過更好的互聯設備,比方G級的Private network。或者使用Infiniband等DRA技術;還有一方面,能夠盡量降低cache fusion的流量,降低實例間的相互依賴。

而service就是后一種思路基礎上發展出來的。

先看一下與service很相似的Partition技術。假設一個表中的數據量巨大。Oralce會建議採用了Partition Table,把數據依照一定的規律分散到多個物理段(Segment)中,這樣訪問數據時就限制在某些個局部的Segment上。

把“分散數據“思想機一部提升,在RAC環境中。假設可以把數據依照顧用進行分離。考慮以下這個場景:一個ERP應用包含生產、銷售、供應鏈管理多個模塊。

假設這個數據庫採用了2節點的RAC在沒有進行“數據分散”之前,兩個用戶都使用銷售模塊。那么這兩個用戶就可能被分配到兩個節點上,在操作過程中,銷售數據就要在cache fusion的作用下。不斷在兩個節點間傳遞,假設有來了另外兩個生產模塊的用戶,這兩個用戶又被分配到兩個節點上。在操作的過程中,生產部分的數據又要在Cache fusion的協助下在兩個實力之間同步。

可見。假設僅有connectionbalance一種機制。表面上看起來用戶是被分配到了不同的實例上,似乎負載被分散了。可是這樣的分散是沒有結合每一個用戶的業務需求進行的。是一種純技術手段(因此能夠把它叫做純技術手段分散)。

如果換一種解決思想,假如把銷售模塊的用戶都分配到節點1上,生產模塊的用戶都分配到節點2上,在如果這兩個模塊之間的數據交叉不多,這是銷售模塊的數據都集中在節點1上。生產庫模塊的數據都集中在節點2上,cachefusion的工作量就會急劇降低,這就從根本上攻克了性能的問題。

這個思想是借助於service分散負載的基本思想。

通過把應用依照功能模塊進行划分成Service,進而把每一個service固定在某些RAC節點上,從而從根本上提供系統的性能。這樣的分散負載的方法不是僅靠DBA進行配置就能完畢的,須要DBA和開發者合作,在了解業務數據特點之后才干看到效果。

在RAC環境下。Service並非必須的,可是假設借助service相應用的划分,相信對整個系統性能的提升是大有裨益的。

使用service還有另外一個優點:能夠在數據庫內部創建Service的TAF參數,假設在client通過service連接數據庫。clienttnsnames.ora中就不再須要FAIL-OVER的很多設置。

假設使用service方法,client配置須要使用service_name條目,比如以下的紅字部分:

 

 

TAF_SERVER =

 (DESCRIPTION =

    (ADDRESS= (PROTOCOL = TCP)(HOST = felix1-vip)(PORT = 1521))

    (ADDRESS= (PROTOCOL = TCP)(HOST = felix2-vip)(PORT = 1521))

     (CONNECT_DATA =

     (SERVER = DEDICATED)

      (SERVICE_NAME = taf_server)

    )

  )

 

 

具體探究參考《大話RAC》張曉明  p238~242,講的特別好!

。!。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM