apache2.4 + mod_proxy + tomcat7 配置叢集和負載均衡
叢集和負載均衡好處自然不用說,概念不理解查百度,這裡介紹下怎麼利用mod_proxy配置叢集和負載均衡。
首先我們來實現tomcat的叢集以及session的複雜
1.解壓tomcat7到cluster的目錄,並命名為apache-tomcat-7.0.55_64_1,開啟conf/server.xml配置叢集,在Engine
節點下配置叢集資訊
<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="4001" <!-- 若在同一臺機器上,必須修改這裡的埠,避免埠衝突範圍須在4000-4100 -->
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>
2.配置Engine
節點的路由資訊,session複製和負載均衡需要用
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat7_1">
3.複製webapp下的example專案並修改為mycluster,開啟web.xml,並在web-app節點下新增<distributable/>
節點,新建一個jsp頁面作為測試,命名為testCluster.jsp
<%@ page contentType="text/html; charset=GBK" %>
<%@ page import="java.util.*" %>
<html><head><title>Cluster Test</title></head>
<body>
<h3>this is tomcat3!!</h3>
<%
out.println("<p> SESSION ID : " + session.getId()+"</p>");
String name = request.getParameter("name");
if (name != null && name.length() > 0) {
String value = request.getParameter("value");
session.setAttribute(name, value);
}
out.print("<table border = '1'>");
out.print("<tr><th>session key </th><th>session value </th></tr>");
Enumeration<String> names = session.getAttributeNames();
while (names.hasMoreElements()) {
String key = names.nextElement();
String value = session.getAttribute(key).toString();
System.out.print(key + " --- " + value);
out.print("<tr><td>"+key+"</td><td>"+value+"</td></tr>");
}
out.print("</table>");
%>
<br />
<form action="testCluster.jsp" method="post">
session key :<input type=text name="name">
session value:<input type=text name="value">
<input type=submit value="新增">
</form>
</body>
</html>
4.複製apache-tomcat-7.0.55_64_1,命名為apache-tomcat-7.0.55_64_2,由於在一條機器部署倆個tomcat需要修改server.xml中的三個埠
<Server port="8006" shutdown="SHUTDOWN"><!-- 服務埠 -->
//...
<Connector port="8081" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" /><!-- http埠 -->
//...
<Connector port="8010" protocol="AJP/1.3" redirectPort="8443" /><!-- AJP埠 -->
//...
</Server>
叢集和負載均衡好處自然不用說,概念不理解查百度,這裡介紹下怎麼利用mod_proxy配置叢集和負載均衡。
首先我們來實現tomcat的叢集以及session的複雜
1.解壓tomcat7到cluster的目錄,並命名為apache-tomcat-7.0.55_64_1,開啟conf/server.xml配置叢集,在Engine
節點下配置叢集資訊
<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="4001" <!-- 若在同一臺機器上,必須修改這裡的埠,避免埠衝突範圍須在4000-4100 -->
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>
2.配置Engine
節點的路由資訊,session複製和負載均衡需要用
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat7_1">
3.複製webapp下的example專案並修改為mycluster,開啟web.xml,並在web-app節點下新增<distributable/>
節點,新建一個jsp頁面作為測試,命名為testCluster.jsp
<%@ page contentType="text/html; charset=GBK" %>
<%@ page import="java.util.*" %>
<html><head><title>Cluster Test</title></head>
<body>
<h3>this is tomcat3!!</h3>
<%
out.println("<p> SESSION ID : " + session.getId()+"</p>");
String name = request.getParameter("name");
if (name != null && name.length() > 0) {
String value = request.getParameter("value");
session.setAttribute(name, value);
}
out.print("<table border = '1'>");
out.print("<tr><th>session key </th><th>session value </th></tr>");
Enumeration<String> names = session.getAttributeNames();
while (names.hasMoreElements()) {
String key = names.nextElement();
String value = session.getAttribute(key).toString();
System.out.print(key + " --- " + value);
out.print("<tr><td>"+key+"</td><td>"+value+"</td></tr>");
}
out.print("</table>");
%>
<br />
<form action="testCluster.jsp" method="post">
session key :<input type=text name="name">
session value:<input type=text name="value">
<input type=submit value="新增">
</form>
</body>
</html>
4.複製apache-tomcat-7.0.55_64_1,命名為apache-tomcat-7.0.55_64_2,由於在一條機器部署倆個tomcat需要修改server.xml中的三個埠
<Server port="8006" shutdown="SHUTDOWN"><!-- 服務埠 -->
//...
<Connector port="8081" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" /><!-- http埠 -->
//...
<Connector port="8010" protocol="AJP/1.3" redirectPort="8443" /><!-- AJP埠 -->
//...
</Server>
發現8082埠的服務把8081服務的session同步過來了,並且,倆個服務的sessionid都一樣,除了字尾不一樣,字尾是我們配置的jvmRoute
到這裡就測試成功了,這裡要注意幾個地方,要實現session複製,所有session屬性必需實現 java.io.Serializable
叢集配置好之後,我們來整合apache處理負載均衡,這裡利用http代理處理tomcat和apache的連結
1.我們在apache conf的目錄下新建一個balance.conf配置檔案,內容如下
#提供基礎的代理功能
LoadModule proxy_module modules/mod_proxy.so
#提供負載均衡的功能
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
#代理http協議
LoadModule proxy_http_module modules/mod_proxy_http.so
#負載均衡的演算法模組
LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so
LoadModule slotmem_shm_module modules/mod_slotmem_shm.so
#相容低版本訪問
LoadModule access_compat_module modules/mod_access_compat.so
ProxyRequests Off
ProxyPass / balancer://mycluster/
#設定代理的演算法
#ProxySet lbmethod=bytraffic
#代理關聯配置loadfactor可以分發請求權重,loadfactor越大,權重越大
<Proxy balancer://mycluster>
BalancerMember http://localhost:8081 loadfactor=1 route=tomcat7_1
BalancerMember http://localhost:8082 loadfactor=1 route=tomcat7_2
#熱部署,當著備份服務,當tomcat7_1和tomcat7_2死掉的時候,就自動訪問tomcat7_3
#BalancerMember http://localhost:9080 loadfactor=1 route=tomcat7_3 status=+H
</Proxy>
#負載均衡控制檯,通過http://localhost/balancer-manager 訪問
<Location /balancer-manager>
SetHandler balancer-manager
Order Deny,Allow
Allow from all
#Allow from localhost
</Location>
2.開啟conf/httpd.conf江balance.conf引進去,在httpd.conf最下面通過下面命令引入
include conf\balancer.conf
配置好之後,啟動apache,在瀏覽器的位址列輸入http://localhost
發現它已經路由到tomcat的主頁上了,說明apache路徑分發成功,這裡我們在位址列輸入http://localhost/mycluster/testCluster.jsp,發現他能路由到相應的頁面,並在tomcat7_1和tomcat7_2進行切換
到這裡就全部配置了,感覺還挺簡單!!