1. 程式人生 > >apache Web伺服器叢集負載均衡技術 (轉)

apache Web伺服器叢集負載均衡技術 (轉)

[size=medium]Internet 的快速增長,特別是電子商務應用的發展,使Web應用成為目前最重要最廣泛的應用,Web伺服器動態內容越來越流行。目前,網上資訊交換量幾乎呈指數增長,需要更高效能的Web伺服器提供更多使用者的Web服務,因此,Web伺服器面臨著訪問量急劇增加的壓力,對其處理能力和響應能力等帶來更高的要求,如果Web 伺服器無法滿足大量Web訪問服務,將無法為使用者提供穩定、良好的網路應用服務。
由於客觀存在的伺服器實體記憶體、CPU 處理速度和作業系統等方面的影響因素,當大量突發的資料到達時,Web伺服器無法完全及時處理所有的請求,造成應答滯後、請求丟失等,嚴重的導致一些資料包因延時而重發,使傳輸線路和伺服器的負擔再次增加。傳統的方法是提高Web 伺服器的CPU 處理速度和增加記憶體容量等硬體辦法但無論如何增加Web 伺服器硬體效能,均無法滿足日益增加的對使用者的訪問服務能力。
面對日漸增加的Web 訪問服務要求,必須對Web 伺服器按一定策略進行負載分配。利用負載均衡[1]的技術,按照一定策略將Web 訪問服務分配到幾臺伺服器上,負載處理對使用者透明,整體上對外如同一臺Web 伺服器為使用者提供Web服務。
2 Web負載均衡結構
2.1 負載均衡
負載是一個抽象的概念,是表示系統繁忙程度,系統在一段時間空閒,該系統負載輕,系統在一段時間空忙,該系統負載重,影響系統負載的各種因數較多如果存在很多的資料包同時通過網路連向一臺Web伺服器,也就是網路的速度比網路所連線的裝置速度快的情況下,系統負載不斷增加,直到最大。
目前提高Web 伺服器效能,使其具有較強負載能力,主要有兩種處理思想[2]:
1)單機思想
不斷升級伺服器硬體效能,每當負載增加,伺服器隨之升級。這隨之將帶來一些問題,首先,伺服器向高檔升級,花費資金較多;其次,升級頻繁,機器切換造成服務中斷,可能會導致整個服務中斷;最後,每種架構的伺服器升級總有一個極限限制。
2)多機思想
使用多臺伺服器提供服務,通過一定機制使它們共同分擔系統負載,對單一的伺服器沒有太高的效能要求,系統負載增加,可以多增加伺服器來分擔。對使用者而言,整個系統彷彿是一臺單一的邏輯伺服器,這樣的系統能夠提供較強的可擴充套件性和較好的吞吐效能。
為了適應當前急劇增長的Web訪問,有別於傳統的單機思想,解決單機思想帶來的一系列問題,本文提出了一種基於權值的策略分配負載。
2.2 負載均衡實現裝置[2]
目前實現負載均衡需要兩類的裝置:伺服器和分配器。
1)伺服器(Server)
為使用者提供真正的服務,也就是指給使用者提供負載均衡服務的計算機裝置,有關該裝置的一些效能資料是負載均衡的主要依據之一。
2)分配器(Dispatcher)
由使用者瀏覽器、Web 伺服器組成兩層結構Web 系統[2],如圖1所示,實際是基於客戶端的負載均衡。

圖1
負責給使用者服務分配伺服器,分配器的主要功能是根據客戶和伺服器的各種情況(這些情況要能反映伺服器的負載狀況或效能狀況)通過一定的演算法進行調動和分配工作,從而提高由伺服器整體構成的網站的穩定性、響應能力。它主要是集中所有的HTTP 請求,然後分配到多臺Web伺服器上處理,來提高系統的處理效率。
2.3 負載均衡系統結構
2.3.1 兩層結構的負載均衡系統
在伺服器上執行一個特定的程式,該程式相當一個客戶端,它定期的收集伺服器相關效能引數,如CPU、I/O、記憶體等動態資訊,根據某種策略,確定提供最佳服務的伺服器,將應用請求轉發給它。如果採集負載資訊程式發現伺服器失敗,則找其它伺服器作為服務選擇。這是一種動態負載均衡技術,但是每臺伺服器上必須安裝特定的客戶端程式,同時,為保證應用程式的透明性,需要對每個應用進行修改,能夠將訪問請求通過該客戶端程式轉發到其它伺服器上,重定向方式進行,修改每一個應用程式,工作量十分大。
2.3.2 三層結構的負載均衡系統
由使用者瀏覽器、負載均衡和Web伺服器組成三層結構Web系統[2],如圖2所示。實際是基於伺服器的負載均衡。

