天天看點

tomcat+apache+jk叢集、負載均衡

一。需要軟體:tomcat6.0+apache2.2+mod_jk(符合apache2.2的,apache官網有下載下傳...)

二。參考:http://www.ibm.com/developerworks/cn/opensource/os-lo-apache-tomcat/index.html

三。環境:多台伺服器。

四。安裝。

     主機A:apache,tomcatA,ip:192.168.1.20  ,apache端口80,tomcat端口8080

     主機B tomcatB,ip:192.168.1.21,端口80

     主機C tomcatC,ip:192.168.1.22,端口80

五。配置apache。

     将下載下傳的mod_jk(名字假如:mod_jk-1.2.28-httpd-2.2.3.so) 放在apache的modules檔案夾下。并修改httpd.conf檔案。搜尋LoadModule。找到一大排#LoadModule xxx xxxx.so下面,加入

LoadModule jk_module modules/mod_jk-1.2.28-httpd-2.2.3.so

當然你也可以放在httpd.conf檔案最後面,随大家愛好。。。,然後在http.conf最後面加入這幾行

JkWorkersFile conf/workers.properties

JkMountFile conf/uriworkermap.properties

JkLogFile logs/mod_jk.log

JkLogLevel warn

這個workers.properties和uriworkermap.properties名字随便取,但是字尾名要是properties。mod_jk.log同樣也可以随便取名字,這個檔案就是寫日志的。JkLogLevel 日志等級,warn以上的都會寫入日志,而這些檔案将會放在根目錄下的conf檔案夾下。

workers.properties就是負責負載均衡的。而uriworkermap.properties則是設定哪些檔案由apache處理,哪些檔案由tomcat處理。

     在conf檔案夾下建立剛才說的workers.properties。在裡面寫:

worker.list=DLOG4J,status

#========tomcatA========

worker.tomcatA.port=8009

worker.tomcatA.host=192.168.1.20

worker.tomcatA.type=ajp13

worker.tomcatA.lbfactor = 1

#========tomcatB========

worker.tomcatB.port=8009

worker.tomcatB.host=192.168.1.21

worker.tomcatB.type=ajp13

worker.tomcatB.lbfactor = 1

#========tomcatC========

worker.tomcatC.port=8009

worker.tomcatC.host=192.168.1.22

worker.tomcatC.type=ajp13

worker.tomcatC.lbfactor = 1

#========controller,負載均衡控制器========

worker.DLOG4J.type=lb

worker.DLOG4J.balanced_workers=tomcatA,tomcatB,tomcatC

worker.retries=3

worker.DLOG4J.sticky_session=true

worker.status.type=status

       其中port為tomcat下server.xml裡的 <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />對應端口。host值為對應主機,這裡不要擔心其他主機tomcat不為8080等其他端口,apache是通過ajp端口找到對應tomcat的。type的值為固定ajp13,這個值不能修改哦。lbfactor 的值就是均衡時apache通路tomcat的機率,如果3個tomcat的值都相等,那麼服務設定了負載均衡的話,就會平均分發給各個tomcat,。controller下面就是負載均衡器了。type=lb表示負載均衡,balanced_workers表示指定哪些tomcat負載均衡,retries的值我現在還不明白什麼意思。sticky_session=false 表示進行session複制,為true表示session不複制。詳細見上面給的參考

       接着在conf檔案夾下建立uriworkermap.properties。在裡面寫下:

