Apache+modjk佈置tomcat集羣

1、版本:

Apache: 2.2.14;css

       下載地址:http://archive.apache.org/dist/httpd/binaries/win32/html

Mod_jk:tomcat-connectors-1.2.37-windows-i386-httpd-2.2.x;java

       下載地址:http://archive.apache.org/dist/tomcat/tomcat-connectors/jk/binaries/windows/linux

下載時注意文件名後面的」httpdx.x.x」中的版本號要與apache的版本能對上,不然會由於版本不對致使Apache啓動不起來的問題;web

Tomcat: 7.0.82apache

JDK1.7ubuntu

2、Apache配置:

一、mod_jk.so到Apache安裝目錄下的modules文件夾下;windows

二、修改httpd.conf配置文件:瀏覽器

在這個文件的最後增長一行:tomcat

include "C:/Cluster/Apache2.2/conf/mod_jk.conf"

三、新增配置文件mod_jk.conf:

文件中輸入內容:

#加載mod_jk Module

LoadModule jk_module C:/Cluster/Apache2.2/modules/mod_jk.so

#指定 workers.properties文件路徑

JkWorkersFile C:/Cluster/Apache2.2/conf/workers.properties

#指定哪些請求交給tomcat處理,"controller"爲在workers.propertise裏指定的負載分配控制器名

JkMount /* controller

四、新增配置文件workers.properties:

文件中輸入內容:

#server 列表

worker.list=controller,tomcat1,tomcat2

#========tomcat1========

worker.tomcat1.port=8009

worker.tomcat1.host=192.168.1.110

worker.tomcat1.type=ajp13

worker.tomcat1.lbfactor=1

worker.tomcat1.socket_timeout=10

worker.tomcat1.socket_keepalive=True

worker.tomcat1.ping_mode=I

worker.tomcat1.ping_timeout=10000

#========tomcat2========

worker.tomcat2.port=8009

worker.tomcat2.host=192.168.1.111

worker.tomcat2.type=ajp13

worker.tomcat2.lbfactor=1

worker.tomcat2.socket_timeout=10

worker.tomcat2.socket_keepalive=True

worker.tomcat2.ping_mode=I

worker.tomcat2.ping_timeout=10000

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

worker.controller.type=lb

#指定此負載平衡器負責的Tomcat應用節點。

worker.controller.balanced_workers=tomcat1,tomcat2

#指定分擔請求的tomcat

worker.controller.sticky_session=0

#設爲false,則代表需求會話複製。

worker.controller.sticky_session_force=0

上面配置的tomcat1.host, tomcat1.port, tomcat2.host, tomcat2.port分別填寫集羣的tomcat服務器的ip地址和端口號(端口號要填寫ajp協議的端口號);

3、Tomcat配置:

一、安裝JDK1.7並配置環境變量JAVA_HOME, JRE_HOME;

二、分別在要集羣的服務器上安裝tomcat7;

三、修改Server.xml文件:

修改

 

爲:

 

對於tomcat2也是一樣的修改jvmRoute爲tomcat2,其餘tomcat依次類推;

增長一行:

 

若是幾個tomcat佈置在一臺機器上,因爲端口衝突不能啓動,須要修改啓動端口,須要修改的地方有:

 

 

四、依次啓動tomcat的bin目錄下的startup.bat文件(linux下啓動startup.sh文件)來啓動tomcat;

五、在瀏覽器中打開:http://ip:port 來測試tomcat啓動是否正常;

4、測試:

一、新建一個測試的web工程,在web.xml文件中增長一行:

<distributable/>

二、創建測試頁面文件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); 

        } 

    %>

</body>

</html> 

 

三、啓動Apache,在瀏覽器中打開:http://localhost:80/test/index.jsp,能夠看到Apache會把請求負載到tomcat1和tomcat2上,可是session一直沒有改變,說明session在兩個tomcat之間進行了同步;

 

5、Linux上的配置:

實際測試中,按照上面的配置時,在單臺win7機器上佈置了兩個tomcat時是能正常負載和session複製,在兩臺windows的機器上分別佈置tomcat時,負載和session複製也是沒問題的,可是分別在兩臺ubuntu的機器上佈置tomcat時,能正常負載,可是session沒有複製,每次點擊提交按鈕刷新頁面時會切換tomcat,session都會改變,網上搜索過緣由,說時兩臺機器的時間和時區不一樣致使的,統一修改了兩臺機器的時區和時間後仍然不行;

後來在tomcat的配置文件Server.xml中增長集羣配置並指定Receiver的ip爲本機的ip時,session正確複製了,增長的配置信息以下:

<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="192.168.1.110"       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>

 

其中的

 

其中的address修改成當前tomcat運行機器的ip地址便可;

 

修改完後重啓tomcat便可;

 

配置說明:

一、Manager用來在節點間拷貝Session,默認使用DeltaManager,DeltaManager採用的一種all-to-all的工做方式,即集羣中的節點會把Session數據向全部其餘節點拷貝,而無論其餘節點是否部署了當前應用。當集羣中的節點數量不少而且部署着不一樣應用時,可使用BackupManager,BackManager僅向部署了當前應用的節點拷貝Session。可是到目前爲止BackupManager並未通過大規模測試,可靠性不及DeltaManager。

二、Membership用於發現集羣中的其餘節點,這裏的address用的是組播地址使用同一個組播地址和端口的多個節點同屬一個子集羣,所以經過自定義組播地址和端口就可將一個大的tomcat集羣分紅多個子集羣。

三、receiver用於各個節點接收其餘節點發送的數據,在默認配置下tomcat會從4000-4100間依次選取一個可用的端口進行接收,自定義配置時,若是多個tomcat節點在一臺物理服務器上注意要使用不一樣的端口。

四、Sender用於向其餘節點發送數據,具體實現經過Transport配置。

五、Channel 是一個抽象的端口,和socket相似,集羣member經過它收發信息。

六、Valve用於在節點向客戶端響應前進行檢測或進行某些操做,ReplicationValve就是用於檢測當前的響應是否涉及Session數據的更新,若是是則啓動Session拷貝操做,filter用於過濾請求,如客戶端對圖片,css,js的請求就不會涉及Session,所以不需檢測,默認狀態下不進行過濾,監測全部的響應。

相關文章
相關標籤/搜索