型的企業應用天天都須要承受巨大的訪問量,在着巨大訪問量的背後有數臺服務器支撐着,若是一臺服務器崩潰了,那麼其餘服務器可使企業應用繼續運行,用戶對服務器的運做是透明化的,如何實現這種透明化呢?由以下問題須要解決。
一.Session的複製
二.如何將請求發送到正常的服務器
針對以上問題,可使用羣集和負載均衡來解決,總體架構以下:
php
中間由一臺服務器作負載均衡(Load Balancer),它將全部請求,根據必定的負載均衡規則發送給指定的羣集服務器(Cluster),羣集服務器擁有着相同的狀態和相同的應用程序,而且他們的Session是相互複製的,這樣,無論訪問哪臺服務器都具備相同的結果,即便一臺服務器崩潰掉之後,能夠由其餘集羣服務器繼續負責應用程序的運行。
Tomcat中如何配置羣集咱們假設有以下場景,一臺負載均衡服務器負責請求的均衡,羣集服務器A和羣集服務器B組成一個羣集,當某個羣集服務器崩潰後,另一臺繼續負責應用程序的運行。
一. 配置Tomcat5.5.12羣集服務器A
修改Tomcat配置文件server.xml
1.羣集服務器A的端口號與B不衝突,即便Server Port,Connector,Coyote/JK2 AJP Connector的端口號惟一
2.在Host元素下增長如下內容:
<Cluster className="org.apache.catalina.cluster.tcp.SimpleTcpCluster"
managerClassName="org.apache.catalina.cluster.session.DeltaManager"
expireSessi
useDirtyFlag="true"
notifyListeners>
<!--每一個羣集服務器都須要有相同的Membership配置-->
<Membership
className="org.apache.catalina.cluster.mcast.McastService"
mcastAddr="228.0.0.4"
mcastPort="45564"
mcastFrequency="500"
mcastDropTime="3000"/>
<!--tcpListenAddress:本機IP地址服務器將此地址廣播給其餘羣集服務器-->
<Receiver
className="org.apache.catalina.cluster.tcp.ReplicationListener"
tcpListenAddress="10.10.13.145"
tcpListenPort="4001"
tcpSelectorTimeout="100"
tcpThreadCount="6"/>
<Sender
className="org.apache.catalina.cluster.tcp.ReplicationTransmitter"
replicati
ackTimeout="15000"
waitForAck="true"/>
<Valve className="org.apache.catalina.cluster.tcp.ReplicationValve"
filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"/>
<Deployer className="org.apache.catalina.cluster.deploy.FarmWarDeployer"
tempDir="/tmp/war-temp/"
deployDir="/tmp/war-deploy/"
watchDir="/tmp/war-listen/"
watchEnabled="false"/>
<ClusterListener className="org.apache.catalina.cluster.session.ClusterSessionListener"/>
</Cluster>
3.修改Web應用程序配置文件web.xml
在web.xml文件中<web-app>元素下增長如下內容:
<!--此應用將與羣集服務器複製Session-->
<distributable/>
二. 配置Tomcat5.5.12羣集服務器B
與羣集服務器A配置基本相同,惟一不一樣的地方就是server.xml文件中
<Receiver
className="org.apache.catalina.cluster.tcp.ReplicationListener"
tcpListenAddress="10.10.13.145"
tcpListenPort="4002"
tcpSelectorTimeout="100"
tcpThreadCount="6"/>
tcpListenAddress應爲本機地址,若是兩臺羣集服務器在一臺機器上,則端口號要不一樣
注意:B的其餘端口不要與A衝突。
三. 羣集服務器具體配置結果
Mcast*用於廣播,全部羣集服務器須要填寫相同的配置
tcpListen*本機的IP,羣集服務器啓動時,會將本身的IP和端口號廣播出去,其餘羣集服務器收到後,響應廣播發出者。
四. 測試羣集
啓動羣集服務器A,再啓動羣集服務器B會顯示羣集服務器的信息,表示羣集服務器配置成功
五.配置負載均衡服務器Apache2.2.3
如今雖然羣集已經有了相同的狀態,但須要不一樣的IP地址才能訪問到服務器A與B,如今咱們配置一臺負載均衡服務器來實現統一的入口訪問,和負載的均衡。
下載Apache服務器2.2.3。
修改httpd.conf文件
將如下Module的註釋去掉
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule proxy_http_module modules/mod_proxy_http.so
並增長如下元素
ProxyRequests Off
ProxyPass /helloworld balancer://mycluster stickysession=jsessionid nofailover=On
<Proxy balancer://mycluster>
BalancerMember http://10.10.13.145:9080/helloworld
BalancerMember http://10.10.13.145:10080/helloworld smax=1 loadfactor=20
</Proxy>
<Location /balancer-manager>
SetHandler balancer-manager
Order Deny,Allow
Deny from all
Allow from all
</Location>
<Location /server-status>
SetHandler server-status
Order Deny,Allow
Deny from all
Allow from all
</Location>
其中
ProxyPass /helloworld balancer://mycluster stickysession=jsessionid nofailover=On
<Proxy balancer://mycluster>
BalancerMember http://10.10.13.145:9080/helloworld
BalancerMember http://10.10.13.145:10080/helloworld smax=1 loadfactor=20
</Proxy>
ProxyPass爲代理轉發的Url,即將全部訪問/helloworld的請求轉發到羣集balancer://mycluster
BalancerMember爲羣集的成員,即羣集服務器A或B,負載均衡服務器會根據均衡規則來將請求轉發給BalancerMember。
(能夠同時配置幾個站點)
配置好後,啓動Apahce服務器,訪問localhost/hellworld就會看到羣集服務器中應用返回的結果。恭喜你,負載均衡和羣集已經配置成功了。 css
1、集羣和負載均衡的概念html
(一)集羣的概念java
集羣(Cluster)是由兩臺或多臺節點機(服務器)構成的一種鬆散耦合的計算節點集合,爲用戶提供網絡服務或應用程序(包括數據庫、Web服務和文件服務等)的單一客戶視圖,同時提供接近容錯機的故障恢復能力。集羣系統通常經過兩臺或多臺節點服務器系統經過相應的硬件及軟件互連,每一個羣集節點都是運行其本身進程的獨立服務器。這些進程能夠彼此通訊,對網絡客戶機來講就像是造成了一個單一系統,協同起來向用戶提供應用程序、系統資源和數據。除了做爲單一系統提供服務,集羣系統還具備恢復服務器級故障的能力。集羣系統還可經過在集羣中繼續增長服務器的方式,從內部增長服務器的處理能力,並經過系統級的冗餘提供固有的可靠性和可用性。
(二)集羣的分類
一、高性能計算科學集羣:
以解決複雜的科學計算問題爲目的的IA集羣系統。是並行計算的基礎,它能夠不使用專門的由十至上萬個獨立處理器組成的並行超級計算機,而是採用經過高速鏈接來連接的一組1/2/4 CPU的IA服務器,而且在公共消息傳遞層上進行通訊以運行並行應用程序。這樣的計算集羣,其處理能力與真正超級並行機相等,而且具備優良的性價比。
二、負載均衡集羣:
負載均衡集羣爲企業需求提供更實用的系統。該系統使各節點的負載流量能夠在服務器集羣中儘量平均合理地分攤處理。該負載須要均衡計算的應用程序處理端口負載或網絡流量負載。這樣的系統很是適合於運行同一組應用程序的大量用戶。每一個節點均可以處理一部分負載,而且能夠在節點之間動態分配負載,以實現平衡。對於網絡流量也如此。一般,網絡服務器應用程序接受了大量入網流量,沒法迅速處理,這就須要將流量發送給在其它節點。負載均衡算法還能夠根據每一個節點不一樣的可用資源或網絡的特殊環境來進行優化。
三、高可用性集羣:
爲保證集羣總體服務的高可用,考慮計算硬件和軟件的容錯性。若是高可用性羣集中的某個節點發生了故障,那麼將由另外的節點代替它。整個系統環境對於用戶是一致的。web
實際應用的集羣系統中,這三種基本類型常常會發生混合與交雜。算法
(三)典型集羣
科學計算集羣:
一、Beowulf
當談到 Linux 集羣時,許多人的第一反映是 Beowulf。那是最著名的 Linux科學軟件集羣系統。實際上,它是一組適用於在 Linux 內核上運行的公共軟件包的通稱。其中包括流行的軟件消息傳遞 API,如「消息傳送接口」(MPI) 或「並行虛擬機」(PVM),對 Linux 內核的修改,以容許結合幾個以太網接口、高性能網絡驅動器,對虛擬內存管理器的更改,以及分佈式進程間通訊 (DIPC) 服務。公共全局進程標識空間容許使用 DIPC 機制從任何節點訪問任何進程。
二、MOSIX
Beowulf相似於給系統安裝的一個支持集羣的外掛軟件,提供了應用級的集羣能力。而MOSIX是完全修改Linux的內核,從系統級提供了集羣能力,它對應用而言是徹底透明的,原有的應用程序,能夠不經改動,就能正常運行在MOSIX系統之上。集羣中的任何節點均可以自由地加入和移除,來接替其它節點的工做,或是擴充系統。MOSIX 使用自適應進程負載均衡和內存引導算法使總體性能最大化。應用程序進程能夠在節點之間實現遷移,以利用最好的資源,這相似於對稱多處理器系統能夠在各個處理器之間切換應用程序。因爲MOSIX經過修改內核來實現集羣功能,因此存在兼容性問題,部分系統級應用程序將沒法正常運行。數據庫
負載均衡/高可用性集羣
三、LVS(Linux Virtual Server)
這是一個由國人主持的項目。
它是一個負載均衡/高可用性集羣,主要針對大業務量的網絡應用(如新聞服務、網上銀行、電子商務等)。
LVS是創建在一個主控服務器(一般爲雙機)(director)及若干真實服務器(real-server)所組成的集羣之上。real-server負責實際提供服務,主控服務器根據指定的調度算法對real-server進行控制。而集羣的結構對於用戶來講是透明的,客戶端只與單個的IP(集羣系統的虛擬IP)進行通訊,也就是說從客戶端的視角來看,這裏只存在單個服務器。
N54537Real-server能夠提供衆多服務,如ftp, http, dns, telnet, nntp, smtp 等。主控服務器負責對Real-Server進行控制。客戶端在向LVS發出服務請求時,Director會經過特定的調度算法來指定由某個Real-Server來應答請求,而客戶端只與Load Balancer的IP(即虛擬IP,VIP)進行通訊。apache
其餘集羣:
如今集羣系統可謂五花八門,絕大部分的OS開發商,服務器開發商都提供了系統級的集羣產品,最典型的是各種雙機系統,還有各種科研院校提供的集羣系統。以及各種軟件開發商提供的應用級別的集羣系統,如數據庫集羣,Application Server 集羣,Web Server集羣,郵件集羣等等。windows
(四)負載均衡瀏覽器
一、概念
因爲目前現有網絡的各個核心部分隨着業務量的提升,訪問量和數據流量的快速增加,其處理能力和計算強度也相應地增大,使得單一的服務器設備根本沒法承擔。在此狀況下,若是扔掉現有設備去作大量的硬件升級,這樣將形成現有資源的浪費,並且若是再面臨下一次業務量的提高時,這又將致使再一次硬件升級的高額成本投入,甚至性能再卓越的設備也不能知足當前業務量增加的需求。
針對此狀況而衍生出來的一種廉價有效透明的方法以擴展示有網絡設備和服務器的帶寬、增長吞吐量、增強網絡數據處理能力、提升網絡的靈活性和可用性的技術就是負載均衡(Load Balance)。
二、特色和分類
負載均衡(Server Load Balance)通常用於提升服務器的總體處理能力,並提升可靠性,可用性,可維護性,最終目的是加快服務器的響應速度,從而提升用戶的體驗度。
負載均衡從結構上分爲本地負載均衡(Local Server Load Balance)和地域負載均衡(Global Server Load Balance)(全局負載均衡),一是指對本地的服務器羣作負載均衡,另外一是指對分別放置在不一樣的地理位置、有不一樣的網絡及服務器羣之間做負載均衡。
地域負載均衡有如下的特色:
(1)解決網絡擁塞問題,服務就近提供,實現地理位置無關性
(2)對用戶提供更好的訪問質量
(3)提升服務器響應速度
(4)提升服務器及其餘資源的利用效率
(5)避免了數據中心單點失效
三、負載均衡技術主要應用
(1)DNS負載均衡 最先的負載均衡技術是經過DNS來實現的,在DNS中爲多個地址配置同一個名字,於是查詢這個名字的客戶機將獲得其中一個地址,從而使得不一樣的客戶訪問不一樣的服務器,達到負載均衡的目的。DNS負載均衡是一種簡單而有效的方法,可是它不能區分服務器的差別,也不能反映服務器的當前運行狀態。
(2)代理服務器負載均衡 使用代理服務器,能夠將請求轉發給內部的服務器,使用這種加速模式顯然能夠提高靜態網頁的訪問速度。然而,也能夠考慮這樣一種技術,使用代理服務器將請求均勻轉發給多臺服務器,從而達到負載均衡的目的。
(3)地址轉換網關負載均衡 支持負載均衡的地址轉換網關,能夠將一個外部IP地址映射爲多個內部IP地址,對每次TCP鏈接請求動態使用其中一個內部地址,達到負載均衡的目的。
(4)協議內部支持負載均衡 除了這三種負載均衡方式以外,有的協議內部支持與負載均衡相關的功能,例如HTTP協議中的重定向能力等,HTTP運行於TCP鏈接的最高層。
(5)NAT負載均衡 NAT(Network Address Translation 網絡地址轉換)簡單地說就是將一個IP地址轉換爲另外一個IP地址,通常用於未經註冊的內部地址與合法的、已獲註冊的Internet IP地址間進行轉換。適用於解決Internet IP地址緊張、不想讓網絡外部知道內部網絡結構等的場合下。
(6)反向代理負載均衡 普通代理方式是代理內部網絡用戶訪問internet上服務器的鏈接請求,客戶端必須指定代理服務器,並將原本要直接發送到internet上服務器的鏈接請求發送給代理服務器處理。反向代理(Reverse Proxy)方式是指以代理服務器來接受internet上的鏈接請求,而後將請求轉發給內部網絡上的服務器,並將從服務器上獲得的結果返回給internet上請求鏈接的客戶端,此時代理服務器對外就表現爲一個服務器。反向代理負載均衡技術是把未來自internet上的鏈接請求以反向代理的方式動態地轉發給內部網絡上的多臺服務器進行處理,從而達到負載均衡的目的。
(7)混合型負載均衡 在有些大型網絡,因爲多個服務器羣內硬件設備、各自的規模、提供的服務等的差別,咱們能夠考慮給每一個服務器羣採用最合適的負載均衡方式,而後又在這多個服務器羣間再一次負載均衡或羣集起來以一個總體向外界提供服務(即把這多個服務器羣當作一個新的服務器羣),從而達到最佳的性能。咱們將這種方式稱之爲混合型負載均衡。此種方式有時也用於單臺均衡設備的性能不能知足大量鏈接請求的狀況下。
2、搭建集羣和實現負載平衡
(一)前期準備
個人系統用的是windowsXP專業版,我要作的是,用一個apache和多個(這裏以兩個做爲示例)tomcat,經過jk方式,構造一個集羣。如下是要首先準備的東西:
一、jdk,我用的版本是jdk1.5.0_06,下載地址是http://192.18.108.216/ECom/EComTicketServlet/BEGIND597A309654D73D910E051D73D539D5F/-2147483648/2438196255/1/852050/851882/2438196255/2ts+/westCoastFSEND/jdk-1.5.0_13-oth-JPR/jdk-1.5.0_13-oth-JPR:3/jdk-1_5_0_13-windows-i586-p.exe
二、apache,我用的版本是2.2.4,下載地址是http://apache.justdn.org/httpd/binaries/win32/apache_2.2.4-win32-x86-openssl-0.9.8d.msi
三、tomcat,我用的版本是5.5的解壓版本,這裏要注意:不能用安裝的版本,由於一臺機器上裝兩個同樣的tomcat,是會出錯誤的。下載地址是http://apache.mirror.phpchina.com/tomcat/tomcat-5/v5.5.25/bin/apache-tomcat-5.5.25.zip
四、jk,這個jk的版本,原本有兩個的,可是版本2已經被廢棄掉了,目前可用的jk版本是1.2.25。每一個apache的版本,都會有一個特定的jk與之對應,因此這裏要用的jk也必須是爲apache-2.2.4開發的那個才行。它的下載地址是http://www.apache.org/dist/tomcat/tomcat-connectors/jk/binaries/win32/jk-1.2.25/mod_jk-apache-2.2.4.so
有了這四樣東西,咱們就能夠開始作集羣了。
(二)安裝
一、相信須要看這篇文章的人,JDK的安裝必定不會陌生,這裏不在贅述。只是須要提醒一下:環境變量別忘記配置了。
二、安裝apache也沒有什麼難度,就是在安裝過程當中要配置域名、網址和管理員郵箱之類的信息,這個信息徹底能夠按照提示,而後修改下填入便可,以後想修改的話直接到配置文件中改就好了。除了這個地方,還要保證機器上的80端口沒有被其餘程序佔用。至於安裝路徑,徹底取決於我的愛好。其餘的默認就好了。安裝成功後,系統右下角的托盤區會有個圖標,咱們能夠經過這個啓動apache,若是那個小紅點變成綠色,說明服務已經正常啓動了(若是服務沒有啓動起來,說明安裝過程當中的配置有錯誤,建議卸載後重裝)。若是按照默認,端口是80的話,那打開瀏覽器,輸入:http://localhost/ ,應該能夠看到 " It works 「的字樣。這樣就能夠進入下一步了。
三、解壓縮tomcat,記得要作兩份。這裏不妨將兩個tomcat命名爲:tomcat-5.5.25_1和tomcat-5.5.25_2,其實這兩個文件夾中的東西是徹底同樣的。可是我爲了在同一臺機器上作集羣,那就要保證兩個tomcat運行起來不會在端口上起衝突。進入tomcat-5.5.25_1/conf目錄,用文本編輯器打開並修改server.xml,將該tomcat的默認8080端口改成8088(其實不必改,我改這個是由於我機器上還有其餘tomcat佔用着8080端口)。而後進入tomcat-5.5.25_2/conf目錄,一樣將8080修改掉,至於改爲多少沒多大關係,只要不佔用其餘程序的端口,應該不會出什麼問題。這樣,tomcat就算安裝好了。
四、jk這東西是一個鏈接模塊,不用安裝,直接將mod_jk-apache-2.2.4.so這個文件拷貝到apache安裝目錄下的modules文件夾下面就好了。
這樣,安裝完成,下面開始配置。
(三)配置
這個地方纔是搭建集羣的關鍵所在,我也會盡個人可能寫的詳細點。
一、配置tomcat
爲防止衝突,進入第二個tomcat主目錄,而後進入conf目錄,打開server.xml修改配置。主要是修改端口,我這裏把全部的端口信息,都在原有基礎上加1000,即原端口是8009,我改成9009。固然,你沒必要和我同樣,只要保證不衝突就OK!這些配置在apache的配置中可能會用到。
二、配置apache
(1)進入apache的主目錄,而後進入conf文件夾,用文本編輯器打開httpd.conf,在該文件末尾加上以下幾行:
### 加載 mod_jk 模塊
LoadModule jk_module modules/mod_jk-apache-2.2.4.so
### 配置 mod_jk
JkWorkersFile conf/workers.properties #加載集羣中的workers
JkMountFile conf/uriworkermap.properties #加載workers的請求處理分配文件
JkLogFile logs/mod_jk.log #指定jk的日誌輸出文件
JkLogLevel warn #指定日誌級別
(2)不要改變目錄,新建一個文件:workers.properties,該文件用來配置web容器的信息。該文件的內容以下:
# worker列表
worker.list=controller, status
#第一個server的配置,server名爲s1
#ajp13 端口號,在tomcat下server.xml配置,默認8009
worker.s1.port=8009
#tomcat的主機地址,如不爲本機,請填寫ip地址
worker.s1.host=localhost
worker.s1.type=ajp13
#server的加權比重,值越高,分得的請求越多
worker.s1.lbfactor=1
#第二個server的配置,server名爲s2
worker.s2.port=9009
worker.s2.host=localhost
worker.s2.type=ajp13
worker.s2.lbfactor=1
#server名爲controller,用於負載均衡
worker.controller.type=lb
worker.retries=3 #重試次數
#指定分擔請求的server列表,用逗號分隔
worker.controller.balanced_workers=s1,s2
#設置用於負載均衡的server的session能否共享 有很多文章說設置爲1是能夠的,可是我是設置爲0才能夠的
worker.controller.sticky_session=0
#worker.controller.sticky_session_force=1
worker.status.type=status
(3)不要改變目錄,新建一個文件:uriworkermap.properties,文件內容以下:
/*=controller #全部請求都由controller這個server處理
/jkstatus=status #全部包含jkstatus請求的都由status這個server處理
!/*.gif=controller #全部以.gif結尾的請求都不禁controller這個server處理,如下幾個都是同樣的意思
!/*.jpg=controller
!/*.png=controller
!/*.css=controller
!/*.js=controller
!/*.htm=controller
!/*.html=controller
這裏的"!」相似於java中的"!」,是「非」的意思。
這樣,apache一塊就配置好了。
三、再修改tomcat配置:這裏兩個tomcat都要配置。
仍然是打開第一步中的那個server.xml文件,找到<Engine name="Catalina" defaultHost="localhost">這一行,在裏面加上一句:jvmRoute="s1",即把該句改成:<Engine name="Catalina" defaultHost="localhost" jvmRoute="s1">。這裏的s1就是第二步中配置的用於負載均衡的server的名稱。若是該tomcat的端口是第二步中s1用的端口,那這裏就寫s1,第二個tomcat就應該是s2了。
這樣,配置就完成了。
(四)運行
進入兩個tomcat的bin目錄,執行兩個tomcat的startup.bat啓動這兩個tomcat,而後將apache從新啓動後,運行起來看看效果吧。若是不出意外,兩個tomcat的窗口應該是你一次我一次的打印日誌信息了,並且此時session也是共享了的。
到這裏,集羣搭建好了,負載均衡也實現了。