圖2
如果將基於客戶端的負載均衡中客戶端的負載均衡部分移植到一箇中間平臺,形成一個應用伺服器,構成請求、負載均衡和伺服器的三層結構,客戶端應用不需要做特殊修改,透明的中間層將請求均衡的分佈到不同的伺服器。
據伺服器直接連到Internet 與否有兩種多Web 伺服器結構:隔離式(Separation) 和非隔離式(Unseparation)。隔離式是伺服器不直接連到Internet,如圖3所示,非隔離式是伺服器直接連到Internet,如圖4所示。

圖3

圖4
隔離式中只有負載均衡器對外有一個IP 地址,所有的請求由負載均衡器分配到不同的Web Server,所有Web Server 的返回結果也經過負載均衡器傳回給使用者。非隔離式中每一臺Web Server 都有一個IP地址,使用者請求經過負載均衡器分配到Web Server,而請求的應答不經過負載均衡器,直接傳回使用者。為了減輕均衡器的負載,本文中採用了三層結構中的隔離方式。
2.4 負載均衡實現的方法
Web 負載均衡常見演算法有[3]:迴圈排程演算法(Round-Robin Scheduling)、加權迴圈排程演算法(Weighted Round-Robin Scheduling) 、最小連線排程演算法(Least-Connection Scheduling)、目標地址雜湊排程演算法(Destination Hashing Scheduling)、源地址雜湊排程演算法(Source Hashing Scheduling)。
本文采用基於權值的排程演算法,也就是說權值大的伺服器優先得到排程,本文在實現時是基於靜態的權值,就是在開始的時候給每一個伺服器配置一個預設的權值。當然也可以根據實際執行情況再對每一個伺服器的權值進行調整。但是這需要實時的蒐集每一個伺服器的資訊,如伺服器的記憶體實用情況,響應速度等一些資訊。
3 Web伺服器叢集環境配置與測試[4][6][9]
3.1 搭建環境
3.1.1 軟硬體環境的搭建
(1)伺服器有4臺,一臺安裝apache,三臺安裝tomcat。
(2)伺服器的作業系統都是Windows XP。
(3)其中安裝apache的伺服器充當負載均衡器,其它三臺是給使用者真正服務的伺服器。
(4)IP配置,一臺安裝apache的IP為219.218.22.130,三臺安裝tomcat的伺服器IP分別為 219.218.22.131/132/133。
3.1.2 軟體的安裝與配置
1)安裝tomcat的伺服器的配置
(1)在三臺安裝tomcat的伺服器上安裝jdk。
(2)配置jdk的安裝路徑,在環境變數path中加入jdk的bin路徑,新建環境變數JAVA_HOME指向jdk的安裝路徑。
(3)在三臺要安裝tomcat的伺服器上分別安裝tomcat,除錯三個tomcat到能夠正常啟動。
(4)tomcat的預設WEB服務埠是8080,預設的模式是單獨服務,我配置的三個tomcat的Web服務埠修改為7080/8888 /9999。
修改位置為tomcat的安裝目錄下的conf/server.xml在檔案中找到下面的語句:
<Connector port="8080" maxHttpHeaderSize="8192" maxThreads="150" minSpareThreads="25" maxSpareThreads= "75" enableLookups="false" redirectPort="8443" acceptCount= "100”connectionTimeout="20000" disableUploadTimeout= "true" />
只需改動Port=”8080”為上面提到的埠號就行,對安裝tomcat的三個伺服器這個檔案做改動。
2)負載均衡伺服器配置1
(1)在那臺要安裝apache的伺服器上安裝apache,我的安裝路徑為預設C:\Program Files\Apache Group\Apache2。
(2)安裝後測試apache能否正常啟動,除錯到能夠正常啟動http://219.218.22.130。
(3)下載jk2.0.4後解壓縮檔案。
(4)將解壓縮後的目錄中的modules目錄中的mod_jk2.so檔案複製到apache的安裝目錄下的modules目錄中。
(5)修改apache的安裝目錄中的conf目錄的配置檔案httpd.conf,在檔案中LoadModule模組配置資訊的最後加上一句 LoadModule jk2_modules/mod_jk2.so。
(6)分別修改三個tomcat的配置檔案conf/server.xml在檔案中找到下面的語句<Enginename=”Standalone” defaultHost=”localhost” jvmRoute=”jvm1”>只需改動jvmRoute的值,在這裡分別改為tomcat1,tomcat2和tomcat3。
3)均衡伺服器的配置2
在apache的安裝目錄中的conf目錄下建立檔案workers2.propertie,寫入檔案內容如下:
#fine the communication channel
[channel.socket:219.218.22.130:8009]
Info=Ajp13 forwarding over socket
#配置第一個伺服器
tomcatId=tomcat1 #要和tomcat的配置檔案server.xml中的jvmRoute="tomcat1"名稱一致debug=0 lb_factor=1#負載平衡因子,數字越大請求被分配的機率越高。類似地再配置其它的伺服器。最後加上這樣的句子info=Status worker,displays runtime information [uri:/jkstatus.jsp] info=Display status information and checks the c onfig file for changes. Group =status: [uri:/*]
info=Map the whole Webapp debug=0
4)安裝tomcat的伺服器配置2
在三個tomcat的安裝目錄中的webapps建立相同的應用,我和應用目錄名為GroupTest,在三個應用目錄中建立相同 WEB-INF目錄和頁面index.jsp,index.jsp的頁面的主要內容是打印出為客戶服務的伺服器的IP地址和埠號,當然還有其它一些內容,最主要的是這些內容,這樣當我們在測試的時候也方便地知道為其提供服務的服務到底是哪一個伺服器,這個資訊是非常重要的,這樣我們能看出當大量使用者訪問的時候我們能知道負載分配的情況。
5)叢集配置
分別修改三個tomcat的配置檔案conf/server.xml找到以下面語句開始的地方:
<!-- <Cluster className="org.apache.c
atalina.cluster.tcp.SimpleTcpCluster”
<ClusterListener className="org.apache.catalina.cluster. session.ClusterSessionListener"/> </Cluster> --> 將最上,最下面的一行都改為<!-- modify by whh -->就可以了。
然後再在Conf目錄下建立jk2.properties檔案,寫入下面一行,其中埠為相應的channelSocket.port=8009
6)叢集應用配置
對於要進行負載和叢集的tomcat目錄下的webapps中的應用中的WEB-INF中的web.xml檔案要新增如下一句配置<distribut
able/>到此為止配置完成剩下的就是測試
3.2 環境的測試
(1)首選分別測試每個tomcat的啟動是否正常。
http://219.218.22.131:7080
http://219.218.22.132:8888  
http://219.218.22.133:9999
(2)其次測試一下負載均衡伺服器http://219.218.22.130/jkstatus.jsp 再訪問一下http://219.218.22. 130/GroupTest/index.jsp以上測試成功,這說明負載均衡配置已經成功。
3.3 集群系統負載均衡測試
利用多個客戶端訪問頁面index.jsp[5][7][8],能夠在客戶端的瀏覽器中看到為其提供服務的伺服器的IP地址和埠,以及其它一些資訊。這說明,在併發請求的情況下,叢集能夠將請求進行分發,達到了負載平衡的目的。下面是本實驗測試的一些資料,詳細內容如表格所示:

