Tomcat集群和负载均衡的实现(session同步)

(一) 环境说明

  • 服务器有4台,一台安装apache,三台安装tomcat
  • apache2.0.55、tomcat5.5.15、jk2.0.4、jdk1.5.6或jdk1.4.2
  • ip配置:一台安装apache的ip为192.168.0.88,三台安装tomcat的服务器ip分别为192.168.0.1/2/4

(二) 安装过程

  • 在三台要安装tomcat的服务器上先安装jdk
  • 配置jdk的安装路径,在环境变量path中加入jdk的bin路径,新建环境变量JAVA_HOME指向jdk的安装路径
  • 在三台要安装tomcat的服务器上分别安装tomcat,调试三个tomcat到能够正常启动
  • 分别修改3台tomcat的server.xml端口为:7080/8888/9999
<Connector port="7080" maxHttpHeaderSize="8192"   
               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"   
               enableLookups="false" redirectPort="8443" acceptCount="100"   
               connectionTimeout="20000" disableUploadTimeout="true" />  
<Connector port="8888" maxHttpHeaderSize="8192"   
               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"   
               enableLookups="false" redirectPort="8443" acceptCount="100"   
               connectionTimeout="20000" disableUploadTimeout="true" />  
<Connector port="9999" maxHttpHeaderSize="8192"   
               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"   
               enableLookups="false" redirectPort="8443" acceptCount="100"   
               connectionTimeout="20000" disableUploadTimeout="true" />  
  • 分别测试每个tomcat的启动是否正常

http://192.168.0.1:7080
http://192.168.0.2:8888
http://192.168.0.4:9999

(三) 负载均衡配置过程

  • 在那台要安装apache的服务器上安装apache2.0.55,我的安装路径为默认C:\Program Files\Apache Group\Apache2
  • 安装后测试apache能否正常启动,调试到能够正常启动http://192.168.0.88
  • 下载jk2.0.4后解压缩文件
  • 将解压缩后的目录中的modules目录中的mod_jk2.so文件复制到apache的安装目录下的modules目录中,我的为C:\Program Files\Apache Group\Apache2\modules
  • 修改apache的安装目录中的conf目录的配置文件httpd.conf,在文件中加LoadModule模块配置信息的最后加上一句LoadModule jk2_module modules/mod_jk2.so
  • 分别修改三个tomcat的server.xml,修改内容如下:

将其中的jvmRoute="jvm1"分别修改为jvmRoute="tomcat1"、jvmRoute="tomcat2"和jvmRoute="tomcat3"

    <!-- An Engine represents the entry point (within Catalina) that processes   
         every request.  The Engine implementation for Tomcat stand alone   
         analyzes the HTTP headers included with the request, and passes them   
         on to the appropriate Host (virtual host). -->   
  
    <!-- You should set jvmRoute to support load-balancing via AJP ie :-->   
    <Engine name="Standalone" defaultHost="localhost" jvmRoute="tomcat1">         
       
          
    <!-- Define the top level container in our container hierarchy   
    <Engine name="Catalina" defaultHost="localhost">   
    --> 
  • 然后重启三个tomcat,调试能够正常启动
  • 在apache的安装目录中的conf目录下创建文件workers2.propertie,写入文件内容如下
# Define the communication channel   
[channel.socket:192.168.0.1:8009]   
info=Ajp13 forwarding over socket   
#配置第一个服务器   
tomcatId=tomcat1 #要和tomcat的配置文件server.xml中的jvmRoute="tomcat1"名称一致   
debug=0   
lb_factor=1 #负载平衡因子,数字越大请求被分配的几率越高   
  
# Define the communication channel   
[channel.socket:192.168.0.2:8009]   
info=Ajp13 forwarding over socket   
tomcatId=tomcat2   
debug=0   
lb_factor=1   
  
# Define the communication channel   
[channel.socket:192.168.0.4:8009]   
info=Ajp13 forwarding over socket   
tomcatId=tomcat3   
debug=0   
lb_factor=1   
  
[status:]   
info=Status worker, displays runtime information.    
  
[uri:/jkstatus.jsp]   
info=Display status information and checks the config file for changes.   
group=status:   
  
[uri:/*]   
info=Map the whole webapp   
debug=0   
  • 在三个tomcat的安装目录中的webapps建立相同的应用,我和应用目录名为TomcatDemo,在三个应用目录中建立相同 WEB-INF目录和页面index.jsp,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.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="index.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>  
  • 重启apache服务器和三个tomcat服务器,到此负载 均衡已配置完成。测试负载均衡先测试apache,访问http://192.168.0.88/jkstatus.jsp,能否正常访问,并查询其中的内容,有三个tomcat的相关配置信息和负载说明,访问http://192.168.0.88/TomcatDemo/index.jsp看能够运行,能运行,则已建立负载均衡

(四) tomcat集群配置

  • 负载均衡配置的条件下配置tomcat集群
  • 分别修改三个tomcat的server.xml,修改内容如下:
        <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="5000"/>   
  
            <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> 

将集群配置选项的注释放开即可

  • 重启三个tomcat,到此tomcat的集群已配置完成

(五) 应用配置

对于要进行负载和集群的的tomcat目录下的webapps中的应用中的WEB-INF中的web.xml文件要添加如下一句配置 <distributable/>

<?xml version="1.0" encoding="UTF-8"?>   
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4">  
   <display-name>TomcatDemo</display-name>   
   <distributable/>   
</web-app>

补充:
因为tomcat的session同步功能需要用到组播,windows默认情况下是开通组播服务的,但是linux默认情况下并没有开通,可以通过指令打开route add -net 224.0.0.0 netmask 240.0.0.0 dev eth0,如果需要服务器启动时即开通组播需在/etc/sysconfig/static-routes文件内加入eht0 net 224.0.0.0 netmask 240.0.0.0。具体组播概念请查阅CCNP相关内容。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,544评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,430评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,764评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,193评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,216评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,182评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,063评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,917评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,329评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,543评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,722评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,425评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,019评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,671评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,825评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,729评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,614评论 2 353

推荐阅读更多精彩内容