电竞比分网-中国电竞赛事及体育赛事平台

分享

基于Apache的Tomcat負(fù)載均衡和集群

 londonKu 2013-01-07

反向代理負(fù)載均衡 (Apache+JK+Tomcat) 
使用代理服務(wù)器可以將請(qǐng)求轉(zhuǎn)發(fā)給內(nèi)部的Web服務(wù)器,讓代理服務(wù)器將請(qǐng)求均勻地轉(zhuǎn)發(fā)給多臺(tái)內(nèi)部Web服務(wù)器之一上,從而達(dá)到負(fù)載均衡的目的。這種代理方式與普通的代理方式有所不同,標(biāo)準(zhǔn)代理方式是客戶使用代理訪問(wèn)多個(gè)外部Web服務(wù)器,而這種代理方式是多個(gè)客戶使用它訪問(wèn)內(nèi)部Web服務(wù)器,因此也被稱為反向代理模式。 

為什么要配置Tomcat 負(fù)載均衡和集群:

負(fù)載均衡:負(fù)載均衡能處理高并發(fā)量的請(qǐng)求。

Tomcat 集群:Tomcat 集群配合負(fù)載均衡可以是系統(tǒng)達(dá)到高可用性,即任何一臺(tái)服務(wù)器不可用,自動(dòng)重新連接后,能保持session 數(shù)據(jù)一致,不需要重新輸入密碼。

簡(jiǎn)單原理介紹:

1.apatche 與tomcat 的之間的聯(lián)系由jk 完成,用的是ajp協(xié)議。每個(gè)tomcat 都在監(jiān)聽(tīng)ajp端口。默認(rèn)的 AJP Connector 的端口是 8009 。 

2.配置了集群的 tomcat 之間通過(guò) tcp 協(xié)議通信復(fù)制 session,當(dāng)然要在tomcat 應(yīng)用中的web.xml 文件中加入<distributable/>或<Context distributable="true" /> ,標(biāo)志著要復(fù)制session。
復(fù)制session 是為了在某個(gè)服務(wù)器正在被請(qǐng)求時(shí)宕機(jī),請(qǐng)求由apache 通過(guò)jk 轉(zhuǎn)發(fā)到其他tomcat 服務(wù)器時(shí),session 中的信息丟失采取的一中保持session 的方式,還有其他的解決方案,如把session 存到數(shù)據(jù)庫(kù)中。
3.jk 把請(qǐng)求分配給某個(gè)tomcat 服務(wù)器遵循著不同的原則,這里我們使用的是負(fù)載均衡。在 workers.properties 中定義了很多worker ,如果worker 的type 把定義成 lb,就表示這個(gè)worker 是負(fù)載均衡worker ,他知道怎樣提供輪詢來(lái)分配request 。而負(fù)載均衡也分很多平衡的方式,采用哪種方式?jīng)Q定于屬性worker.balancer.method ;下面具體描述不同的負(fù)載均衡方
式 (默認(rèn)的是R 方式)。
worker.balancer.method=Request (簡(jiǎn)寫R ):負(fù)載均衡worker 將根據(jù)每個(gè)tomcat 服務(wù)器上處理的request 數(shù)來(lái)尋找最佳的tomcat 服務(wù)器。這種方式適合絕大數(shù)application 。
worker.balancer.method=Session (簡(jiǎn)寫 S ):負(fù)載均衡worker 根據(jù)各個(gè)tomcat 上 session的數(shù)量來(lái)尋找最佳tomcat ,但是負(fù)載均衡worker 并沒(méi)有狀態(tài),所以不知道session 個(gè)數(shù),所以把沒(méi)有session cookie 的請(qǐng)求或url 中沒(méi)有encode sessionid 的請(qǐng)求當(dāng)作new session 。
worker.balancer.method= Traffic (簡(jiǎn)寫T ):負(fù)載均衡worker 根據(jù)jk 和tomcat 直接的網(wǎng)絡(luò)狀況來(lái)找最佳的tomcat 服務(wù)器。
worker.balancer.method= Busyness (簡(jiǎn)寫B(tài) ):負(fù)載均衡worker 根據(jù)tomcat 的流量選擇流量最少的tomcat 。

1.下載安裝

Apache服務(wù)器:是前端web 服務(wù)器,用來(lái)接收客戶端的請(qǐng)求。下載地址是http://httpd./ (Windows版:httpd-2.2.22-win32-x86-no_ssl.msi

