
如上圖所示,主要通過Apache-Server作為中轉服務器,實現多個tomcat服務器之間的分布式處理,用戶直接請求Apache-Server,然后Apache-Server會將請求分發到具體的tomcat-server,之后tomcat-server響應客戶請求并返回結果到Apache-Server,最后Apache-Server返回結果給用戶
文件說明:
mod_jk.conf
主要定義mod_jk模塊的位置以及mod_jk模塊的連接日志設置,還有定義worker.properties文件的位置。
worker.properties
定義worker的參數,主要是連接tomcat主機的地址和端口信息。如果Tomcat與apache不在同一臺機器上,或者需要做多臺機器上tomcat的負載均衡只需要更改workers.properties文件中的相應定義即可。
%APACHE_HOME%為你的安裝目錄
環境說明:
主要使用了一個Apache Server和兩個Tomcat5.5,在同一臺電腦上進行測試。
1. 準備軟件
Jdk1.6
下載地址:http://java.sun.com
tomcat -6.0.29
下載地址:http://jakarta.apache.org
apache_2.2.4-win32-x86-no_ssl.msi
下載地址:http://httpd.apache.org/download.cgi
mod_jk-1.2.31-httpd-2.0.52.so (主要作用是建立Apache Server與Tomcat之間的連接)
下載地址:http://www.apache.org/dist/tomcat/tomcat-connectors/jk/binaries/
說明:apache-server安裝完成后,可以在瀏覽器中輸入http://localhost/來測試,如果出現” It works!”則表示安裝成功。
2. 安裝mod_jk連接模塊
安裝好Jdk、tomcat、apache后,加入mod_jk連接模塊,就是把mod_jk-1.2.31-httpd-2.2.3.so文件拷貝到%APACHE_HOME%\modules下,把jk模塊的配置放到單獨的文件中來,在%APACHE_HOME%\conf目錄新建mod_jk.conf、workers.properties文件。
在httpd.conf最后加上:
# JK module settings
Include conf/mod_jk.conf
說明:以上表示將mod_jk.conf配置文件包含進來
3. 修改mod_jk.conf文件
為了保持httpd.conf文件的簡潔,把jk模塊的配置放到單獨的文件中來。
在mod_jk.conf文件中添加以下內容:
# Load mod_jk2 module
LoadModule jk_module modules/mod_jk-1.2.31-httpd-2.2.3.so
# Where to find workers.properties(引用workers配置文件)
JkWorkersFile conf/workers.properties
# Where to put jk logs(log文件路徑)
JkLogFile logs/mod_jk2.log
# Set the jk log level [debug/error/info](log級別)
JkLogLevel info
# Select the log format(log格式)
JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
# JkOptions indicate to send SSL KEY SIZE,
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories
# JkRequestLogFormat set the request format
JkRequestLogFormat "%w %V %T"
# Send JSPs for context / to worker named loadBalancer(URL轉發配置,匹配的URL才轉發到tomcat進行處理)
JkMount /*.jsp controller
# JkMount /*.* loadBalancer
4. 修改workers.properties文件
在workers.properties文件中添加以下內容:
#server 列表
worker.list = controller,tomcat1,tomcat2
# tomcat1(ajp13 端口號,在tomcat下server.xml配置,默認8009)
worker.tomcat1.port=8009
#tomcat的主機地址,如不為本機,請填寫ip地址
worker.tomcat1.host=localhost
worker.tomcat1.type=ajp13
#server的加權比重,值越高,分得的請求越多
worker.tomcat1.lbfactor = 1
# tomcat2
worker.tomcat2.port=9009
worker.tomcat2.host=localhost
worker.tomcat2.type=ajp13
worker.tomcat2.lbfactor = 1
# controller(負載均衡控制器)
worker.controller.type=lb
# 指定分擔請求的tomcat
worker.controller.balanced_workers=tomcat1,tomcat2
#worker.controller.sticky_session=true
說明:此文件配置了2個tomcat服務器進行負載均衡處理,sticky_session表述是否將對SESSION ID的請求路由回到相同的Tomcat worker。如果屬性值不為0,它將被設置為JK_TRUE,session將是粘性的,即SESSION ID的請求路由回到相同的Tomcat worker;當Tomcat正使用能夠跨越多個Tomcat實例持久化session數據的Session Manager時,它將被設置為JK_FALSE
5. 修改tomcat配置文件server.xml
更改其中一個的設置打開tomcat2/conf/server.xml文件,修改里面所有的端口設置,將8改為9,如下:

6. 編寫一個測試頁面teat1.jsp
建立一個test的web應用,里面新建一個test1.jsp,內容為

<%
@ page language="java" contentType="text/html; charset=UTF-8"

pageEncoding="UTF-8"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>test1</title>

</head>

<body>


<%

System.out.println("===========================");

%>

</body>

</html>
7. 啟動服務器并進行測試
依次啟動apache-server、tomcat1、tomcat2,通過 http://localhost/test/test1.jsp 訪問,查看tomcat1的窗口,可以看到打印了一行"==========",再刷新一次,tomcat2也打印了一條,再刷新,可以看到請求會被tomcat1,tomcat2輪流處理,實現了負載均衡

三、集群(session復制)
只配置負載均衡還不行,還要session復制,也就是說其中任何一個tomcat的添加的session,是要同步復制到其它tomcat, 集群內的tomcat都有相同的session
1.1 修改tomcat1, tomcat2的server.xml文件添加集群內容,tomcat5.5無需添加,只需要去掉注釋符,tomcat6.0需要添加,內容如下:
Tomcat5.5配置
<Cluster className="org.apache.catalina.cluster.tcp.SimpleTcpCluster"

managerClassName="org.apache.catalina.cluster.session.DeltaManager"

expireSessionsOnShutdown="false"

useDirtyFlag="true"

notifyListenersOnReplication="true">


<Membership

className="org.apache.catalina.cluster.mcast.McastService"

mcastAddr="228.0.0.4"

mcastPort="45564"

mcastFrequency="500"

mcastDropTime="3000"/>


<Receiver

className="org.apache.catalina.cluster.tcp.ReplicationListener"

tcpListenAddress="auto"

tcpListenPort="4001"

tcpSelectorTimeout="100"

tcpThreadCount="6"/>


<Sender

className="org.apache.catalina.cluster.tcp.ReplicationTransmitter"

replicationMode="pooled"

ackTimeout="15000"

waitForAck="true"/>


<Valve className="org.apache.catalina.cluster.tcp.ReplicationValve"

filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"/>


<Deployer className="org.apache.catalina.cluster.deploy.FarmWarDeployer"

tempDir="/tmp/war-temp/"

deployDir="/tmp/war-deploy/"

watchDir="/tmp/war-listen/"

watchEnabled="false"/>


<ClusterListener className="org.apache.catalina.cluster.session.ClusterSessionListener"/>

</Cluster>
Tomcat6.0配置
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
channelSendOptions="6">
<!--
<Manager className="org.apache.catalina.ha.session.BackupManager"
expireSessionsOnShutdown="false"
notifyListenersOnReplication="true"
mapSendOptions="6"/>
-->
<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="5000"
selectorTimeout="100"
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"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor"/>
</Channel>
<Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"/>
<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.ClusterSessionListener"/>
</Cluster>
分別添加以上內容后,在tomcat2中,修改tcpListenPort="4001" 為4002
1.2. Engine增加jvmRoute屬性設置,jvmRoute的值來自于workers.properties文件所設置的服務器名稱。
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">
#server 列表
worker.list = controller,tomcat1,tomcat2
2. 添加test.jsp頁面
2.1. test.jsp添加以下內容:

<%
@ page contentType="text/html; charset=UTF-8"%>


<%
@ 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.print("<b>Session 列表</b>");

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="test.jsp" method="POST">

名稱:<input type=text size=20 name="dataName"> <br>

值:<input type=text size=20 name="dataValue"> <br>

<input type=submit></form>

</body>

</html>
2.2. 修改web.xml文件,加入<distributable/>節點,如下所示:
<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">

<display-name>test</display-name>

<distributable/>

<welcome-file-list>

<welcome-file>index.html</welcome-file>

<welcome-file>index.htm</welcome-file>

<welcome-file>index.jsp</welcome-file>

<welcome-file>default.html</welcome-file>

<welcome-file>default.htm</welcome-file>

<welcome-file>default.jsp</welcome-file>

</welcome-file-list>

</web-app>
測試步驟如下:
1) 啟動apache-server、tomcat1、tomcat2
2) 訪問http://localhost/test/test.jsp,輸入名稱:test0001、值:123并點擊“提交查詢內容”按鈕,顯示效果如下:
如上圖所示,tomcat1創建了一個新的session,session中有屬性test0001,值為123

3) 關閉tomcat1服務器,tomcat1端口為8080,如下圖:

4) 在頁面中再次點擊“提交查詢內容”按鈕,效果如下:

前端頁面并沒有發生改變,接下來查看后臺情況:
如圖所示,可以發現session已成功復制到tomcat2中,以此證明tomcat集群已配置成功。
5) 另外來看看不關閉tomcat1服務器再次提交的情況

如圖所示,請求并沒有轉發到tomcat2服務器,而是再次轉回tomcat1服務器,這種情況是由于配置了jvmRoute所致,以個人理解,配置了此屬性后,apache-server會根據session情況來進行路由,同一個session會轉發給同一個服務器。
6) 打開一個新的IE窗口,并訪問http://localhost/test/test.jsp

新窗口的請求轉發到了tomcat2服務器,session的id為DD9E6C8181653B9BCCF534FC8760B264.tomcat2,根據測試結果可以說明,在不發生服務器關閉的情況下,每個session會綁定到同一個服務器中,而不會在服務器間發生復制。
配置文件下載:/Files/obpm/配置文件.rar
原創作者:Nicholas
posted on 2011-06-22 16:09
obpm 閱讀(8210)
評論(4) 編輯 收藏 所屬分類:
分布式&云計算