apache+jk+tomcat集群+session同步

本文涉及的产品
应用型负载均衡 ALB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
传统型负载均衡 CLB,每月750个小时 15LCU
简介:

说明借前人之鉴写一篇关于tomcat集群及session同步的问题首先介绍tomcat集成及做集群的原因和必要性session同步的作用。然后包括各软件的安装配置。

 

原理tomcat 做个WEB服务器有它的局限性处理能力低效率低。承受并发小1000左右。但目前有不少网站或者页面是JSP的。并采用了tomcat做为WEB因此只能在此基础上调优。

目前采取的办法是Apache + Mod_JK + tomcat 来解决一部分请求用户访问的是apache但有jsp页面的时候才会去请求tomcat。如果量一大那么tomcat无法承受那么只能做tomat集群Apache + Mod_JK 就是负载均衡器了。

Mod_JK2负载均衡可以把不同的jsp请求转发到不同的tomcat服务器还可以侦测服务器存活。如果有条件可以给Mod_JK2做一个HA因为做完集群后压力就在JK上了。

      

简单拓仆图

鎷撲粏鍥

 

一、测试环境及软件安装-----如果已经安装过的可以省略这步

linux 2.6 内核  centos 5.2

本例二台tomcat 不在同一机器。

 

先安装了所需的程序库

yum -y install gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel

 

下载源码包本文不安装PHP

apache2 tomcat5都可以在 apache.org 下载

tomcat5需要JDK1.5的版本。

JK本文用的源码包tomcat-connectors

 

Apache 安装

# tar zxvf httpd- 2.2.8 .tar.gz

#cd httpd- 2.2.8

# ./configure --prefix=/usr/local/apache2 --enable-modules=so --enable-so

# make && make install

 

/usr/local/apache2/bin/apachectrl start

看到apache就配置成功了。

 

 

JDK的安装

#chmod 755 jdk-1_5_0_16-linux-i586.bin

#./jdk-1_5_0_16-linux-i586.bin

# mv jdk-1_5_0_16 /usr/local/

到此JDK已经安装完成

 

/usr/bin目录下把原用的java,javac文件删除:

#rm -rf java

#rm –rf javac

/usr/bin 下建立 软连接 java

# ln -s /usr/local/jdk-1_5_0_16/bin/java /usr/bin/java

# ln -s /usr/local/jdk-1_5_0_16/bin/javac /usr/bin/javac

# java –version

# javac -version

java version " 1.4.2 _08"

Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2 _08-b03)

Java HotSpot(TM) Client VM (build 1.4.2 _08-b03, mixed mode)

 

 

为了方便下在的工作建立两个软链接

ln -s /usr/local/jdk-1_5_0_16  /usr/local/jdk

ln -s /usr/local/jdk-1_5_0_16/jre /usr/local/jre

 

 

Tomcat的安装

#tar -zxvf apache-tomcat- 5.5.27 .tar.gz

# mv apache-tomcat- 5.5.27 /usr/local/tomcat

设置环境变量:

#Set Environment  by NetSeek

JAVA_HOME=/usr/local/jdk

export JAVA_HOME

JRE_HOME=/usr/local/jre

export JRE_HOME

CLASSPATH=/usr=/usr/local/tomcat/common/lib/:/usr/local/jdk/lib:/usr/local/jre/lib

export CLASSPATH

PATH=$PATH:/usr/local/tomcat/bin/:/usr/local/apache/bin:/usr/local/jdk/bin:/usr/local/jre/bin

export PATH

TOMCAT_HOME=/usr/local/tomcat

export TOMCAT_HOME

 

启动tomcat以检查是否存在错误

#cd /usr/local/tomcat/bin

#./startup.sh

[url]http://IP[/url]地址:8080 可以看到猫头成功了。

 

在另一台机器上也安装tomcat并配置好。

 

JK 安装整合apache tomcat

# tar zxvf tomcat-connectors- 1.2.27 -src.tar.gz

#cd tomcat-connectors- 1.2.27 -src/native