客戶端
數量 伺服器A,B,C
權值 伺服器A,B,C
處理請求數量
3 0.5,0.8,0.3 1,2,0
4 0.5,0.8,0.3 1,2,1
7 0.5,0.8,0.3 2,3,2
12 0.5,0.8,0.3 4,6,2
19 0.5,0.8,0.3 6,9,4

3.4 集群系統負載均衡測試分析
由上面的表格可知,當增加客戶端的訪問數量的時候我們可以發現設定權值在的伺服器處理的請求個數多,這說明這個負載均衡系統達到了我們的預定目標,這樣的系統也適用於叢集中的伺服器處理能力不一致的情況。此係統具有良好的適應能力,非常好地解決了在單機思想下無法解決的系統瓶頸問題。
3.5 本系統的不足之處
本系統在除了有單機思想不能比擬的優點之處,也有自己的不足之處,比如本系統不能根據每個伺服器的實際執行情況動態地調整叢集中的每一個伺服器權值,因此當有大量的使用者同時訪問時並不能真正的做到絕對的負載均衡,只能相對比較均勻地將負載分配到叢集中的每一個伺服器中去。所以本系統也有待於進一步優化,比如實時地蒐集每一伺服器的資訊,做到動態地調整每一個伺服器的權值,有關係統的進一步優化問題,將做進一步的研究。
4 結束語
本文提出了一種基於三層結構的Web伺服器叢集負載均衡的設計方案,通過對系統進行測試,本系統能夠達到負載均衡的目的,實現了本系統設計的初衷,能夠適應目前Internet 的發展需求。 [/size]