MyException - 我的异常网
当前位置:我的异常网» Apache » Apache + Tomcat + JK 实现负载均衡跟集群(状态复

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

www.MyException.Cn  网友分享于:2015-08-26  浏览:0次
Apache + Tomcat + JK 实现负载均衡和集群(状态复制)

原文请见http://www.cnblogs.com/dennisit/p/3370220.html

本文介绍了集群和负载均衡的基本开源实现,实现了用Apache分发请求到多个Tomcat里面对应的应用。

模块介绍

- Apache作为Web服务器,用于处理静态Http请求;

- Tomcat作为应用服务器(Servlet容器),处理动态请求;

- JK 作为Apache与Tomcat之间的桥梁,实现了Apache与Tomcat一对多的对应,使后端Tomcat负载均衡。

开发环境

- Windows 7操作系统

- Java SE8

- Apache 2.2.14    (本地安装路径:D:\Apache2.2\)

- Tomcat 7.0.42  ( http://tomcat.apache.org/download-70.cgi ),如果在同一台机器上模拟,下载zip版本. 实例中展示了2个节点

- mod_jk: 1.2.37:  ( http://tomcat.apache.org/download-connectors.cgi )


安装步骤:


1.安装jdk
2.安装Apache2.2,使用默认设置,并且安装路径中不要空格.
3.解压tomcat
4.拷贝mod_jk.so到Apache安装路径的modules文件夹下


配置步骤

修改Apache配置:

关于修改涉及到的文件httpd.confworkers.properties文件可以下载一份mod_jk的源码包参看

1.修改Apache配置文件httpd.conf(笔者路径:D:\Apache2.2\conf\httpd.conf), 在最后一行末尾添加:

include "D:\Apache2.2\conf\mod_jk.conf"

2. 在httpd.conf 同目录下新建mod_jk.conf文件

#加载mod_jk Module 
LoadModule jk_module modules/mod_jk.so

#指定 workers.properties文件路径
JkWorkersFile conf/workers.properties

#指定哪些请求交给tomcat处理,"controller"为在workers.propertise里指定的负载分配控制器名
JkMount /* controller

3.在httpd.conf同目录下新建 workers.properties文件

#这里可以配置任意多个Tomcat,此处配置了2个Tomat服务器.
#host和port根据自己实际配置.实例配置的是本机两个tomcat,分别使用不同的端口.避免冲突
#如果Tomcat不再同一机器上,没必要改端口的。


#server 列表
worker.list=controller,tomcat1,tomcat2  


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

worker.tomcat1.port=9988        #ajp13 端口号,在tomcat下server.xml配置,默认8009
worker.tomcat1.host=localhost        #tomcat的主机地址,如不为本机,请填写ip地址
worker.tomcat1.type=ajp13
worker.tomcat1.lbfactor=1        #server的加权比重,值越高,分得的请求越多

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

worker.tomcat2.port=9999        #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


#指定此负载平衡器负责的Tomcat应用节点。

worker.controller.balanced_workers=tomcat1,tomcat2   #指定分担请求的tomcat

#此处指定集群是否需要会话复制,如果设为true,则表明为会话粘性,不进行会话复制,当某用户的请求第一次分发到哪台
#Tomcat后,后继的请求会一直分发到此Tomcat服务器上处理;如果设为false,则表明需求会话复制。

worker.controller.sticky_session=false      #设为false,则表明需求会话复制。

修改Tomcat配置:
说明,如果修改了tomcat配置文件,最好将文件编码转换成utf-8格式.
因为实例中我们定义了2tomcat处理分发.所以我们将tomcat的解压版本(zip)格式复制一份.用来分别担当不同的分发处理角色这里因为在一台机器上,所以我们使用zip版本的,当然你某个分发处理机器上只一个tomcat服务器的话,可以选择安装版本的.这里推荐使用解压版的.tomcat6的配置方式跟7一致.

tomcat-node1为实例

1.修改分发tomcat对应的service.xml文件,保证Apache对应的 workers.properties中的AJP13connectorport.
 <!-- 定义一个AJP 1.3 连接端口为9988 ,默认值为8009,这里我们改成我们自己定义的9988端口 -->
    <Connector port="9988" protocol="AJP/1.3" redirectPort="8443" />

2.增加jvmRoute的值,保证同workers.properties里边配置的值一致

    <!--增加jvmRoute,值为在Apache中配置的list集群结点中的值,这里定义为tomcat1结点-->
    <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">

3.去掉默认注释掉的集群配置

  <!--取消集群结点相关的注释,该句默认值注释掉的,我们需要配置集群所以去掉注释,让其起作用-->
    <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>

如果我们的tomcat结点分布在不同的机器上,那么我们的集群至此已经配置完成.去掉多余注释,显示做了修改的部位

修改前

<!-- Define an AJP 1.3 Connector on port 8009 -->
    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

    <!-- You should set jvmRoute to support load-balancing via AJP ie :
    <Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">
    -->
    <Engine name="Catalina" defaultHost="localhost">

    <!--For clustering-->
    <!--
    <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
    -->

修改后的tomcat-node1


<!-- 定义一个AJP 1.3 连接端口为9988 ,默认值为8009,这里我们改成我们自己定义的9988端口 -->
    <Connector port="9988" protocol="AJP/1.3" redirectPort="8443" />

    <!--增加jvmRoute,值为在Apache中配置的list集群结点中的值,这里定义为tomcat1结点-->
    <Engine name="Catalina" defaultHost="localhost"  jvmRoute="tomcat1">

    <!--取消集群结点相关的注释,该句默认值注释掉的,我们需要配置集群所以去掉注释,让其起作用-->
    <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>

修改后的tomcat-node2


<!-- Define an AJP 1.3 Connector on port 8009 -->
    <Connector port="9999" protocol="AJP/1.3" redirectPort="8443" />

    <!-- You should set jvmRoute to support load-balancing via AJP ie :
    <Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">
    -->
    <Engine name="Catalina" defaultHost="localhost"  jvmRoute="tomcat2">

    <!--For clustering-->
    <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>

说明:这里的protocol="AJP/1.3",连接以及jvmRoute需要保证同我们在Apache服务器中配置的works.properties一致.修改完后最好将service.xml文件的编码设置为utf-8格式.否则可能tomcat启动会出错.


4.实例中我们的两个tomcat结点在同一台机器上,所以还需要保证protocol="HTTP/1.1"的端口不一致.不然本地的两个tomcat会起冲突

下面为笔者实例中解决同一台机器上多个tomcat服务器之间端口冲突做的修改.

Tomcat--node1

Tomcat-node2

<Server port="9995" shutdown="SHUTDOWN">
……
 <Connector port="9990" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
……


说明:这里的protocol="HTTP/1.1"配置的相关端口之间不能冲突,而且也不能同本机其它应用程序占用的端口冲突.否则可能会报错.

实例测试

1.在web.xml文件中增加

<distributable/>


2.编写测试jsp代码

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ page import="java.text.SimpleDateFormat"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>Tomcat集群测试</title>
  </head>
  
  <body>
        服务器信息:

    <%
      String dtm = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date());
      System.out.println("["+request.getLocalAddr()+":"+ request.getLocalPort()+"]" + dtm);
      out.println("<br>["+request.getLocalAddr()+":" +request.getLocalPort()+"]" + dtm+"<br>"); 
    %>
    
    session分发:
    <%
        session.setAttribute("name","dennisit");
        System.out.println("[session分发] session id:"+session.getId());
        out.println("<br>[session分发] session id: " + session.getId()+"<br>");
    %>
  </body>
</html>

3.测试负载均衡与session分发

将项目部署到每个集群结点中,即实例中的tomcat_node1tomcat_node2,依次移动Apachetomcat服务器,tomcat服务器之间的启动顺序随意.这里Apache端口使用默认的80.


上面是在FireFox中运行项目后刷新3次执行的效果,可以看到2tomcat分发结点之间轮流负载.而且两台服务器上的session值是一样的.说明session分发成功.

附录:

ApacheTomcat的区别:
Apache是一个web服务器环境程序,可以作为web服务器使用。不过只支持静态网页,如(asp,php,cgi,jsp)等动态网页的就显得无能为力。
如果想让服务器也能处理动态页面,那么就需要Tomcat

当处理静态页面时,Tomcat不如Apache迅速。Tomcat不象Apache一样可配置(如:可以作为一个代理服务器,即loadbalaner)

Tomcat不象Apache一样强壮。

基于以上原因,一个现实的网站使用一个Apache作为Web服务器,为网站的静态页面请求提供服务;并使用Tomcat服务器作为一个Servlet/JSP插件,显示网站的动态页面。

 

Apache,Tomcat负载均衡和集群

对请求的处理又有两种不同的方式:负载平衡、状态复制(即集群).
负载平衡:每台服务器都是独立的,只是对请求的负载进行平衡,而不对状态(SESSION)进行复制。
状态复制(集群):先进行负载平衡,再在各服务器间复制应用状态。

 

Apache+Tomcat构建企业级应用

1.Apache主要用来解析静态文本,htmltomcat也有此功能,但apache能大大提高效率,对于并发数较大的企业级应用,能更好的显示Apache的高效率;  
2.Tomcat 用来解析jsp,servlet,所有的客户请求首先会发送到apache,如果请求是静态文本则由apache解析,并把结果返回给 客户端,如果是动态的请求,如jspapache会把解析工作交给tomcat,由tomcat进行解析(这首先要两者现实整合),tomcat解析完 成后,结果仍是通过apache返回给客户端,这样就可以达到分工合作,实现负载均衡,提高系统的性能!


版权声明:本文为博主原创文章,未经博主允许不得转载。

文章评论

Google伦敦新总部 犹如星级庄园
Google伦敦新总部 犹如星级庄园
Java程序员必看电影
Java程序员必看电影
老程序员的下场
老程序员的下场
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
2013年中国软件开发者薪资调查报告
2013年中国软件开发者薪资调查报告
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
编程语言是女人
编程语言是女人
那些性感的让人尖叫的程序员
那些性感的让人尖叫的程序员
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
代码女神横空出世
代码女神横空出世
程序员和编码员之间的区别
程序员和编码员之间的区别
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
10个调试和排错的小建议
10个调试和排错的小建议
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
程序员必看的十大电影
程序员必看的十大电影
程序员应该关注的一些事儿
程序员应该关注的一些事儿
程序员都该阅读的书
程序员都该阅读的书
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
2013年美国开发者薪资调查报告
2013年美国开发者薪资调查报告
漫画:程序员的工作
漫画:程序员的工作
鲜为人知的编程真相
鲜为人知的编程真相
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
一个程序员的时间管理
一个程序员的时间管理
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
我是如何打败拖延症的
我是如何打败拖延症的
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
那些争议最大的编程观点
那些争议最大的编程观点
为什么程序员都是夜猫子
为什么程序员都是夜猫子
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
如何成为一名黑客
如何成为一名黑客
旅行,写作,编程
旅行,写作,编程
我的丈夫是个程序员
我的丈夫是个程序员
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
中美印日四国程序员比较
中美印日四国程序员比较
 程序员的样子
程序员的样子
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
总结2014中国互联网十大段子
总结2014中国互联网十大段子
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有