`
suhuanzheng7784877
  • 浏览: 701434 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
Ff8d036b-05a9-33b5-828a-2633bb68b7e6
读金庸故事,品程序人生
浏览量:47681
社区版块
存档分类
最新评论

Apache_proxy负载均衡和Session复制

阅读更多

今天上网查了查资料,之前使用apachejk模块做负载均衡。后来觉得jk的负载配置有点死板,只能按照负载权重值来进行请求的分发,没有做到比较智能的负载平衡,并且使用mod_jk访问页面发现确实比较慢。可能是jk路由到真正的Node Server上比较费时间吧。结合笔者提出的jk的缺点,今天使用mod_proxy来进行负载均衡和路由选择。

之前提出了jk相关的缺点

1):负载均衡权重是在配置文件中写死的。不能根据实际的运行时机器的环境来决定负载均衡的策略,显得比较死板

2):虽然在apache中配置了session共享,但是实际上session并没有在node上进行共享传递。如果一台机器挂了,那么这台机器的客户session也就消失了,容错性比较差

笔者的环境如下:

OSWindows7

HttpServerApache Http Server2.2.17

Tomcatapache-tomcat-6.0.29

下面来看如何加载mod_proxy模块

1.       加载相关apache的模块

在配置文件httpd.conf中放开注释

#加载mod_proxy
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
LoadModule proxy_http_module modules/mod_proxy_http.so

 因为在apache2.2.x版本中自动会有这些模块,所以直接打开注释即可。

修改<IfModule dir_module>内容如下

<IfModule dir_module>
   DirectoryIndex index.html index.jsp
</IfModule>

 在此配置文件的末尾加上如下内容

 

 

 

<VirtualHost *:8011>
         ServerAdmin [email]weijie@126.com[/email]
         ServerName localhost
         ServerAlias localhost
         ProxyPass / balancer://mycluster/ stickysession=JSESSIONID nofailover=Off
         ProxyPassReverse / balancer://mycluster/
	 ErrorLog "logs/error.log"
	 CustomLog "logs/access.log" common
</VirtualHost>

 其中VirtualHost *:8011代表笔者本机的http server端口。

ProxyPass / balancer://mycluster/代表所有的请求都会重定向到balancer://mycluster/处理。balancer是内置负载。

ProxyPassReverse / balancer://mycluster/是反向代理,也就是将所有的请求反向代理到负载均衡后的应用url路径中。

stickysession=JSESSIONID nofailover=Off是做Session复制用的。

之后再将此配置文件末尾加上如下内容,配置Node

ProxyRequests Off
<proxy balancer://mycluster>
	BalancerMember ajp://127.0.0.1:18009 loadfactor=1 route=tomcat7_node1
	BalancerMember ajp://127.0.0.1:28009 loadfactor=1 route=tomcat7_node2
	# status=+H为配置热备,当所有机器都over时,才会请求该机器
	#BalancerMember http://192.168.1.218:8009 status=+H
	#按照请求次数均衡(默认)
	#ProxySet lbmethod=byrequests
	#按照权重
	#ProxySet lbmethod=bytraffic
	#按负载量,也就是往负载少的派发新请求
	#ProxySet lbmethod=bybusyness
	ProxySet lbmethod=bybusyness
</proxy>

 这里不仅配置了2tomcatnode节点,还配置了相关的负载算法策略。ProxySet lbmethod即是负载均衡算法策略。此处使用的是按照负载量,吞吐量少Node的之后可要小心喽,分配到你的任务可就多了。而byrequests策略更偏重的是次数。

这里还要说明的就是<proxy balancer://mycluster>,和上面的ProxyPass要对应上。

2.       之后准备2Tomcat,进行Node的配置

笔者的Tomcat版本是apache-tomcat-6.0.29,本来是要用apache-tomcat-7.0.6的,这个版本有点问题,后来看官方网站说,确实此7.0.6版本有些问题。

首先来看apache-tomcat-6.0.29.2-node1的配置文件

修改关闭端口

<Server port="8005" shutdown="SHUTDOWN">

 修改http服务端口

<Connector port="18080" protocol="HTTP/1.1" 
               connectionTimeout="20000" 
               redirectPort="18443" />

 修改AJP协议端口

<Connector port="18009" protocol="AJP/1.3" redirectPort="18443" />

 这个端口实际上就是与Apache Http Server通讯的通道,Apache会通过AJP协议与Tomcat进行通讯,所以在Apache中配置的Node端口就是此处的端口。

增加jvmRoute名字

<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat7_node1">

 之后最重要的将Tomcat的集群配置放开,内容如下

<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"
						mcastBindAddress="127.0.0.1"
                        port="45564"
                        frequency="500"
                        dropTime="3000"/>
            <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                      address="auto"
					  tcpListenAddress="127.0.0.1"
                      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>

 之后apache-tomcat-6.0.29.2-node2的配置和它差不多,只有一些端口的差异,差异如下

<Server port="8006" shutdown="SHUTDOWN">
………………
<Connector port="28080" protocol="HTTP/1.1" 
               connectionTimeout="20000" 
               redirectPort="28443" />
………………
<Connector port="28009" protocol="AJP/1.3" redirectPort="28443" />
………………
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat7_node2">
………………
            <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                      address="auto"
					  tcpListenAddress="127.0.0.1"
                      port="4001"
                      autoBind="100"
                      selectorTimeout="5000"
                      maxThreads="6"/>

 这样Tomcat算是完成

3.       写一个Web项目测试

测试页面代码如下

<%@ 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">
<%@page import="java.util.*"%>
<%@page import="java.net.InetAddress;"%>
<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
		<title>Cluster App Test</title>
	</head>
	<body>
		<%
			InetAddress ip = InetAddress.getLocalHost();
			//out.println(ip.getHostAddress());
		%>
		This is responsed by
		<font color="red"> <%=ip.getHostAddress()%></font>
		<br>
		Host Name :
		<font color="red"><%=ip.getHostName()%></font>
		<br>
		Time :
		<font color="red"><%=new Date()%></font>
		<br>
		<%
			ip = null;
		%>
		<br />
		<br />
		<br />
		<br />
		Server Info:
		<%
			out.println(request.getLocalAddr() + " : " + request.getLocalPort()
					+ "<br>");
		%>
		<%
			out.println("<br>Session 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("<br/> <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>
			&nbsp;&nbsp;值:
			<input type=text size=20 name="dataValue">
			<br>
			<input type=submit>
		</form>
	</body>
</html>

 WEB-INF\web.xml如下

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
	<distributable/>
	<welcome-file-list>
		<welcome-file>index.jsp</welcome-file>
	</welcome-file-list>
</web-app>

 加入了<distributable/>用于Session复制。

4.       Web项目测试效果

测试效果就是同一个浏览器IESession在不同的Node上共享了一个Session,其中一个Node挂了也不要紧,另一个紧跟着就复制过来了,而且在不同Node上切换也没关系,Session不会丢失的。换一个浏览器FireFox建立一个新Session,互不影响。解决了之前提出的2个问题,1,负载算法可以根据实际请求压力而分担;2Session不用很复杂的配置即可完成Session的复制,并且一个Node挂了也不要紧,Session在另一个节点上也可以正常使用,而且Node在请求的不同阶段切换也没关系,对用户是透明的。

分享到:
评论
5 楼 wxyhaiy 2013-12-30  
我按照配置了,但是起不来服务啊,网上搜索是说端口占用,楼主能帮忙配置一个能起来的吗?我的邮箱whiteflys@vip.qq.com,谢谢。
4 楼 RexLee_ 2013-04-01  
大神,看到你这篇文章太吊了,真是很荣幸,非常喜欢,而且你也各个地方注释的很清楚,,大神 我能把这个文章转到我空间吗 我想保留下来以后学习还会用到
3 楼 zhang3093966 2011-11-03  
楼主的配置是win系统的。我已经配置成功,问题是相同的配置方案在linux下却无法成功。楼主能讲解一下linux的配置方案吗?
2 楼 suhuanzheng7784877 2011-08-12  
tan4836128 写道
很荣幸看到这样的文章,虽然很多地方我看不懂,但是我坚持看完了,

哦,不好意思,可能我的表述不够直白,明确吧。不过你按着步骤配置一下,应该是可以成功的。
1 楼 tan4836128 2011-08-12  
很荣幸看到这样的文章,虽然很多地方我看不懂,但是我坚持看完了,

相关推荐

    apache,tomcat负载均衡和session复制

    当我们谈论"Apache,tomcat负载均衡和session复制"时,这意味着我们要探讨如何在多台服务器之间分配负载,并确保用户会话的无缝迁移和一致性。 **负载均衡**是解决高并发、高可用性问题的重要策略。它通过将来自...

    apache_tomcat负载均衡

    Apache Tomcat 负载均衡是一种优化Web服务器性能和可靠性的技术,它通过将客户端请求分发到多个Tomcat实例上,实现应用服务器间的负载共享,从而提高系统的处理能力和可用性。这种技术常用于大型网站和企业级应用,...

    apache+tomcat负载均衡_proxy模式

    内附完整配置教程和修改后的apache的httpd.conf文件和tomcat的server.xml配置文件,包含test测试项目,不包含apache和tomcat安装文件。 本教程参考网上资料,本机测试成功,如有问题可以私信说明。

    Mod_Proxy+Apache+Tomcat负载均衡与集群配置

    本文档详细介绍了使用mod_proxy模块与Apache和Tomcat结合来实现负载均衡与集群配置的过程。配置前需要准备相应的环境,包括安装JDK、Apache HTTP Server和Tomcat服务器。本文档使用了Tomcat 7.0.2作为应用服务器,并...

    Apache+tomcat负载均衡

    在Apache中配置负载均衡,首先需要安装mod_proxy和mod_proxy_balancer模块。这些模块允许Apache作为反向代理服务器,接收用户请求并转发到适当的Tomcat实例。以下是一个基本的配置示例: ```apacheconf LoadModule ...

    Apache负载均衡 Tomcat6的集群和session的复制

    本篇将深入探讨Apache如何实现负载均衡,以及Tomcat集群和session复制的相关知识。 首先,Apache的负载均衡主要通过模块mod_proxy来实现。这个模块能够将客户端的HTTP请求转发到不同的后端服务器,从而达到负载均衡...

    apche_tomcat负载均衡

    本文将详细介绍如何在Apache Tomcat 7.0和Apache 2.2环境下配置负载均衡,并实现session复制。 **环境配置** 1. 安装JDK1.6:首先确保安装了Sun JDK 1.6,将其安装在默认路径,例如`C:\Program Files\Java\jdk1.6.0...

    .在32位操作系统上配置apache+tomcat集群/负载均衡/session复制

    标题中的“在32位操作系统上配置apache+tomcat集群/负载均衡/session复制”涉及到的是在32位系统环境下,如何构建一个使用Apache HTTP Server作为前端负载均衡器,与多个Tomcat应用服务器协同工作的集群环境,并实现...

    apache配置负载均衡

    Apache 配置负载均衡的优点是可以提高访问性能和可用性,能够将用户的访问请求分流到多个服务器或 Tomcat 中,从而提高系统的整体性能和可用性。同时,Apache 配置负载均衡也可以减少服务器或 Tomcat 的负载,提高...

    nginx_tomcat_redis搭建负载均衡共享session

    在IT行业中,构建高效、可扩展的Web服务是至关重要的,而"nginx_tomcat_redis搭建负载均衡共享session"这个主题则聚焦于如何利用这三个组件——Nginx、Tomcat和Redis来实现这一目标。Nginx是一款高性能的反向代理...

    apache的tomcat负载均衡(两个tomcat)和集群配置(session复制)

    综上所述,配置Apache Tomcat的负载均衡和集群需要结合反向代理服务器和适当的session复制策略。正确实施后,可以显著提升Web应用的可用性和性能,同时为用户提供无缝的会话体验。在实际操作中,务必根据具体环境和...

    Nginx+tomcat负载均衡集群session复制 windos

    本文将详细介绍如何在Windows环境下,利用Nginx作为反向代理服务器,与Tomcat集群配合实现负载均衡,并进行session复制,确保用户会话在不同服务器之间的一致性。 首先,Nginx是一款轻量级、高性能的HTTP和反向代理...

    Windows下Apache2.2+Tomcat6配置集群、负载均衡、session共享

    在Windows环境下,Apache2.2和Tomcat6的组合是一个常见的Web服务器架构,用于搭建集群、实现负载均衡和处理session共享。Apache作为前端反向代理服务器,负责分发请求到后端的多个Tomcat实例,以提高应用的可用性和...

    Apache负载均衡设置方法 mod_proxy使用介绍

    Apache负载均衡设置方法主要依赖于`mod_proxy`模块,这是一种在Apache HTTP服务器中实现负载均衡和反向代理的功能。负载均衡的目标是分散客户端的请求到多个后端服务器,以优化资源利用,提高响应速度,以及增强系统...

    TOMCAT+APACHE集成以及session复制

    在这个"负载均衡和session复制"的压缩包中,可能包含了一个示例配置文件和指南,演示了如何配置TOMCAT和APACHE以实现负载均衡和session复制。这可能包括了Apache的虚拟主机配置、mod_proxy模块的启用、TOMCAT集群的...

    tomcat_apache_mod

    3. **Tomcat集群配置**:在Tomcat中,通过共享session数据和复制应用状态,可以创建一个集群。每个Tomcat实例都需要相应的配置,如server.xml中的Engine、Host和Cluster元素,以及集群间的通信机制设置。 4. **负载...

    apache+tomcat负载均衡整合文档

    Apache的 mod_proxy 模块提供了一个强大的负载均衡解决方案,它可以透明地将请求转发到Tomcat实例集群,实现请求的分发。 以下是实现Apache+Tomcat负载均衡整合的详细步骤: 1. **安装与配置Apache**: - 安装...

    Apache2负载均衡+Tomcat6集群

    Apache2是世界上最广泛使用的HTTP服务器,它提供了多种模块来实现负载均衡,其中最常用的是 mod_proxy 和 mod_proxy_balancer 模块。负载均衡的主要目标是将到达服务器的请求均匀地分发到多个后端服务器,以防止单个...

Global site tag (gtag.js) - Google Analytics