如何在Ubuntu上配置Tomcat集群?
譯文【51CTO精選譯文】Apache Tomcat可以說(shuō)是當(dāng)下最受歡迎的開(kāi)源Java Web服務(wù)器。如果貴公司的網(wǎng)站預(yù)計(jì)會(huì)隨著業(yè)務(wù)不斷發(fā)展而迎來(lái)更大的訪問(wèn)量,Tomcat的單個(gè)實(shí)例恐怕無(wú)法滿足訪問(wèn)量日增的需要。這種情況下,你可能會(huì)考慮在“集群”環(huán)境下運(yùn)行Tomcat;在這種環(huán)境下,Web服務(wù)器的工作負(fù)載分配到多個(gè)Tomcat實(shí)例。
我在本文中將向大家介紹如何配置具有負(fù)載均衡和會(huì)話復(fù)制機(jī)制的Tomcat集群。在我們深入探討配置方面的細(xì)節(jié)之前,有必要闡明本教程中將出現(xiàn)的幾個(gè)術(shù)語(yǔ)。
術(shù)語(yǔ)介紹
負(fù)載均衡:前端服務(wù)器(常常名為“負(fù)載均衡器”、“代理均衡器”或“反向代理”)收到HTTP請(qǐng)求后,前端服務(wù)器將請(qǐng)求分發(fā)到后端的不止一個(gè)“worker”Web服務(wù)器,由它們實(shí)際處理請(qǐng)求。負(fù)載均衡可以消除后端的單一故障點(diǎn),并且可以為任何Web服務(wù)實(shí)現(xiàn)高可用性、高擴(kuò)展性以及更合理的資源優(yōu)化。
會(huì)話復(fù)制:會(huì)話復(fù)制是一種機(jī)制,將客戶端會(huì)話的整個(gè)狀態(tài)原原本本復(fù)制到集群中的兩個(gè)或多個(gè)服務(wù)器實(shí)例,以實(shí)現(xiàn)容錯(cuò)和故障切換功能。通常情況下,分發(fā)的狀態(tài)服務(wù)能夠跨集群中的多個(gè)不同服務(wù)器實(shí)例,復(fù)制客戶端會(huì)話的狀態(tài)。
集群:集群由兩個(gè)或多個(gè)Web服務(wù)器實(shí)例組成,這些服務(wù)器實(shí)例步調(diào)一致地工作,透明地處理客戶端請(qǐng)求??蛻舳藢⒁唤M服務(wù)器實(shí)例認(rèn)為是單一實(shí)體服務(wù)。集群的目的是,為客戶端提供高可用性服務(wù),同時(shí)盡量高效地利用所有的可用計(jì)算資源。
具體要求
下面是搭建Tomcat集群的具體要求。我在本教程中假設(shè)有三臺(tái)Ubuntu服務(wù)器。
- 服務(wù)器#1:帶mod_jk的Apache HTTP Web服務(wù)器(充當(dāng)代理均衡器)
- 服務(wù)器#2和服務(wù)器#3:Java運(yùn)行時(shí)6.x或更高版本,以及Apache Tomcat 7.x(充當(dāng)worker Web服務(wù)器)。
Apache Web服務(wù)器充當(dāng)代理均衡器。Apache Web服務(wù)器是客戶端唯一看得見(jiàn)的那臺(tái)服務(wù)器,所有的Tomcat實(shí)例都被隱藏起來(lái),客戶端看不見(jiàn)它們。mod_jk插件被激活后,Apache Web服務(wù)器將任何入站的HTTP請(qǐng)求轉(zhuǎn)發(fā)到集群中的Tomcat worker實(shí)例。
在本教程的其余部分,我將描述配置Tomcat集群的逐步過(guò)程。
第一步:安裝帶mod_jk插件的Apache Web服務(wù)器
Tomcat Connectors讓你可以將Tomcat連接到其他開(kāi)源Web服務(wù)器。對(duì)Apache Web服務(wù)器而言,Tomcat Connectors以一種名為mod_jk的Apache模塊而出現(xiàn)。裝有mod_jk的Apache Web服務(wù)器可以將Ubuntu服務(wù)器變成代理均衡器。想安裝Apache Web服務(wù)器和mod_jk模塊,只要使用下面這個(gè)命令。
$ sudo apt-get install apache2 libapache2-mod-jk
第二步:安裝JDK和Apache Tomcat
下一步就是將Apache Tomcat安裝到另外兩臺(tái)Ubuntu服務(wù)器,這兩臺(tái)服務(wù)器將作為worker,實(shí)際處理HTTP請(qǐng)求。由于Apache Tomcat需要Java開(kāi)發(fā)工具包(JDK),你同樣需要安裝它。請(qǐng)參閱這篇指南:http://ask.xmodulo.com/install-apache-tomcat-ubuntu-debian.html,即可了解如何將JDK和Apache Tomcat安裝到Ubuntu服務(wù)器上。
第三步:在代理均衡器上配置Apache mod_jk
在Ubuntu上,mod_jk配置文件位于/etc/apache2/mods-enabled/jk.conf。用下列內(nèi)容更新該文件:
- <IfModule jk_module>
- # We need a workers file exactly once
- # and in the global server
- JkWorkersFile /etc/libapache2-mod-jk/workers.properties
- # JK error log
- # You can (and should) use rotatelogs here
- JkLogFile /var/log/apache2/mod_jk.log
- # JK log level (trace,debug,info,warn,error)
- JkLogLevel info
- JkShmFile /var/log/apache2/jk-runtime-status
- JkWatchdogInterval 60
- JkMount /* loadbalancer
- JkMount /jk-status jkstatus
- # Configure access to jk-status and jk-manager
- # If you want to make this available in a virtual host,
- # either move this block into the virtual host
- # or copy it logically there by including "JkMountCopy On"
- # in the virtual host.
- # Add an appropriate authentication method here!
- <Location /jk-status>
- # Inside Location we can omit the URL in JkMount
- JkMount jk-status
- Order deny,allow
- Deny from all
- Allow from 127.0.0.1
- </Location>
- <Location /jk-manager>
- # Inside Location we can omit the URL in JkMount
- JkMount jk-manager
- Order deny,allow
- Deny from all
- Allow from 127.0.0.1
- </Location>
- </IfModule>
為了讓上述配置適用于多個(gè)Tomcat實(shí)例,我們不得不在/etc/libapache2-mod-jk/workers.properties中配置每一個(gè)Tomcat worker實(shí)例。我們假設(shè),兩個(gè)worker Ubuntu機(jī)器的IP地址分別是192.168.1.100和192.168.1.200。
使用下列內(nèi)容,創(chuàng)建或編輯etc/libapache2-mod-jk/workers.properties:
- worker.list=loadbalancer,jkstatus # 為192.168.1.100配置Tomcat實(shí)例
- worker.tomcat1.type=ajp13
- worker.tomcat1.host=192.168.1.100
- worker.tomcat1.port=8081
- # worker“tomcat1”使用多達(dá)20個(gè)套接字,套接字在連接池中駐留的時(shí)間只有短短10分鐘。
- worker.tomcat1.connection_pool_size=200
- worker.tomcat1.connection_pool_timeout=600
- # worker“tomcat1”將要求操作系統(tǒng)發(fā)送關(guān)于連接的KEEP-ALIVE信號(hào)。
- worker.tomcat1.socket_keepalive=1
- # 為192.168.1.200配置Tomcat實(shí)例
- worker.tomcat2.type=ajp13
- worker.tomcat2.host=192.168.1.200
- worker.tomcat2.port=8082
- # worker“tomcat2”使用多達(dá)20個(gè)套接字,套接字在連接池中駐留的時(shí)間只有短短10分鐘。
- worker.tomcat2.connection_pool_size=200
- worker.tomcat2.connection_pool_timeout=600
- # worker“tomcat2”將要求操作系統(tǒng)發(fā)送關(guān)于連接的KEEP-ALIVE信號(hào)。
- worker.tomcat2.socket_keepalive=1
- worker.jkstatus.type=status
- worker.loadbalancer.type=lb
- worker.loadbalancer.balance_workers=tomcat1,tomcat2
第四步:配置Tomcat實(shí)例
使用下列內(nèi)容,為地址是192.168.1.100的Tomcat實(shí)例編輯/opt/apache-tomcat-7.0.30/conf/server.xml:
- <Engine name="Catalina" defaultHost="192.168.1.100” jvmRoute="tomcat1">
- <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">
- <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
- <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
- </Sender>
- <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver" address="auto" port="4000" autoBind="100" selectorTimeout="5000" maxThreads="50"/>
- <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"/>
- <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
- <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
- </Cluster>
- 使用下列內(nèi)容,為地址是192.168.1.200的Tomcat實(shí)例編輯/opt/apache-tomcat-7.0.30/conf/server.xml:
- <Engine name="Catalina" defaultHost="192.168.1.200” jvmRoute="tomcat2">
- <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">
- <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
- <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
- </Sender>
- <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver" address="auto" port="4000" autoBind="100" selectorTimeout="5000" maxThreads="30"/>
- <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"/>
- <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
- <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
- </Cluster>
第五步:測(cè)試Tomcat集群
Tomcat Connectors有一種特殊類(lèi)型的worker,那就是所謂的狀態(tài)worker。狀態(tài)worker并不將請(qǐng)求轉(zhuǎn)發(fā)到Tomcat實(shí)例。相反,它允許在運(yùn)行時(shí)獲取狀態(tài)和配置信息,甚至允許動(dòng)態(tài)更改許多配置選項(xiàng)。你可以通過(guò)訪問(wèn)該狀態(tài)worker來(lái)監(jiān)測(cè)Tomcat集群:只要使用Web瀏覽器,進(jìn)入到http://<proxy-balancer-ip-address>/jk-status,就很容易進(jìn)行監(jiān)測(cè)了。
英文:http://xmodulo.com/2014/06/configure-tomcat-cluster-ubuntu.html