Centos基于Apache的Tomcat负载均衡和集群

Centos基于Apache的Tomcat负载均衡和集群

一、背景原理
1、tomcat 做个WEB服务器有它的局限性,处理能力低,效率低。承受并发小(1000左右)。但目前有不少网站或者页面是JSP的。并采用了tomcat做为WEB,因此只能在此基础上调优。
2、目前采取的办法是Apache + Mod_JK + tomcat 来解决一部分请求,用户访问的是apache,但有jsp页面的时候才会去请求tomcat。如果量一大,那么tomcat无法承受,那么只能做tomat集群,Apache + Mod_JK 就是负载均衡器了(apache+tomcat通过ajp13协议做集群,,apache和tomcat用mod_jk连接器通信)。
3、Mod_JK2负载均衡可以把不同的jsp请求转发到不同的tomcat服务器,还可以侦测服务器存活。如果有条件可以给Mod_JK2做一个HA因为做完集群后压力就在JK上了。

4、反向代理负载均衡 (Apache+JK+Tomcat)

 使用代理服务器可以将请求转发给内部的Web服务器,让代理服务器将请求均匀地转发给多台内部Web服务器之一上,从而达到负载均衡的目的。这种代理方式与普通的代理方式有所不同,标准代理方式是客户使用代理访问多个外部Web服务器,而这种代理方式是多个客户使用它访问内部Web服务器,因此也被称为反向代理模式。

5、为什么要配置Tomcat 负载均衡和集群

负载均衡:负载均衡能处理高并发量的请求。
Tomcat 集群:Tomcat 集群配合负载均衡可以是系统达到高可用性,即任何一台服务器不可用,自动重新连接后,能保持session 数据一致,不需要重新输入密码。

6、简单原理介绍

 1.apatche 与tomcat 的之间的联系由jk 完成,用的是ajp协议。每个tomcat 都在监听ajp端口。默认的 AJP Connector 的端口是 8009 。 
 2.配置了集群的 tomcat 之间通过 tcp 协议通信复制 session,当然要在tomcat 应用中的web.xml 文件中加入<distributable/>或<Context distributable="true" /> ,标志着要复制session。
  复制session 是为了在某个服务器正在被请求时宕机,请求由apache 通过jk 转发到其他tomcat 服务器时,session 中的信息丢失采取的一中保持session 的方式,还有其他的解决方案,如把session 存到数据库中。
 3.jk 把请求分配给某个tomcat 服务器遵循着不同的原则,这里我们使用的是负载均衡。在 workers.properties 中定义了很多worker ,如果worker 的type 把定义成 lb,就表示这个worker 是负载均衡worker ,他知道怎样提供轮询来分配request 。而负载均衡也分很多平衡的方式,采用哪种方式决定于属性worker.balancer.method。

下面具体描述不同的负载均衡方式(默认的是R方式):
worker.balancer.method=Request (简写R ):负载均衡worker 将根据每个tomcat 服务器上处理的request 数来寻找最佳的tomcat 服务器。这种方式适合绝大数application 。
worker.balancer.method=Session (简写 S ):负载均衡worker 根据各个tomcat 上 session的数量来寻找最佳tomcat ,但是负载均衡worker 并没有状态,所以不知道session 个数,所以把没有session cookie 的请求或url 中没有encode sessionid 的请求当作new session 。
worker.balancer.method= Traffic (简写T ):负载均衡worker 根据jk 和tomcat 直接的网络状况来找最佳的tomcat 服务器。
worker.balancer.method= Busyness (简写B ):负载均衡worker 根据tomcat 的流量选择流量最少的tomcat 。

7、对应的安装介绍

 Apache服务器:是前端web 服务器,用来接收客户端的请求。
 mod_jk.so:是tomcat Connector ,用于把apache 接收到的请求分发给tomcat 来处理。JK要与Apache版本对应。JK 分为两个版本 1,x 和 2.x ,其中 2.x 并不是最新的版本,它是 JK 的另外一个分支,后不知何因没有继续开发,因此2.x 版本已经废弃。
 Tomcat :也是web 服务器,但在这里主要充当servlet 容器,用来处理jk 转发过来的请求。
 安装 apache ,并把 mod_jk.2.0.55 解压后拷贝到 apache 安装目录(Apache_HOME)/modules 下面,其实modules 下面是apache 的各个功能模块,可插拔。