mod_jk.so:是tomcat Connector ,用于把a(bǔ)pache 接收到的請(qǐng)求分發(fā)給tomcat 來(lái)處理。下載地址是http://www./apache-mirror//tomcat/tomcat-connectors/jk/binaries/windows/ JK要與Apache版本對(duì)應(yīng)。JK 分為兩個(gè)版本 1,x 和 2.x ,其中 2.x 并不是最新的版本,它是 JK 的另外一個(gè)分支,后不知何因沒(méi)有繼續(xù)開(kāi)發(fā),因此2.x 版本已經(jīng)廢棄。

Tomcat :也是web 服務(wù)器,但在這里主要充當(dāng)servlet 容器,用來(lái)處理jk 轉(zhuǎn)發(fā)過(guò)來(lái)的請(qǐng)求。下載地址是http://tomcat./

安裝 apache ,并把 mod_jk.2.0.55 解壓后拷貝到 apache 安裝目錄(Apache_HOME)/modules 下面,其實(shí)modules 下面是apache 的各個(gè)功能模塊,可插拔。
安裝各個(gè)tomcat 到不同的主機(jī)上。

2、配置Apache_Home\conf\httpd.conf

在httpd.conf文件的最后一行寫入

include "C:\Program Files\Apache Software Foundation\Apache2.2\conf\mod_jk.conf"

3、配置mod_jk.conf文件

在Apache_Home\conf下建立mod_jk.conf文件。配置內(nèi)容:

復(fù)制代碼
#加載mod_jk Module
LoadModule jk_module modules/mod_jk.so
# 配置 mod_jk
#加載集群中的workers
JkWorkersFile conf/workers.properties
#加載workers的請(qǐng)求處理分配文件
JkMountFile conf/uriworkermap.properties
#指定jk的日志輸出文件
JkLogFile logs/mod_jk.log
#指定日志級(jí)別
JkLogLevel warn
#指定哪些請(qǐng)求交給tomcat處理,"controller"為在 workers.propertise里指定的負(fù)載分配控制器名 
JkMount /*.* controller
復(fù)制代碼

4、配置workers.propertise文件

在Apache_Home\conf下建立workers.propertise文件。

復(fù)制代碼
#server 列表
worker.list=controller,tomcat1,tomcat2
#========tomcat1========
worker.tomcat1.port=8008 #ajp13 端口號(hào),在tomcat下server.xml配置,默認(rèn)8009
worker.tomcat1.host=localhost #tomcat的主機(jī)地址,如不為本機(jī),請(qǐng)?zhí)顚慽p地址
worker.tomcat1.type=ajp13
worker.tomcat1.lbfactor=1 #server的加權(quán)比重,值越高,分得的請(qǐng)求越多
#========tomcat2========
worker.tomcat2.port=8009 #ajp13 端口號(hào),在tomcat下server.xml配置,默認(rèn)8009
worker.tomcat2.host=localhost #tomcat的主機(jī)地址,如不為本機(jī),請(qǐng)?zhí)顚慽p地址
worker.tomcat2.type=ajp13
worker.tomcat2.lbfactor=1 #server的加權(quán)比重,值越高,分得的請(qǐng)求越多
#========controller,負(fù)載均衡控制器========
worker.controller.type=lb #server名為controller,用于負(fù)載均衡
worker.retries=3 #重試次數(shù)
worker.controller.balance_workers=tomcat1,tomcat2
#粘性Session(默認(rèn)是打開(kāi)的) 當(dāng)該屬性值=True(或1)時(shí),代表Session是粘性的,即同一Session在集群中的同一個(gè)節(jié)點(diǎn)上處理,Session不跨越節(jié)點(diǎn)。在集群環(huán)境中,一般將該值設(shè)置為False
worker.controller.sticky_session=false
#設(shè)置用于負(fù)載均衡的server的session可否共享 有不少文章說(shuō)設(shè)置為1是可以的,也有設(shè)置為0才可以的
#worker.controller.sticky_session=1
#worker.controller.sticky_session_force=1
#worker.status.type=status
復(fù)制代碼

5、配置uriworkermap.properties文件

在Apache_Home\conf下建立uriworkermap.properties文件

復(fù)制代碼
#所有請(qǐng)求都由controller這個(gè)server處理
/*=controller
#所有包含jkstatus請(qǐng)求的都由status這個(gè) server處理
#/jkstatus=status
#這里的"!”是“非”的意思。
!/*.gif=controller
!/*.jpg=controller
!/*.png=controller
!/*.css=controller
!/*.js=controller
!/*.htm=controller
!/*.html=controller
復(fù)制代碼

6、修改tomcat1_Home\conf\server.xml配置

Starting Coyote HTTP/1.1 on http-8081 默認(rèn)端口為8080,修改為8081。

<Connector port="8081" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />

JK: ajp13 listening on /0.0.0.0:8009 修改端口必須與workers.propertise文件內(nèi)worker.tomcat1.port=8009一致。

<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

以上為負(fù)載均衡配置完畢!接下來(lái)可以配置Tomcat集群和Session復(fù)制!

需要添加的內(nèi)容(這些代碼在XML中都被注釋掉了,把注釋去掉,然后編輯即可):

復(fù)制代碼
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat2"><!--tomcat1將與tomcat2黏貼session 在這里指定黏貼對(duì)象-->
...
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8">

    <Manager className="org.apache.catalina.ha.session.DeltaManager" 
        expireSessionsOnShutdown="false"
        notifyListenersOnReplication="true" />

    <Channel className="org.apache.catalina.tribes.group.GroupChannel">
        <Membership className="org.apache.catalina.tribes.membership.McastService" 
            address="228.0.0.4"
            port="45564" 
            frequency="500" 
            dropTime="3000" />
        <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver" 
            address="auto"
            port="4000" 
            autoBind="100" 
            selectorTimeout="5000" 
            maxThreads="6" />

        <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
            <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender" />
        </Sender>
        <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector" />
        <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor" />
    </Channel>

    <Valve className="org.apache.catalina.ha.tcp.ReplicationValve" filter="" />
    <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve" />

    <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer" 
        tempDir="/tmp/war-temp/"
        deployDir="/tmp/war-deploy/" 
        watchDir="/tmp/war-listen/" 
        watchEnabled="false" />

    <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener" />
    <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener" />
</Cluster>
...
</Engine>
復(fù)制代碼

Tomcat2的server.xml配置也做相應(yīng)修改,因?yàn)楸疚臏y(cè)試使用同一臺(tái)電腦,所以對(duì)應(yīng)的微做修改端口。Tomcat分布于不同電腦上,不用改端口號(hào)。

復(fù)制代碼
...
<Connector port="8082" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
...
<Connector port="9009" protocol="AJP/1.3" redirectPort="8443" />
...
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1"><!--tomcat2將與tomcat1黏貼session 在這里指定黏貼對(duì)象-->
...
  <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver" 
            address="auto"
            port="4001" 
            autoBind="100" 
            selectorTimeout="5000" 
            maxThreads="6" />
復(fù)制代碼

7、最后要tomcat支持session復(fù)制,必須在web.xml里面加上一個(gè)標(biāo)簽。

<!-- 集群 表明要復(fù)制session,一般放在最后-->
<distributable/>

注意:session黏貼(共享)方面,如果session中存放的為javabean,javabean必須實(shí)現(xiàn)Serializable接口,如果沒(méi)有實(shí)現(xiàn)會(huì)報(bào)錯(cuò)誤 Exception thrown: class java.lang.IllegalArgumentException。

8、測(cè)試

在tomcat2\webapps下建立test文件夾,建立test.jsp文件

<%System.out.println("==============");%>

啟動(dòng)Tomcat1、Tomcat2、Apache。瀏覽器中輸入:http://localhost/test/test.jsp。不停刷新瀏覽器,可以在Tomcat1和2的控制臺(tái)看到=====交替輸出。

結(jié)果:在不同的客戶端發(fā)起請(qǐng)求,請(qǐng)求會(huì)被平均分配給tomcat。關(guān)閉其中一個(gè)tomcat 1,tomcat 1 原來(lái)處理的請(qǐng)求會(huì)被其他tomcat2 接收,如果此前被關(guān)閉的tomca 1t 的session 中存在信息, tomcat2 中tomcat1 的session 信息依然存在,表現(xiàn)為登錄——tomcat 宕機(jī)——請(qǐng)求被轉(zhuǎn)到另外一個(gè)tomcat ,并仍然處于登錄狀態(tài)。

詳細(xì)配置附錄

不同類型的worker,worker.controller.type配置:

ajp12 這種類型的worker 知道使用ajp12 協(xié)議把請(qǐng)求轉(zhuǎn)向tomcat,最終它將被jk 使用,用來(lái)與tomcat 服務(wù)器交互。
ajp13 這種類型的worker 知道使用ajp13 協(xié)議把請(qǐng)求轉(zhuǎn)向tomcat,最終它將被jk 使用,用來(lái)與tomcat 服務(wù)器交互。
jni   這種類型的worker 知道使用jni 協(xié)議把請(qǐng)求轉(zhuǎn)向tomcat,最終它將被jk 使用,用來(lái)與tomcat 服務(wù)器交互。
lb    這種類型的worker 是負(fù)載均衡worker,他知道怎樣提供輪詢來(lái)分配請(qǐng)求。(常用)
status 這種類型的worker 負(fù)責(zé)管理負(fù)載均衡。

 

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多