# ./configure --with-apxs=/usr/local/apache2/bin/apxs --with-java-home=/usr/local/jdk

# make && make install

 

/usr/local/apache2/modules/下会产生mod_jk.so

修改apache配置文件

LoadModule jk_module modules/mod_jk.so

 

JkWorkersFile /usr/local/tomcat/conf/jk/workers.properties  JK配置文件 负载的配置

JkShmFile logs/mod_jk.shm

JkLogFile /usr/local/tomcat/logs/mod_jk.log  相关日志的设置

JkLogLevel info

JkMount /*.jsp controller  jsp的请求转发给controller(负载均衡控制器)

 

修改DoucmentRoottomcat的目录一致。

本文修改为/usr/local/tomcat/webapps/

 

二、调度器JK的配置

建立JK配置文件

#vi /usr/local/tomcat/conf/jk/workers.properties

workers.tomcat_home=/usr/local/tomcat    #指定tomcat的目录――如果2tomcat在同一台机器该选项去掉

workers.java_home=/usr/local/jdk         #指定jdk的目录

ps=/                                    

worker.list=controller                   #指定负载名这个可以随便起与下面的worker.controller.type=lb要对应

 

#========tomcat1======== 第一台tomcat的配置

worker.tomcat1.port=8009

worker.tomcat1.host=localhost   #这里也可以写IP

worker.tomcat1.type=ajp13      

worker.tomcat1.lbfactor=1       #权量数值越大分配的机率就最小

 

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

worker.tomcat2.port=8009

worker.tomcat2.host=192.168.19.81 (tomcat2IP)

worker.tomcat2.type=ajp13

worker.tomcat2.lbfactor=1

 

#========controller,负载均衡器=======

worker.controller.type=lb

worker.controller.balance_workers=tomcat1,tomcat2 # server.xml配置文件里的jvmRoute="tomcat1"指定的名字

worker.controller.sticky_session=1

 

三、tomcat集群配置session 同步配置
1、tomca1 tomcat 2 在同一台机器
Tomcat 1  IP: 192.168.19.199    
A、修改Engine节点信息 <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">
B、去掉<Cluster>  <\Cluster> 的注释符
C、修改Cluster 节点信息
<Membership               
className="org.apache.catalina.cluster.mcast.McastService"                

mcastBindAddress="192.168.19.199"                
mcastAddr="224.0.0.1"                
mcastPort="45564"    
mcastFrequency="500"                
mcastDropTime="3000"/>
      <Receiver           
className="org.apache.catalina.cluster.tcp.ReplicationListener"                

tcpListenAddress="192.168.19.199"                
tcpListenPort="4001"                
tcpSelectorTimeout="100"                
tcpThreadCount="6"/>
    
Tomcat 2  IP: 192.168.19.81
A、修改Engine节点信息 <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat2">
B、去掉<Cluster>  <\Cluster> 的注释符
C、修改Cluster 节点信息
<Membership       
className="org.apache.catalina.cluster.mcast.McastService"
mcastBindAddress="192.168.19.199"
mcastAddr="224.0.0.1"
mcastPort="45564"
mcastFrequency="500"
mcastDropTime="3000"/>
<Receiver          
className="org.apache.catalina.cluster.tcp.ReplicationListener"          
tcpListenAddress="192.168.19.199"
tcpListenPort="4002" 一定要改
tcpSelectorTimeout="100"
tcpThreadCount="6"/>
D、将8080 8009 8082三个节点的端口改为
   9080 9009 9082 避免 与tomcat1端口冲突
注这里的IP也可以不改 


2、tomca1 tomcat 2 在不同机器上
Tomcat 1  IP: 192.168.19.199    
A、修改Engine节点信息 <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">
B、去掉<Cluster>  <\Cluster> 的注释符
C、修改Cluster 节点信息
 <Membership            
className="org.apache.catalina.cluster.mcast.McastService"
mcastBindAddress="192.168.19.199"                
mcastAddr="224.0.0.1"                
mcastPort="45564"                
mcastFrequency="500"
mcastDropTime="3000"/>
<Receiver           
className="org.apache.catalina.cluster.tcp.ReplicationListener"
tcpListenAddress="192.168.19.199"                
tcpListenPort="4001"                
tcpSelectorTimeout="100"                
tcpThreadCount="6"/>    

Tomcat 2  IP: 192.168.19.81
A、修改Engine节点信息 <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">
B、去掉<Cluster>  <\Cluster> 的注释符
C、修改Cluster 节点信息
<Membership
className="org.apache.catalina.cluster.mcast.McastService"                
mcastBindAddress="192.168.19.81"                
mcastAddr="224.0.0.1"                
mcastPort="45564"     mcastFrequency="500"                
mcastDropTime="3000"/>
<Receiver           
className="org.apache.catalina.cluster.tcp.ReplicationListener"            

tcpListenAddress="192.168.19.81"                
tcpListenPort="4001"                
tcpSelectorTimeout="100"                
tcpThreadCount="6"/>

修改web应用里面WEB-INF目录下的web.xml文件加入标签
<distributable/>
直接加在</web-app>之前就可以了
做tomcat集群必须需要这一步否则用户的session就无法正常使用。

 

注意事项1mcastAddr="224.0.0.1"  这主广播地址因此需要开启网卡组播功能

route add -net 224.0.0.0 netmask 240.0.0.0 dev eth0

分别在各机器上运行

2、查看端口情况

Netstat –antl |grep 4001 同步监听的端口
tomcat1


tomcat2


3、测试广播

java -cp tomcat-replication.jar MCaster 224.0.0.1 45564 Terminal1

java -cp tomcat-replication.jar MCaster 224.0.0.1 45564 Terminal2

如果不报错则能正常广播

tomcat-replication.jar下载:[url]http://cvs.apache.org/~fhanik/tomcat-replication.jar[/url]

如果是二台机器可以用tcpdump抓取包

 

 

五、测试 集群及session同步

webapps 下新建test 目录

目录下建WEB-INF目录下的web.xml文件

<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 [url]http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd[/url]"

   version="2.4">

      <display-name>TomcatDemo</display-name>

      <distributable/>

</web-app>

再在webapps  建立print.jsp   test.jsp

Print.jsp :

 <%

  System.out.println("www.linuxtone.org   liuyu.blog.51cto.com");

%>

 

test.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>");

 String dataName = request.getParameter("dataName");

 session.setAttribute("myname","session?");

  if (dataName != null && dataName.length() > 0) {

    String dataValue = request.getParameter("dataValue");

    session.setAttribute(dataName, dataValue);

  }

 out.print("<b>Session P±?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">

   &#251;&#179;?<input type=text size=20 name="dataName">

    <br>

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

    <br>

   <input type=submit>

  </form>

</body>

</html>

 

重启所有的服务。

 

访问 [url]http://192.168.19.199/test/print.jsp[/url]

如图可以看出tomcat 集群配置完成

 

Session 复制的查看

在同一窗口输入名称和值

在日志可以看到如下结果这种结果表明成功了
tomcat1


tomcat 2




 

 

错误总汇

skipping state transfer. No members active in cluster group."

mcastBindAddress 没有添加或添加得不对

 

?Unknown default host: ajp13 

JK 配置不当

 



本文转自守住每一天51CTO博客,原文链接:http://blog.51cto.com/liuyu/113544,如需转载请自行联系原作者

相关实践学习
DataV Board用户界面概览
本实验带领用户熟悉DataV Board这款可视化产品的用户界面
阿里云实时数仓实战 - 项目介绍及架构设计
课程简介 1)学习搭建一个数据仓库的过程,理解数据在整个数仓架构的从采集、存储、计算、输出、展示的整个业务流程。 2)整个数仓体系完全搭建在阿里云架构上,理解并学会运用各个服务组件,了解各个组件之间如何配合联动。 3&nbsp;)前置知识要求 &nbsp; 课程大纲 第一章&nbsp;了解数据仓库概念 初步了解数据仓库是干什么的 第二章&nbsp;按照企业开发的标准去搭建一个数据仓库 数据仓库的需求是什么 架构 怎么选型怎么购买服务器 第三章&nbsp;数据生成模块 用户形成数据的一个准备 按照企业的标准,准备了十一张用户行为表 方便使用 第四章&nbsp;采集模块的搭建 购买阿里云服务器 安装 JDK 安装 Flume 第五章&nbsp;用户行为数据仓库 严格按照企业的标准开发 第六章&nbsp;搭建业务数仓理论基础和对表的分类同步 第七章&nbsp;业务数仓的搭建&nbsp; 业务行为数仓效果图&nbsp;&nbsp;
相关文章
|
1月前
|
消息中间件 存储 监控
构建高可用性Apache Kafka集群:从理论到实践
【10月更文挑战第24天】随着大数据时代的到来,数据传输与处理的需求日益增长。Apache Kafka作为一个高性能的消息队列服务,因其出色的吞吐量、可扩展性和容错能力而受到广泛欢迎。然而,在构建大规模生产环境下的Kafka集群时,保证其高可用性是至关重要的。本文将从个人实践经验出发,详细介绍如何构建一个高可用性的Kafka集群,包括集群规划、节点配置以及故障恢复机制等方面。
79 4
|
2月前
|
存储 分布式计算 druid
大数据-152 Apache Druid 集群模式 配置启动【下篇】 超详细!(一)
大数据-152 Apache Druid 集群模式 配置启动【下篇】 超详细!(一)
43 1
大数据-152 Apache Druid 集群模式 配置启动【下篇】 超详细!(一)
|
2月前
|
分布式计算 大数据 分布式数据库
大数据-158 Apache Kylin 安装配置详解 集群模式启动(一)
大数据-158 Apache Kylin 安装配置详解 集群模式启动(一)
47 5
|
2月前
|
资源调度 大数据 分布式数据库
大数据-158 Apache Kylin 安装配置详解 集群模式启动(二)
大数据-158 Apache Kylin 安装配置详解 集群模式启动(二)
46 2
|
2月前
|
消息中间件 分布式计算 druid
大数据-152 Apache Druid 集群模式 配置启动【下篇】 超详细!(二)
大数据-152 Apache Druid 集群模式 配置启动【下篇】 超详细!(二)
42 2
|
2月前
|
存储 消息中间件 druid
大数据-151 Apache Druid 集群模式 配置启动【上篇】 超详细!
大数据-151 Apache Druid 集群模式 配置启动【上篇】 超详细!
88 1
|
2月前
apache+tomcat配置多站点集群的方法
apache+tomcat配置多站点集群的方法
37 4
|
2月前
|
存储 大数据 Apache
大数据-146 Apache Kudu 安装运行 Dockerfile 模拟集群 启动测试
大数据-146 Apache Kudu 安装运行 Dockerfile 模拟集群 启动测试
24 0
|
2月前
|
SQL Java API
Apache Flink 2.0-preview released
Apache Flink 社区正积极筹备 Flink 2.0 的发布,这是自 Flink 1.0 发布以来的首个重大更新。Flink 2.0 将引入多项激动人心的功能和改进,包括存算分离状态管理、物化表、批作业自适应执行等,同时也包含了一些不兼容的变更。目前提供的预览版旨在让用户提前尝试新功能并收集反馈,但不建议在生产环境中使用。
763 13
Apache Flink 2.0-preview released
|
2月前
|
存储 缓存 算法
分布式锁服务深度解析:以Apache Flink的Checkpointing机制为例
【10月更文挑战第7天】在分布式系统中,多个进程或节点可能需要同时访问和操作共享资源。为了确保数据的一致性和系统的稳定性,我们需要一种机制来协调这些进程或节点的访问,避免并发冲突和竞态条件。分布式锁服务正是为此而生的一种解决方案。它通过在网络环境中实现锁机制,确保同一时间只有一个进程或节点能够访问和操作共享资源。
82 3

推荐镜像

更多