二、需要的软件包
JDK:jdk-7u45-linux-x64.rpm
Tomcat:apache-tomcat-7.0.47.tar.gz
Apache:httpd-2.2.27.tar.gz
Mod_JK: tomcat-connectors-1.2.39-src.tar.gz

三、安装说明
参见: 
CentOS-6.3安装配置JDK-7 http://www.flybi.net/article/12
CentOS-6.3安装配置Tomcat7.0 http://www.flybi.net/article/2
CentOS-6.3安装配置Apache2.2.27 http://www.flybi.net/article/20
CentOS-6.3安装配置mod_jk1.2 http://www.flybi.net/article/22

三、配置
1、配置Apache
在apache的conf下,用vi编辑器打开httpd.conf,在该文件末尾加上如下行 (切记/usr/local/apache/conf 和 /etc/httpd/conf 下的httpd.conf里面都要添加)

Include /usr/local/apache/conf/mod_jk.conf

2、配置mod_jk.conf文件
在/usr/local/apache/conf下建立mod_jk.conf文件。配置内容:

#加载mod_jk Module
LoadModule jk_module /usr/local/apache/modules/mod_jk.so
# 加载集群中的workers
JkWorkersFile /usr/local/apache/conf/workers.properties
# 加载workers的请求处理分配文件
JkMountFile /usr/local/apache/conf/uriworkermap.properties
# 指定jk的日志输出文件
JkLogFile /usr/local/apache/logs/mod_jk.log
# 指定日志级别
JkLogLevel warn
# 指定日志的格式
JkLogStampFormat "[%a %b %d %H:%M:%S %Y]"
#指定哪些请求交给tomcat处理,"controller"为在 workers.propertise里指定的负载分配控制器名 
JkMount /[i].[/i] controller

说明:
JkMount:设置apache分发器,/表示apache将所有文件都由分发器lbcontroller 进行分发,你可以自行设置.jsp,*.do等;

3、配置workers.properties文件
在/usr/local/apache/conf下建立workers.properties文件。配置内容:

#server 列表
worker.list=controller,tomcat1,tomcat2
#========tomcat1========
worker.tomcat1.port=8008 #ajp13 端口号,在tomcat下server.xml配置,默认8009
worker.tomcat1.host=localhost #tomcat的主机地址,如不为本机,请填写ip地址
worker.tomcat1.type=ajp13
worker.tomcat1.lbfactor=1 #server的加权比重,值越高,分得的请求越多
#========tomcat2========
worker.tomcat2.port=8009 #ajp13 端口号,在tomcat下server.xml配置,默认8009
worker.tomcat2.host=localhost #tomcat的主机地址,如不为本机,请填写ip地址
worker.tomcat2.type=ajp13
worker.tomcat2.lbfactor=1 #server的加权比重,值越高,分得的请求越多
#========controller,负载均衡控制器========
worker.controller.type=lb #server名为controller,用于负载均衡
worker.retries=3 #重试次数
worker.controller.balance_workers=tomcat1,tomcat2
#粘性Session(默认是打开的) 当该属性值=True(或1)时,代表Session是粘性的,即同一Session在集群中的同一个节点上处理,Session不跨越节点。在集群环境中,一般将该值设置为False
worker.controller.sticky_session=false
#设置用于负载均衡的server的session可否共享 有不少文章说设置为1是可以的,也有设置为0才可以的
#worker.controller.sticky_session=1
#worker.controller.sticky_session_force=1
#worker.status.type=status

说明:
1、注意上面的worker.tomcat1.port端口是Tomcat server.xml下的
<Connector port="8019" protocol="AJP/1.3" redirectPort="8443" />

4、配置uriworkermap.properties文件
在/usr/local/apache/conf下建立uriworkermap.properties文件。配置内容:

#所有请求都由controller这个server处理
/*=controller
#所有包含jkstatus请求的都由status这个 server处理
#/jkstatus=status
#这里的"!”是“非”的意思。
!/*.gif=controller
!/*.jpg=controller
!/*.png=controller
!/*.css=controller
!/*.js=controller
!/*.htm=controller
!/*.html=controller

5、修改tomcat1_Home\conf\server.xml配置
JK: ajp13 listening on /0.0.0.0:8009 修改端口必须与workers.propertise文件内worker.tomcat1.port=8009一致。

<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

以上为负载均衡配置完毕!接下来可以配置Tomcat集群和Session复制!

<Engine name="Catalina" defaultHost="localhost" [b]jvmRoute="tomcat2"[/b]>     <!--tomcat1将与tomcat2黏贴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">
        <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="4000" 
            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>
...
</Engine>

说明:228.0.0.4是默认的配置集群默认的地址,不要改动。

Tomcat2的server.xml配置也做相应修改,因为本文测试使用同一台电脑,所以对应的微做修改端口。Tomcat分布于不同电脑上,不用改端口号。

<Engine name="Catalina" defaultHost="localhost" [b]jvmRoute="tomcat1"[/b]>     <!--tomcat2将与tomcat1黏贴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">
        <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" 
            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>
...
</Engine>

6、最后要tomcat支持session复制,必须在web.xml里面加上一个标签。在发布项目的web.xml文件里面添加及对应的tomcat_Home\conf\web.xml也要添加

<!-- 集群 表明要复制session,一般放在最后-->
<distributable/>

 注意:session黏贴(共享)方面,如果session中存放的为javabean,javabean必须实现Serializable接口,如果没有实现会报错误 Exception thrown: class java.lang.IllegalArgumentException。
7、测试
在tomcat1和tomcat2的\webapps下建立test文件夹,建立test.jsp文件

<%System.out.println("==============");%>

启动Tomcat1、Tomcat2、Apache。浏览器中输入:http://localhost/test/test.jsp。不停刷新浏览器,可以在Tomcat1和2的控制台看到=====交替输出。
结果:在不同的客户端发起请求,请求会被平均分配给tomcat。关闭其中一个tomcat 1,tomcat 1 原来处理的请求会被其他tomcat2 接收,如果此前被关闭的tomca 1t 的session 中存在信息, tomcat2 中tomcat1 的session 信息依然存在,表现为登录——tomcat 宕机——请求被转到另外一个tomcat ,并仍然处于登录状态。
8、其他总结
不同类型的worker,worker.controller.type配置:

ajp12 这种类型的worker 知道使用ajp12 协议把请求转向tomcat,最终它将被jk 使用,用来与tomcat 服务器交互。
ajp13 这种类型的worker 知道使用ajp13 协议把请求转向tomcat,最终它将被jk 使用,用来与tomcat 服务器交互。
jni   这种类型的worker 知道使用jni 协议把请求转向tomcat,最终它将被jk 使用,用来与tomcat 服务器交互。
lb    这种类型的worker 是负载均衡worker,他知道怎样提供轮询来分配请求。(常用)
status 这种类型的worker 负责管理负载均衡。

三、 apache jkstatus JK运行状态管理权限
在已配置完成的 apache 项目中 workers.properties 配置文件中加入 下面两行

worker.list = status
worker.status.type=status

mod_jk.conf 配置文件中加入下面一行
JkMount /jkstatus status

在地址栏访问http://ip地址:端口号/jkstatus 就能看到了。

时间: 2024-11-07 13:55:00

Centos基于Apache的Tomcat负载均衡和集群的相关文章

基于apache的tomcat负载均衡和集群配置

最近不是很忙,用零碎时间做点小小的实验. 以前公司采用F5负载均衡交换机,F5将请求转发给多台服务器,每台服务器有多个webserver实例,每个webserver分布在多台服务器,交叉式的分布集群.F5只是简单了解,毕竟那玩意几十万的价格实在不是我一个小喽喽能弄来做试验玩的,而起公司也不能开放权限.后来知道apache.Nginx软件可以实现负载(F5是操作于IOS网络模型的传输层,Nginx.apache是基于http反向代理方式,位于ISO模型的第七层应用层.直白些就是TCP UDP 和h

基于apache的tomcat负载均衡和集群配置session共享

接上面的话题接着继续完善.为什么没接到上篇呢?原因很简单太长的文章不爱看!就像有人写了上千行的方法一样,不是逼得没办法谁爱看谁看,反正我不看. 期间我没有一次配置成功,从失败的开始说起, 1.准备jar包 注意:不同的tomcat版本(tomcat6,tomcat7)所需的包不一样,需要针对tomcat版本下载对应的包. 这是采用的最新稳定版1.6 首先我到官网:http://code.google.com/p/memcached-session-manager/下载了最新的jar 由于公司网络

Apache、Tomcat负载均衡与集群

一. 环境准备 1.软件下载 a) apache_2.0.55-win32-x86-no_ssl.msi: b) apache-tomcat-5.5.17.rar c) mod_jk-apache-2.0.55.so 下载地址: http://download.csdn.net/detail/crazyiter_com/4178657 2.软件安装 a)  Apache安装路径为:E:\ide\apache\Apache2 (具体可以根据自己的盘符而定) b) Tomcat放置位置和名称注意:

apache + tomcat 负载均衡分布式集群配置

Tomcat集群配置学习篇-----分布式应用 现目前基于javaWeb开发的应用系统已经比比皆是,尤其是电子商务网站,要想网站发展壮大,那么必然就得能够承受住庞大的网站访问量:大家知道如果服务器访问量过大,就会出现服应用务器崩溃的情况,这个时候怎么办,难道就只能去重启服务器吗?好,如果是一般的小型公益网站到也无所谓,但如果是比如像大型航空公司售票等电子商务网站,每天每小时都有大量的订单业务,如果这些售票系统一旦崩溃后,再去重启,这些时间和客户的损失就直接会影响到航空公司的利益,这些损失如何去避

使用apache和nginx代理实现tomcat负载均衡及集群配置详解

实验环境: 1.nginx的代理功能 nginx proxy: eth0: 192.168.8.48 vmnet2 eth1: 192.168.10.10 tomcat server1: vmnet2 eth0: 192.168.10.20 tomcat server2: vmnet2 eth0: 192.168.10.30 # yum install -y nginx-1.8.1-1.el6.ngx.x86_64.rpm # vim /etc/nginx/conf.d/default.conf

linux下apache+tomcat负载均衡和集群

先说下我的环境 一台ubuntu的虚拟机, 一个apache2.2的实例 两个tomcat1.7的实例 1.安装apache服务器 sudo apt-get install apache2 如果要重启的话,运行命令: sudo /etc/init.d/apache2 restart ubuntu下的apache会默认创建路径/var/www,apache默认加载的时候,就是加载的这个路径下面的 2.安装两个tomcat实例 去官网下载一个 然后在本地在cp一下, 此时目录结构为: /home/h

Apache + Tomcat + JK 实现负载均衡和集群(状态复制)

原文请见http://www.cnblogs.com/dennisit/p/3370220.html 本文介绍了集群和负载均衡的基本开源实现,实现了用Apache分发请求到多个Tomcat里面对应的应用. 模块介绍 - Apache作为Web服务器,用于处理静态Http请求: - Tomcat作为应用服务器(Servlet容器),处理动态请求: - JK 作为Apache与Tomcat之间的桥梁,实现了Apache与Tomcat一对多的对应,使后端Tomcat负载均衡. 开发环境 - Windo

Apache + Tomcat + JK 实现负载均衡和集群

本文介绍了集群和负载均衡的基本开源实现,实现了用Apache分发请求到多个Tomcat里面对应的应用. 模块介绍 - Apache作为Web服务器,用于处理静态Http请求: - Tomcat作为应用服务器(Servlet容器),处理动态请求: - JK 作为Apache与Tomcat之间的桥梁,实现了Apache与Tomcat一对多的对应,使后端Tomcat负载均衡. 开发环境 - Windows 7操作系统 - Java SE8 - Apache 2.2.14    (本地安装路径:D:\A

基于mod_proxy+Apache 2.2.16+Tomcat 7的负载均衡与集群配置

第一章. 背景简介 对于大多数企业应用,都希望能做到7*24小时不间断运行.要保持如此高的可用性并非易事,比较常见的做法是将系统部署到多台机器上,每台机器都对外提供同样的功能,这就是集群.系统变为集群时,除了要求系统能够支持水平伸缩外,还要解决两个问题: 1, 如何均衡地访问到提供业务功能的机器. 2, 如何保证当机器出现问题时,用户能自动跳转到另外的机器,不影响使用. 常用的负载均衡技术有硬件和软件两种,本示例常用软件的技术实现.软件也有很多实现技术,如基于apache的mod_jk以及mod