1. 程式人生 > >apache2.4 + mod_proxy + tomcat7 配置叢集和負載均衡

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進行切換

這裡寫圖片描述

這裡寫圖片描述

到這裡就全部配置了,感覺還挺簡單!!