一直說做一下這個叢集練習的,今天終於有時間了,就練習了一下,網上摘錄了很多朋友的技術成果。完成了自己的練習。
官網上下載的apache版本為:httpd-2.2.22-win32-x86-no_ssl.msi
tomcat的版本是:apache-tomcat-7.0.30
在自己的電腦上:window xp上做的練習
安裝apache,這個就不說了。一路next就可以。
小弟做了三個tomcat,由於硬體資源有限,所以三個tomcat都放在了本機。分別取名:tomcat7_a、tomcat7_b、tomcat7_c。放在D、E、F盤上。
都裝好後,就開始配置,我這裡先配置的是apache,採用的不是JK,是mod_proxy_blancer方式,這種方式簡單一些。
1、開啟apache安裝目錄:conf下面的httpd.conf,如果怕配置錯誤,可以先備份一把。
在httpd.conf裡面,把注釋著的這幾個模組開啟,讓apache載入這些模組:
LoadModule proxy_module modules/mod_proxy.soLoadModule proxy_ajp_module modules/mod_proxy_ajp.soLoadModule proxy_balancer_module modules/mod_proxy_balancer.soLoadModule proxy_connect_module modules/mod_proxy_connect.soLoadModule proxy_ftp_module modules/mod_proxy_ftp.soLoadModule proxy_http_module modules/mod_proxy_http.so
在httpd.conf的最後加上虛擬機器主機和代理連接埠配置:
<VirtualHost *:80> ServerAdmin zyujie@163.com ServerName localhost ServerAlias localhost #小心,有些地方要有空格,要不然會出錯哈哈。 ProxyPass / balancer://cluster/ stickysession=JSESSIONID|jsessionid nofailover=On ProxyPassReverse / balancer://cluster/ #ErrorLog "logs/error.log" #CustomLog "logs/access.log" common</VirtualHost>#The ProxyRequests directive should usually be set off when using ProxyPass.ProxyRequests Off<proxy balancer://cluster> #這些參數我們可以自己設定,ajp要和tomcat對應,我這裡做了三個tomcat BalancerMember ajp://localhost:8009 loadfactor=1 route=tomcat7_a smax=5 max=20 ttl=120 retry=300 timeout=15 BalancerMember ajp://localhost:9009 loadfactor=1 route=tomcat7_b smax=5 max=20 ttl=120 retry=300 timeout=15 BalancerMember ajp://localhost:7009 loadfactor=1 route=tomcat7_c smax=5 max=20 ttl=120 retry=300 timeout=15 # status=+H為配置熱備,當所有機器都over時,才會請求該機器 #BalancerMember http://192.168.1.218:8009 status=+H ProxySet lbmethod=bytraffic</proxy>
這樣apache就配置完成了,下面是tomcat。
2、tomcat7_a的配置,只需要配置conf/server.xml,如果要加串連池,其它,再進行配置。
tomcat7_a預設所有連接埠,8080的訪問連接埠,8009的ajp代理連接埠,我們都預設,所以只需要配置session複製的地方:
在server.xml的Engine節點裡面,添加jvmRoute="tomcat7_a",取個名字嘛。
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat7_a">
在Engine節點裡面,再添加(注意是添加,以前的host這些節點,我們繼續保留)以下代碼:具體意思,我們可以查看API:
<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=".*\.gif|.*\.js|.*\.jpeg|.*\.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、下面是tomcat7_b的配置:
連接埠已經給了a tomcat,所以我們要修改連接埠:總共有三個地方需要以a tomcat不同:
<Server port="9005" shutdown="SHUTDOWN"><!--預設是8005-->
<Connector port="9080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> <!--預設是8080-->
<Connector port="9009" protocol="AJP/1.3" redirectPort="8443" /> <!--預設是8009-->
接下來的配置和tomcat7_a一樣:
在server.xml的Engine節點裡面,添加jvmRoute="tomcat7_b",取個名字嘛。
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat7_b">
在Engine節點裡面,再添加(注意是添加,以前的host這些節點,我們繼續保留)以下代碼:具體意思,我們可以查看API:
<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"/><!--這裡值得注意:port連接埠和tomcat7_a不一樣,Reciver的port屬性,預設為5000,tomcat識別的範圍為4000-4100--> <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver" address="auto" port="4001" 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=".*\.gif|.*\.js|.*\.jpeg|.*\.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>
tomcat7_b也配置好了。
4、下面是tomcat7_c的配置。基本同b的配置雷同:
連接埠已經給了a tomcat,所以我們要修改連接埠:總共有三個地方需要以a和b tomcat不同:
<Server port="7005" shutdown="SHUTDOWN"><!--預設是8005-->
<Connector port="7080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> <!--預設是8080-->
<Connector port="7009" protocol="AJP/1.3" redirectPort="8443" /> <!--預設是8009-->
接下來的配置和tomcat7_a一樣:
在server.xml的Engine節點裡面,添加jvmRoute="tomcat7_c",取個名字嘛。
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat7_c">
在Engine節點裡面,再添加(注意是添加,以前的host這些節點,我們繼續保留)以下代碼:具體意思,我們可以查看API:
<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="4002" 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=".*\.gif|.*\.js|.*\.jpeg|.*\.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>
好了,配置完成。做一個簡單的工程,放在這三個tomcat的webapp下面。我想是不是虛擬目錄,可以一個工程都行。
工程很簡單,就是一個web工程。index.jsp改一下,方便測試:
<%@ page contentType="text/html; charset=GBK" %><%@ page import="java.util.*" %><html><head><title>Cluster App Test</title></head><body>Server Info:<%out.println(request.getLocalAddr() + " : " + request.getLocalPort()+"<br>");%><% out.println("<br> ID " + session.getId()+"<br>"); // 如果有新的 Session 屬性設定 String dataName = request.getParameter("dataName"); if (dataName != null && dataName.length() > 0) { String dataValue = request.getParameter("dataValue"); session.setAttribute(dataName, dataValue); } out.println("<b>Session 列表</b><br>"); System.out.println("============================"); Enumeration e = session.getAttributeNames(); while (e.hasMoreElements()) { String name = (String)e.nextElement(); String value = session.getAttribute(name).toString(); out.println( name + " = " + value+"<br>"); System.out.println( name + " = " + value); }%> <form action="test2.jsp" method="POST"> 名稱:<input type=text size=20 name="dataName"> <br> 值:<input type=text size=20 name="dataValue"> <br> <input type=submit> </form><br/><!--tomcat7_a就都寫a tomcat7_b工程裡都寫b tomcat7_c工程裡都寫c--> <b>負載平衡測試:此為:Tomcat7_a上的檔案,aaaaaaaaaaaaaaaaaa </b></body></html>
輸入地址:http://localhost/testTomcat/index.jsp
會發現三個tomcat都在正常工作,如果停掉其中一個,另兩個在工作。這樣就達到了負載平衡,而且session也可以進行複製。
apache + tomcat的叢集就成功部署了。
以上的配置我分別在tomcat a b c中放了三個工程,如果要使用一個工程,就配置虛擬目錄,當然這需要是原生tomcat,配置虛擬目錄,就在server.xml中的host標籤裡加上這句話:path需要加 / ,docBase,需要把目錄指向webroot下面。reloadable=true的話,classes被修改,會自動 重啟tomcat,我這裡設定為false
<Context path="/doTomcat" docBase="D:\webapp\doTomcat" reloadable="false" />
注意的地方有兩點:
1、很多網友說,我們的工程web.xml裡面要加上這句
<display-name>Welcome to Test Tomcat7 Cluster</display-name>
<description>Welcome to Test Tomcat7 Cluster</description>
<distributable/>
原因是讓這個工程,要告訴servlet/JSP容器,編寫的應用將在分布式Web容器中部署。我們還是加上吧,試了一下,貌似不加,也沒有出錯樣。
2、Tomcat7 a b c啟動的時候要報錯:嚴重: FarmWarDeployer can only work as host cluster subelement
則將以下部分注釋掉:
<!--
<Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
tempDir="/tmp/war-temp/"
deployDir="/tmp/war-deploy/"
watchDir="/tmp/war-listen/"
watchEnabled="false"/>
-->