程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> J2EE >> 用Java實現基於CORBA的自動負載均衡

用Java實現基於CORBA的自動負載均衡

編輯:J2EE
用Java實現基於CORBA的自動負載均衡 陳亞奇 王紅霞 2002-4-18 14:39:07 -------------------------------------------------------------------------------- 負載均衡 負載均衡是分布式計算中的一個重要內容,它的主要目標在於均衡所有結點上的負載,以使得所有結點上的負載基本相等,這種相等並非簡單的任務數目相等,而是依據這些異構結點的性能分派的加權相等。 負載分配算法大體上可以分為靜態、動態和自適應算法三類。靜態負載分配算法根據已有的有關任務的信息,通過某個算法來確定任務的分配,它不使用系統狀態信息來決定負載的分配,這對一些應用具有較高的效益。動態分配算法通過交換系統的狀態信息決定系統負載的分配,具有超過靜態算法的執行潛力。它能夠適應系統負載變化情況,比靜態算法更靈活、有效。由於它必須收集、儲存並分析狀態信息,因此動態算法會產生比靜態算法更多的系統開銷,但這種開銷常常可以被抵消掉。自適應負載分配算法是一類特殊的動態算法,它們通過動態地改變其參數、策略來調節其活動以適應變化的系統狀態。 動態負載分配算法按照集中程度可以分為集中式、完全分布式、層次性或它們中的一些結合算法。在動態集中式負載均衡系統中,全局負載信息收集在一個結點上,任何結點的負載變化信息都傳給這個結點,負載均衡的所有決定由它做出。這種方式的好處在於能夠以較少的開銷收集全局信息,挑選出最佳結點執行任務,並且可以擴充到較大的網絡計算系統。在完全分布式負載均衡系統中,每個結點保存相鄰結點或系統中部分結點的負載信息,相互合作做出各自的負載分配。這種策略實現比較簡單,並且經過一段時間後,可以選擇到較合適的結點執行任務,缺點是不能獲得最佳結點分配負載,很難擴展到成千上萬個結點的網絡計算系統。層次性方法是根據集中式、分散式方法的優缺點結合而成的一種負載均衡算法。它將系統分成層次性的子系統,在不同層次上特殊的結點作為負載均衡決策的控制結點,以分散其集中方式控制整個系統的負載均衡,它和網絡拓撲結構有很強的相關性。 分布式計算 簡單地說,分布式計算就是兩個或多個軟件互相共享信息,分散的計算資源通過分布式計算可以形成強大的計算能力。這些軟件既可以在同一台機器上運行,也可以在通過網絡連起來的幾台不同的機器上運行。絕大多數分布式計算是基於客戶機/服務器模型的。在客戶機/服務器模型內,有兩類主要的軟件,客戶機軟件,它提出信息或服務的請求;服務器軟件,則提供這種信息或服務。分布式計算具有共享稀有資源、在不同機器上平衡計算負載等優點。 目前比較流行的分布式計算方案為CORBA(Common Object Request Broker Architecture,通用對象請求代理體系結構)。CORBA由OMG(Object Management Group,對象管理組織)提出,已得到業界的廣泛認可,獲得了廣泛的應用支持。本解決方案即采用了CORBA技術。 CORBA使用代理器ORB(Object Request Broker,對象請求代理)來處理系統中客戶機與服務器之間的消息(稱為請求)。ORB提供客戶程序與服務程序之間的通信連接。當客戶程序發出請求時,ORB查找對象的實現,將請求交給該對象(並在需要時激活對象),並將響應返回給客戶程序。客戶機無需知道服務器是哪個,身處何處,發送請求及返回結果的工作全部由ORB完成。ORB能選中一個最符合客戶機請求的服務器,並把客戶機所看到的接口從服務器的實現中分離出來,接口與實現分離的好處是可以采用靈活的、搭積木式的開發方法,實現對客戶隱藏服務器的變化。只要接口及其行為沒有變化,就可以構造一個新的服務器或修改已有的服務器而無需改變客戶機。 實際問題 在油藏描述中有一類問題為地質統計分析,計算耗時很長(用工作站進行一次最簡單的計算約耗時30分鐘)。已有的計算程序是為單機而開發,生成的結果數據文件數據量很大(300002行,8Mb)。為了提高分析質量,現場多采用選用不同參數多次分析計算,然後對所有結果文件的對應位置數據取平均值的做法,非常費時費力。 為了解決這一難題,作者采用了基於CORBA的分布式計算技術。首先對原有非CORBA兼容程序進行封裝,使其能被服務器對象的方法所調用,從外界看好象是服務器對象的方法一樣;然後將計算程序—服務器程序對分別安裝到網絡中的幾台工作站上,構成服務對象組;最後在網絡中的一台微機上安裝客戶軟件和ORB,即構成了一個完整的CORBA應用系統。在該系統中,操作者在客戶程序中輸入計算參數,通過ORB依次使其它工作站上的服務器程序啟動計算軟件進行分析計算,並將計算結果由服務器程序通過ORB回送給客戶程序,由客戶程序進行結果處理。 在上述過程中,最為關鍵的操作為ORB確定下一個請求時要啟動的服務器,在各服務器節點間平衡負載,以減少任務響應時間,提高計算資源利用效率。這一工作需要用到CORBA的一個特性——自動負載均衡。 CORBA的ORB提供了基本的負載均衡功能,該功能的提供是基於動態集中式負載分配算法。服務器端建立服務器對象,然後向ORB注冊,這樣便形成了網絡中所有可用的服務器對象列表。當ORB收到對某個服務器對象的引用請求後,就在自己維護的可用服務器對象列表中根據動態集中式負載分配算法找到可用對象,並將客戶程序綁定到該對象的實例(在需要時將其激活)。 盡管CORBA提供了基本的負載均衡能力,但在某些特定的應用中仍顯得性能不足。如前述的油藏描述問題,要求客戶程序每變換一次參數,就新啟動一個服務器進行分析,也即對每一個客戶端請求實例,都必須有一個新的服務器對象來響應。而在CORBA中,對於客戶端的同一個請求實例,都會固定地被綁定到同一個服務器對象。因此,需要對CORBA的基本負載均衡特性進行巧妙的應用以解決上述瓶頸問題。 方案一:采用多客戶進程和多服務器進程(如10客戶機和10服務器)的方式(見圖1),使每個客戶機都可以找到一個服務器進行計算。但這樣帶來的問題是,客戶端為各個彼此間相互獨立的進程,結果數據位於各進程的專有存儲空間中,結果處理比較困難。 方案二:在客戶端引入多線程技術,見圖2。在客戶機程序中建立線程組,組中的線程根據操作者進行計算的需要自動產生,並且都是同一個客戶請求實例的副本。這樣,每個副本實現了相同的請求實例卻又相互獨立,就可以激活不同的服務器完成相同功能的分析操作。由於線程共享內存單元,因此每個線程都可將計算結果存儲在公用結果存儲空間中,這就使得可以用客戶端程序自動對計算結果進行平均處理。每當操作者修改了計算參數開始計算時,客戶程序即向線程組中加入一個新的請求線程,通過ORB根據動態集中式負載分配算法找到一個空閒或負載最輕的服務器進行計算,並將返回的計算結果存入客戶程序的公用結果存儲區中。另外,在計算線程組之外還需要一個監控線程對計算線程組中各線程的狀態進行輪詢,以便當所有計算線程執行完畢並返回結果後觸發結果處理操作。 經過方案二巧妙的技術處理,利用CORBA提供的基本負載均衡功能解決了特定應用的特殊要求所帶來的瓶頸問題。 根據上面的思想,作者在某項目中應用了該技術。該分布式計算系統由一台微機和數台Sun工作站組成,CORBA客戶端和ORB運行於微機上,在每個工作站上運行有計算程序—服務器程序對。整個處理過程耗時為第一個服務器啟動到最後一個服務器啟動的時間間隔加上單服務器執行時間。前者是調整參數時間,後者為真正的計算時間,且前者一般遠小於後者。由此可以看出,應用該技術構建分布式計算系統,處理一個油藏描述問題所耗時間將約為原計算耗時的1/N(N為計算次數,整數),進行更復雜的處理時效率提高就尤為明顯。
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved