Oracle RAC LoadBalance
Load Balance就是把負載平均的分配到叢集中的各個節點,從而提高整體的吞吐能力。Oracle10gRAC提供了兩種不同的方法來分散負載:
1.透過Connection Balancing,按照某種演算法把使用者分配到不同的節點。也可認為是純技術的分散負載。
2.透過Service,在應用層上進行分散,也可認為是面象業務的分散負載。
一.Connection Balancing
Connection Balancing這種負載均衡是在使用者連線這個層次進行的,也就是在使用者請求建立連線時,根據每個節點的負載決定把連線分配給哪個例項,而一旦連線建立之後,會話的所有操作就都在這個例項上完成,而不會再分派給其他節點了。
ConnectionBalancing有客戶端和服務端兩種實現方法。
1.1客戶端均衡(Client-SideLB)
客戶端均衡(Client-SideLB)是Oracle8使用的方法,配置方法是在客戶端的tnsnames.ora檔案中加入:LOAD_BALANCE=YES條目。
當客戶端發起連線時,會從地址列表中隨機的選取一個,在使用隨即演算法把連線 請求分配到各個例項。
一個Clint-SideLB的TNS配置檔案如下:
RAC=
(DESCRIPTION=
(ADDRESS=(PROTOCOL=TCP)(HOST=rac1-vip)(PORT=1521))
(ADDRESS=(PROTOCOL=TCP)(HOST=rac2-vip)(PORT=1521))
(LOAD_BALANCE=YES)
(CONNECT_DATA=
(SERVER=DEDICATED)
(SERVICE_NAME=RAC)
)
)
)
注:rac1-vip需要新增到hosts檔案中
這種方法缺點很明顯,因為在分配連線時沒有考慮每個節點的真實負載,最後分配結果不一定是平衡的;並且隨即演算法需要長時間片,如果在短時間內同時發起多個連線,這些連線有可能都被分配到一個節點上,甚至更壞的情況下,連線可能被分配到故障節點上。因此Oracle引入了服務端均衡(Sevice-SideLB)方式。
1.2伺服器端均衡(Server-SideLB)
Server-Side LB是從Oracle9引入的。它的實現依賴於Listener收集負載資訊。
在資料庫執行過程中,PMON後臺程式會收集系統的負載資訊,然後登記到Listener中。最少1分鐘,最多10分鐘PMON就要做一個資訊更新,並且如果節點的負載越高,更新頻率就越高,以保證Listener能掌握每個節點準確的負載情況。如果Listener關閉了,PMON程式會每隔1秒鐘檢查Listener是否重啟。除了這個自動的定時的更新任務外,使用者也可以使用alter system register命令來手工進行這個過程。
這個自動更新動作,可以從Listener的日誌中看到,比如下面這個Listener日誌片段很清楚的記錄了這些動作。注意,例項啟動時PMON程式進行的第一次登記過程叫作Server-register,而後的更新過程叫作service-update。
[root@rac1log]#pwd
/u01/app/oracle/product/10.2.0/db_1/network/log
[root@rac1log]#more*.log
.....
27-FEB-201002:15:10*service_register*rac1*0
27-FEB-201002:15:11*service_update*rac1*0
27-FEB-201002:15:11*service_update*rac1*0
27-FEB-201002:15:23*service_update*+ASM1*0
27-FEB-201002:15:32*service_update*+ASM1*0
.....
Listener日誌雖然記錄了PMON程式的註冊和更新動作,但是註冊的內容卻沒有體現,要想獲得這些內容,可以透過跟蹤10257時間來獲得,這個事件就是跟蹤PMON活動。
Event="10257 trace name context forever,levl16"
關於event的具體使用,參考我的blog:
http://blog.csdn.net/tianlesoftware/archive/2009/12/13/4977827.aspx
PMON程式不僅會向本地的Listener註冊,還可以向其他節點上的Listener註冊。但到底要想何處註冊,是由Remote_Listeners和Local_Listener兩個引數決定。Local_Listener不用設定,而Remote_Listener需要設定,引數值是一個tnsnames項。
有了PMON的自動序號產生器制後,叢集的每個節點的Listener都掌握所有節點的負載情況,當收到客戶端連線請求時,就會把連線轉給負載最小的節點,這個節點有可能是自己也有可能是其他節點,也就是Listener會轉發使用者的請求。
Listener的節點選擇方法根據使用者所請求的連線方式會有所不同:
1).如果使用者請求的是Delicate專有連線,Listener首先選擇負載最小的節點,如果多個節點負載相同,則從節點選擇負載最小的例項。
2).如果使用者請求的是ShreServer共享功能連線,除了做節點負載比較和例項負載比較之外,還要在所選擇例項上,選擇負載最小的Dispatcher進行轉發。
Server-Side LB和Client-Side LB不是互斥的,它們可以一起工作,這時使用者的連線請求會先從地址列表中隨機選取一個地址,然後向該地址的Listener發出請求;Listener接到請求後,根據各節點負載情況挑選出最合適的節點轉發連線請求。
1、伺服器端的負載均衡需要配置remote_listener引數,而該引數的值依賴於tnsnames.ora的連線字串。
2、對於基於伺服器端的連線負載均衡,監聽器會根據當前節點、例項上的連線負載情況進行轉發到空閒的例項
3、轉發的依據僅僅是當前節點監聽的連線數量的多少,而非當前例項的過度負載
4、從上面的測試可以得出,各個節點的連線並不算均衡,是相對的均衡,因此應結合客戶端連線負載協同工作
5、對於當前例項的過度負載的情形,應結合配置service方法來實現負載均衡
注意事項:無論在配置Client-Side LB還是Server-side LB時,都需要從各個節點例項的listener.ora檔案中刪除預設產生的SID_LIST_LISTENER_NodeName條目,這樣才能保證Listener獲得的資訊是動態註冊的,而不是從檔案中讀取的靜態資訊。
1.3兩種LB的配置方法
對於Client-SideLB,需要在客戶的tnsnames條目中加入LOAD_BALANCE=YES;
對於Server-sideLB,需要配置REMOTE_LISTENER這個引數。
注意事項:在配置LB時,需要從各個節點例項的listener.ora檔案中刪除預設產生的SID_LIST_LISTENER_NodeName條目,這樣才能保證Listener獲得的資訊是動態註冊的,而不是從檔案中讀取的靜態資訊。
我們要刪除:
SID_LIST_LISTENER_RAC1=
(SID_LIST=
(SID_DESC=
(SID_NAME=PLSExtProc)
(ORACLE_HOME=/u01/app/oracle/product/10.2.0/db_1)
(PROGRAM=extproc)
)
)
僅保留:
LISTENER_RAC1=
(DESCRIPTION_LIST=
(DESCRIPTION=
(ADDRESS=(PROTOCOL=TCP)(HOST=rac1-vip)(PORT=1521)(IP=FIRST))
(ADDRESS=(PROTOCOL=TCP)(HOST=10.85.10.119)(PORT=1521)(IP=FIRST))
)
)
二.利用Service分散負載
先來分析下Connection Balancing方法的不足之處。Oracle的叢集是"共享一切"的架構,所有的節點都共享一份磁碟資料。例項間透過CacheFusion機制進行資料同步,所以RAC的效能在很大程度上受限於Cache Fusion的效能。因此,要提高RAC的效能,可以從兩方面入手:
1.提高Cache Fusion的能力,這個可以使用更好的互聯裝置,比如G級的private network,或者使用Infiniband等DRA技術。
2.可以儘量減少CacheFusion的流量,減少例項間的互相依賴。而Service就是後一種思路基礎刪發展出來的。
在來看一下與Service非常類似的Partition技術。如果一個表中的數量巨大,Oracle會建議採用PartitionTable,把資料按照一定的規律(比如時間)分散到多個物理段上,這樣訪問資料時就限制在某些區域性的Segment上。
把"分散資料"的思想進一步提升,在RAC環境上,如果能夠把資料按照應用進行分離。比如:一個ERP應用包括生產,銷售,供應鏈管理多個模組。假設這個資料庫採用了2個節點的RAC,在沒有進行“分散資料”之前,兩個使用者都使用銷售模組,那麼這兩個使用者就可能被分配到兩個節點上,在操作過程中,銷售資料就要在CacheFusion的作用下,不斷在兩個位元組間傳遞。如果又來了另外兩個生產模組的使用者,在兩個使用者被分配到兩個節點上,在操作過程中,生產部分又要在CacheFusion的協助下在兩個例項間同步。
可見,如果僅有Connection Balancing一種機制,表面上看起來使用者是被分散到了不同的Instance上,似乎負載被分散了。但是這種分散是沒有結合每個使用者的業務需求下進行的,是一種純技術手段。這種分散反而可能加重了系統間的負擔。
如果換一種思路,假如把銷售模組的使用者都分配到節點1上,生產模組的使用者都分配到節點2上,再假設這兩個模組之間的資料不交叉。這時銷售模組的資料都集中在節點1上,生產模組的資料都集中在節點2上,Cache Fusion的工作量就會急劇較少,就能從根本上解決了效能問題。
這個思想就是藉助Service分散負載的基本思想。透過把應用按照功能模組進行劃分成Service,進而把每個Service固定在某個RAC節點上,從而從根本上體統系統的效能。這種分散負載的方法不是僅靠DBA進行配置就能完成的,需要DBA和開發人員合作,在瞭解業務資料特點之後才可能看到效果。
在RAC環境下,Service並不是必須的,但是如果能借助Service對應的劃分,相信對整個系統效能的提升是有很大好處的。使用Service還有另一個好處:可以在資料庫內部建立Service TAF引數,如果客戶透過Service連線資料庫,客戶端的tnsnames.ora中就不再需要FAIL-OVER的許多設定。只需要新增如下條目即可:
RAC=
(DESCRIPTION=
(ADDRESS=(PROTOCOL=TCP)(HOST=rac1-vip)(PORT=1521))
(ADDRESS=(PROTOCOL=TCP)(HOST=rac2-vip)(PORT=1521))
(LOAD_BALANCE=YES)
(CONNECT_DATA=
(SERVER=DEDICATED)
(SERVICE_NAME=RAC)
)
)
1.透過Connection Balancing,按照某種演算法把使用者分配到不同的節點。也可認為是純技術的分散負載。
2.透過Service,在應用層上進行分散,也可認為是面象業務的分散負載。
一.Connection Balancing
Connection Balancing這種負載均衡是在使用者連線這個層次進行的,也就是在使用者請求建立連線時,根據每個節點的負載決定把連線分配給哪個例項,而一旦連線建立之後,會話的所有操作就都在這個例項上完成,而不會再分派給其他節點了。
ConnectionBalancing有客戶端和服務端兩種實現方法。
1.1客戶端均衡(Client-SideLB)
客戶端均衡(Client-SideLB)是Oracle8使用的方法,配置方法是在客戶端的tnsnames.ora檔案中加入:LOAD_BALANCE=YES條目。
當客戶端發起連線時,會從地址列表中隨機的選取一個,在使用隨即演算法把連線 請求分配到各個例項。
一個Clint-SideLB的TNS配置檔案如下:
RAC=
(DESCRIPTION=
(ADDRESS=(PROTOCOL=TCP)(HOST=rac1-vip)(PORT=1521))
(ADDRESS=(PROTOCOL=TCP)(HOST=rac2-vip)(PORT=1521))
(LOAD_BALANCE=YES)
(CONNECT_DATA=
(SERVER=DEDICATED)
(SERVICE_NAME=RAC)
)
)
)
注:rac1-vip需要新增到hosts檔案中
這種方法缺點很明顯,因為在分配連線時沒有考慮每個節點的真實負載,最後分配結果不一定是平衡的;並且隨即演算法需要長時間片,如果在短時間內同時發起多個連線,這些連線有可能都被分配到一個節點上,甚至更壞的情況下,連線可能被分配到故障節點上。因此Oracle引入了服務端均衡(Sevice-SideLB)方式。
1.2伺服器端均衡(Server-SideLB)
Server-Side LB是從Oracle9引入的。它的實現依賴於Listener收集負載資訊。
在資料庫執行過程中,PMON後臺程式會收集系統的負載資訊,然後登記到Listener中。最少1分鐘,最多10分鐘PMON就要做一個資訊更新,並且如果節點的負載越高,更新頻率就越高,以保證Listener能掌握每個節點準確的負載情況。如果Listener關閉了,PMON程式會每隔1秒鐘檢查Listener是否重啟。除了這個自動的定時的更新任務外,使用者也可以使用alter system register命令來手工進行這個過程。
這個自動更新動作,可以從Listener的日誌中看到,比如下面這個Listener日誌片段很清楚的記錄了這些動作。注意,例項啟動時PMON程式進行的第一次登記過程叫作Server-register,而後的更新過程叫作service-update。
[root@rac1log]#pwd
/u01/app/oracle/product/10.2.0/db_1/network/log
[root@rac1log]#more*.log
.....
27-FEB-201002:15:10*service_register*rac1*0
27-FEB-201002:15:11*service_update*rac1*0
27-FEB-201002:15:11*service_update*rac1*0
27-FEB-201002:15:23*service_update*+ASM1*0
27-FEB-201002:15:32*service_update*+ASM1*0
.....
Listener日誌雖然記錄了PMON程式的註冊和更新動作,但是註冊的內容卻沒有體現,要想獲得這些內容,可以透過跟蹤10257時間來獲得,這個事件就是跟蹤PMON活動。
Event="10257 trace name context forever,levl16"
關於event的具體使用,參考我的blog:
http://blog.csdn.net/tianlesoftware/archive/2009/12/13/4977827.aspx
PMON程式不僅會向本地的Listener註冊,還可以向其他節點上的Listener註冊。但到底要想何處註冊,是由Remote_Listeners和Local_Listener兩個引數決定。Local_Listener不用設定,而Remote_Listener需要設定,引數值是一個tnsnames項。
有了PMON的自動序號產生器制後,叢集的每個節點的Listener都掌握所有節點的負載情況,當收到客戶端連線請求時,就會把連線轉給負載最小的節點,這個節點有可能是自己也有可能是其他節點,也就是Listener會轉發使用者的請求。
Listener的節點選擇方法根據使用者所請求的連線方式會有所不同:
1).如果使用者請求的是Delicate專有連線,Listener首先選擇負載最小的節點,如果多個節點負載相同,則從節點選擇負載最小的例項。
2).如果使用者請求的是ShreServer共享功能連線,除了做節點負載比較和例項負載比較之外,還要在所選擇例項上,選擇負載最小的Dispatcher進行轉發。
Server-Side LB和Client-Side LB不是互斥的,它們可以一起工作,這時使用者的連線請求會先從地址列表中隨機選取一個地址,然後向該地址的Listener發出請求;Listener接到請求後,根據各節點負載情況挑選出最合適的節點轉發連線請求。
1、伺服器端的負載均衡需要配置remote_listener引數,而該引數的值依賴於tnsnames.ora的連線字串。
2、對於基於伺服器端的連線負載均衡,監聽器會根據當前節點、例項上的連線負載情況進行轉發到空閒的例項
3、轉發的依據僅僅是當前節點監聽的連線數量的多少,而非當前例項的過度負載
4、從上面的測試可以得出,各個節點的連線並不算均衡,是相對的均衡,因此應結合客戶端連線負載協同工作
5、對於當前例項的過度負載的情形,應結合配置service方法來實現負載均衡
注意事項:無論在配置Client-Side LB還是Server-side LB時,都需要從各個節點例項的listener.ora檔案中刪除預設產生的SID_LIST_LISTENER_NodeName條目,這樣才能保證Listener獲得的資訊是動態註冊的,而不是從檔案中讀取的靜態資訊。
1.3兩種LB的配置方法
對於Client-SideLB,需要在客戶的tnsnames條目中加入LOAD_BALANCE=YES;
對於Server-sideLB,需要配置REMOTE_LISTENER這個引數。
注意事項:在配置LB時,需要從各個節點例項的listener.ora檔案中刪除預設產生的SID_LIST_LISTENER_NodeName條目,這樣才能保證Listener獲得的資訊是動態註冊的,而不是從檔案中讀取的靜態資訊。
我們要刪除:
SID_LIST_LISTENER_RAC1=
(SID_LIST=
(SID_DESC=
(SID_NAME=PLSExtProc)
(ORACLE_HOME=/u01/app/oracle/product/10.2.0/db_1)
(PROGRAM=extproc)
)
)
僅保留:
LISTENER_RAC1=
(DESCRIPTION_LIST=
(DESCRIPTION=
(ADDRESS=(PROTOCOL=TCP)(HOST=rac1-vip)(PORT=1521)(IP=FIRST))
(ADDRESS=(PROTOCOL=TCP)(HOST=10.85.10.119)(PORT=1521)(IP=FIRST))
)
)
二.利用Service分散負載
先來分析下Connection Balancing方法的不足之處。Oracle的叢集是"共享一切"的架構,所有的節點都共享一份磁碟資料。例項間透過CacheFusion機制進行資料同步,所以RAC的效能在很大程度上受限於Cache Fusion的效能。因此,要提高RAC的效能,可以從兩方面入手:
1.提高Cache Fusion的能力,這個可以使用更好的互聯裝置,比如G級的private network,或者使用Infiniband等DRA技術。
2.可以儘量減少CacheFusion的流量,減少例項間的互相依賴。而Service就是後一種思路基礎刪發展出來的。
在來看一下與Service非常類似的Partition技術。如果一個表中的數量巨大,Oracle會建議採用PartitionTable,把資料按照一定的規律(比如時間)分散到多個物理段上,這樣訪問資料時就限制在某些區域性的Segment上。
把"分散資料"的思想進一步提升,在RAC環境上,如果能夠把資料按照應用進行分離。比如:一個ERP應用包括生產,銷售,供應鏈管理多個模組。假設這個資料庫採用了2個節點的RAC,在沒有進行“分散資料”之前,兩個使用者都使用銷售模組,那麼這兩個使用者就可能被分配到兩個節點上,在操作過程中,銷售資料就要在CacheFusion的作用下,不斷在兩個位元組間傳遞。如果又來了另外兩個生產模組的使用者,在兩個使用者被分配到兩個節點上,在操作過程中,生產部分又要在CacheFusion的協助下在兩個例項間同步。
可見,如果僅有Connection Balancing一種機制,表面上看起來使用者是被分散到了不同的Instance上,似乎負載被分散了。但是這種分散是沒有結合每個使用者的業務需求下進行的,是一種純技術手段。這種分散反而可能加重了系統間的負擔。
如果換一種思路,假如把銷售模組的使用者都分配到節點1上,生產模組的使用者都分配到節點2上,再假設這兩個模組之間的資料不交叉。這時銷售模組的資料都集中在節點1上,生產模組的資料都集中在節點2上,Cache Fusion的工作量就會急劇較少,就能從根本上解決了效能問題。
這個思想就是藉助Service分散負載的基本思想。透過把應用按照功能模組進行劃分成Service,進而把每個Service固定在某個RAC節點上,從而從根本上體統系統的效能。這種分散負載的方法不是僅靠DBA進行配置就能完成的,需要DBA和開發人員合作,在瞭解業務資料特點之後才可能看到效果。
在RAC環境下,Service並不是必須的,但是如果能借助Service對應的劃分,相信對整個系統效能的提升是有很大好處的。使用Service還有另一個好處:可以在資料庫內部建立Service TAF引數,如果客戶透過Service連線資料庫,客戶端的tnsnames.ora中就不再需要FAIL-OVER的許多設定。只需要新增如下條目即可:
RAC=
(DESCRIPTION=
(ADDRESS=(PROTOCOL=TCP)(HOST=rac1-vip)(PORT=1521))
(ADDRESS=(PROTOCOL=TCP)(HOST=rac2-vip)(PORT=1521))
(LOAD_BALANCE=YES)
(CONNECT_DATA=
(SERVER=DEDICATED)
(SERVICE_NAME=RAC)
)
)
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31397003/viewspace-2144253/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle RAC LoadBalance 使用詳解Oracle
- Oracle RAC 客戶端FAILOVER LOADBALANCE特性的配置方法Oracle客戶端AI
- [WK-T]ORACLE 10G 配置負載均衡(LoadBalance)Oracle 10g負載
- oracle RACOracle
- Oracle RAC Cache Fusion 系列十七:Oracle RAC DRMOracle
- Oracle RAC CacheFusion 系列十五:Oracle RAC CRServer Part TwoOracleServer
- ORACLE RAC clusterwareOracle
- oracle rac oemOracle
- oracle rac + dataguardOracle
- Oracle 11.2 DataGuard RAC To RAC搭建Oracle
- Oracle RAC Cache Fusion系列十八:Oracle RAC Statisticsand Wait EventsOracleAI
- Oracle RAC Cache Fusion 系列十四:Oracle RAC CR Server Part OneOracleServer
- Oracle RAC Cache Fusion 系列十:Oracle RAC Enqueues And Lock Part 1OracleENQ
- 【RAC】Oracle RAC如何修改心跳網路Oracle
- oracle rac 增加磁碟Oracle
- oracle RAC RDS on AIXOracleAI
- oracle rac的特徵Oracle特徵
- Oracle RAC搭建(三)Oracle
- Oracle RAC搭建(二)Oracle
- Oracle RAC搭建(一)Oracle
- ORACLE RAC重建OCROracle
- Oracle RAC基本管理Oracle
- Oracle RAC Background processesOracle
- ORACLE RAC工作原理Oracle
- Oracle RAC TAF [zt]Oracle
- oracle rac 備份Oracle
- Oracle RAC introductionOracle
- ORACLE RAC UNKNOWNOracle
- [zt] ORACLE RAC原理Oracle
- jboss oracle rac (zt)Oracle
- oracle 10.2.0.4 rac 升級到oracle 10.2.0.5 rac步驟Oracle
- 【RAC】Oracle rac 如何修改公網及vipOracle
- 【RAC】oracle11g_rac_auto_update_opatchOracle
- 管理ORACLE RAC GUARD——RAC GUARD概念和管理Oracle
- ORACLE RAC GUARD操作——RAC GUARD概念和管理Oracle
- Oracle RAC Cache Fusion 系列九:Oracle RAC 分散式資源管理(二)Oracle分散式
- Oracle RAC Cache Fusion 系列八:Oracle RAC 分散式資源管理(一)Oracle分散式
- Oracle RAC自啟動Oracle