/*=DLOG4J

/jkstatus=status

!/*.gif=DLOG4J

!/*.jpg=DLOG4J

!/*.png=DLOG4J

!/*.css=DLOG4J

!/*.js=DLOG4J

!/*.htm=DLOG4J

!/*.html=DLOG4J

status是剛才workers.properties檔案中配置的,意思是由tomcat進行處理。哪些由tomcat處理呢?除了下面那些字尾的檔案外,其他的都由tomcat處理,相信大家這時候都知道後面哪些由誰處理了,對,就是apache。當然你也可以增加其他類型檔案由apache處理。

       另:如果tomcatB下面有其他jsp應用的話,那麼server.xml就要這樣配置了:

<Host name="localhost"

unpackWARs="true" autoDeploy="true"

xmlValidation="false" xmlNamespaceAware="false">

<Alias>192.168.1.21</Alias>

<Context docBase="叢集應用" path="" reloadable="true" />

</Host>

<Host name="其他應用"

unpackWARs="true" autoDeploy="true"

xmlValidation="false" xmlNamespaceAware="false">

<Context docBase="yyyy" path="" reloadable="true" />

</Host>

      localhost這個值請不要域名表示,因為apache是通過ip找到對應項目的。當然下面的"其他應用"可以使用域名表示。并不影響。

就這樣apache就配置完了,接着是配置tomcat。

六。配置tomcat。

      在每個tomcat的server.xml檔案中,修改以下資訊:

      找到類似這樣的:<Engine name="Catalina" defaultHost="localhost"  jvmRoute="tomcatA"> ,預設tomcat把這個給注釋掉了,去掉注釋,jvmRoute裡面的值就是workers.properties中設定的tomcatA,tomcatB,tomcatC。然後在該标簽内添加以下資訊:

<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"

channelSendOptions="8">

<Manager className="org.apache.catalina.ha.session.BackupManager"

expireSessionsOnShutdown="false"

notifyListenersOnReplication="true"

mapSendOptions="8"/>

<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"/>

<!-- timeout="60000"-->

<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"/>

<Interceptor className="org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor"/>

</Channel>

<Valve className="org.apache.catalina.ha.tcp.ReplicationValve"

filter=".*/.gif;.*/.js;.*/.jpg;.*/.png;.*/.htm;.*/.html;.*/.css;.*/.txt;"/>

<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>

       還有一點,就是如果3個tomat都是放在同一台電腦上的話,ajp端口要設定不同,還有

  <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"

address="auto"

port="4000"

autoBind="100"

selectorTimeout="5000"

maxThreads="6"/>

找到這裡,端口4000也要設定不同。。。。

      這樣,叢集就配置好了,當然這個叢集隻是實作了其中的一種方式,就是第一次請求某個tomcat,後續的請求都會由這個tomcat進行處理。當然,這裡session沒有進行複制了。

      如果想進行session複制,那麼要修改workers.properties:worker.DLOG4J.sticky_session=false。

      還要在項目中的web.xml檔案下加上:<distributable/>

      最後一點就是修改server.xml,在 <Engine name="Catalina" defaultHost="localhost"  jvmRoute="tomcatA"> 标簽下加上:

<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>

<Valve className="org.apache.catalina.valves.RequestDumperValve"/>

我就是沒有加上這點,其他都設定好了,導緻session無法複制。将以下這行注釋掉:

<Manager className="org.apache.catalina.ha.session.BackupManager"

expireSessionsOnShutdown="false"

notifyListenersOnReplication="true"

mapSendOptions="8"/>

改為:

<Manager className="org.apache.catalina.ha.session.DeltaManager"

expireSessionsOnShutdown="false"

notifyListenersOnReplication="true"/>

這個mapSendOptions的值也有特殊含義,好像tomcat文檔有講解吧...

額,似乎就這些配置了,session可以複制了。但是我要說的是,這個session是可以複制,但也就是當session在建立或者消費的時候會進行複制,如果session進行更新操作,将無法複制。當然,也許是我少配置哪裡了,如果誰這樣配置了session更新了還可以複制的話,還希望在下面留個言,謝謝!在tomcat官網看到,

<Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"

tempDir="/tmp/war-temp/"

deployDir="/tmp/war-deploy/"

watchDir="/tmp/war-listen/"

watchEnabled="false"/>

這個就是提供session複制的接口,不過tomcat6.0版本好像還沒實作這個接口,導緻session不能真正意義上複制了。

另外:session叢集還會涉及到圖檔共享問題,如果多台伺服器組成了區域網路,可以使用jcifs上傳圖檔到共享檔案夾。當然還可以通過ftp上傳了。