强大的订票网站12306.cn给了我们一个教训,如果不想自己做的网站遇到用户多的情况就频繁崩溃,除了要好好的设计自己网站之外,还应该考虑点架构的问题了,所以先看下负载均衡的内容。
负载均衡,想想其实很简单,就是一个tomcat忙不过来了,就让多个tomcat来做,可是请求来了到底应该用哪个tomcat来处理呢,这时候需要一个分发任务的tomcat,所以我们引入了apache 服务器。
我们引入的apache应该要有如下功能:
1.能够分发请求到N个tomcat中
2.能够尽量让每个tomcat工作量基本平均
3.某个tomcat离开了,apache就不要请求分给他了,而是分给其它人。
对于TOMCAT呢,除了正常功能外,需要哪些额外的功能呢?
1.客户端应该不能感觉到请求分到不同tomcat时的差异
废话就写这么多,希望给不理解负载均衡的人一些提示吧。
接下来做个简单的例子,从最熟悉的tomcat说起,我们把这个系统分成几部分:
一、tomcat session共享
二、apache 请求分发
//TODO
Tomcat session共享
tomcat 官方文档中有这方面的介绍,我们下载tomcat目录下/webapps/docs就有html 格式的文档。如果没有怎么办,很简单下个有的吧。
cluster-howto.html这个文件有很详细的解释了,考虑到是E文,我就做简单的解释吧,不过我E文也很烂,翻译基本靠“有道”,你懂的。
实现session共享你有两个文件需要修改,考虑到不同版本的tomcat可能配置信息不一样,目前我试验的tomcat版本为:7.0.26
1.修改catalina_home/conf/server.xml
你应该能在配置文件里面发现这样的代码
- <!-- You should set jvmRoute to support load-balancing via AJP ie :
- <Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">
- -->
你可以去掉注释然后再里面加入接下来的内容,可以不动他,完全拷贝如下配置信息到上续代码下面
- <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"
- <span style="background-color: #ffff00;">port="45564"</span>
- frequency="500"
- dropTime="3000"/>
- <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
- address="auto"
- <span style="background-color: #ffff00;">port="4000"</span>
- 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>
如果在一台机器上测试,端口需要保证唯一,我把可能需要改的都用黄色警示下,除了修改新加入的部分,还要修改默认的配置,为了初学者方便我也给标出来,这里只给出要修改的
- <Server port="8006" shutdown="SHUTDOWN">
- <!-- Define an AJP 1.3 Connector on port 8009 -->
- <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
- <Connector port="8080" protocol="HTTP/1.1"
- connectionTimeout="20000"
- redirectPort="8443" />
官网上有如下一段话
To run session replication in your Tomcat 7.0 container, the following steps should be completed:
- All your session attributes must implement
java.io.Serializable
- Uncomment the
Cluster
element in server.xml - If you have defined custom cluster valves, make sure you have the
ReplicationValve
defined as well under the Cluster element in server.xml - If your Tomcat instances are running on the same machine, make sure the
tcpListenPort
attribute is unique for each instance, in most cases Tomcat is smart enough to resolve this on it's own by autodetecting available ports in the range 4000-4100 - Make sure your
web.xml
has the<distributable/>
element - If you are using mod_jk, make sure that jvmRoute attribute is set at your Engine
<Engine name="Catalina" jvmRoute="node01" >
and that the jvmRoute attribute value matches your worker name in workers.properties - Make sure that all nodes have the same time and sync with NTP service!
- Make sure that your loadbalancer is configured for sticky session mode.
- 解释如下.
- 所有session属性必须实现
java.io.Serializable接口
- 在server.xml中去掉"Cluster"元素的注释
- 如果你定义了集群阀门(什么东西?),确定你在Cluster元素中有ReplicationValve定义
- 如果你tomcat运行在同一台机器上,请确保端口唯一
- 确定你web.xml 中有
<distributable/>的元素(节点吧,不习惯元素这个说法)
- 如果你使用mod_jk,设置
<Engine name="Catalina" jvmRoute="node01" >,
jvmRoute这个属性,并且保证唯一吧,因为接下来你负载均衡会用到。
- 时间保持一致
- 确保你的负载均衡配置了粘性会话模式
好了,一个配置文件已经修改完了,剩下一个,项目的配置文件web.xml
2、修改catalina_home/webapps/你的项目/WEB-INF/web.xml
很简单,添加一行即可<distributable/>
添加一个测试的jsp到你的项目中去,testCluster.jsp,直接拷贝吧,我也是拷贝网上的
- <%@ page contentType="text/html; charset=GBK" %>
- <%@ page import="java.util.*" %>
- <html><head><title>Cluster Test</title></head>
- <body>
- <%
- //HttpSession session = request.getSession(true);
- System.out.println(session.getId());
- out.println("<br> SESSION ID:" + session.getId()+"<br>");
- // 如果有新的请求,则添加session属性
- String name = request.getParameter("name");
- if (name != null && name.length() > 0) {
- String value = request.getParameter("value");
- session.setAttribute(name, value);
- }
- out.print("<b>Session List:</b>");
- Enumeration<String> names = session.getAttributeNames();
- while (names.hasMoreElements()) {
- String sname = names.nextElement();
- String value = session.getAttribute(sname).toString();
- out.println( sname + " = " + value+"<br>");
- System.out.println( sname + " = " + value);
- }
- %>
- <form action="testCluster.jsp" method="post">
- 名称:<input type=text size=20 name="name">
- <br>
- 值:<input type=text size=20 name="value">
- <br>
- <input type=submit value="提交">
- </form>
- </body>
- </html>
测试逻辑是这样的,访问tomcatA,提交一个键值对到session中,访问tomcatB,看是否看到这个键值对,修改也一样,图就不截了。
我的问题:
在一台机器测试的时候两个tomcat,session可以同步,不在一台机器的时候session不能同步,据说跟"<Membership> 和 <Receiver>有关系,因为 membership是广播地址。。。。具体怎么解决还不知道,如果你知道麻烦提示下。
顺便说下,这种集群不要大于4台(官网也这么推荐的),否则网络带宽被大量的占用
相关推荐
标题中的“nginx实现多个tomcat7直接session共享所需jar包”指的是在分布式系统环境中,使用Nginx作为反向代理服务器,将用户请求分发到多个Tomcat7应用服务器上,同时实现用户会话(Session)在这些服务器之间的...
linux.tomcat-session共享.redis.安装包
标题中的“tomcat8+memcached session共享”指的是在Tomcat 8服务器中利用Memcached进行session共享的技术实践。在分布式系统中,session共享是一个重要的问题,因为用户在访问不同的服务器节点时,需要保持登录状态...
本教程将详细介绍如何利用Tomcat 8或9以及Redis实现Session共享,支持Redis集群,以提高系统的可伸缩性和数据一致性。 首先,我们需要理解Session的概念。Session是服务器端用于存储用户状态的一种机制,通常在用户...
在这个场景中,我们关注的是如何在Tomcat集群环境中实现Session共享,以便提高应用程序的可扩展性和可用性。标题和描述提到的“session共享包”是解决这一问题的关键。 **什么是Session?** 在Web应用中,Session是...
本篇文章将探讨如何利用Redis、Tomcat和Nginx来实现Session共享,以便在分布式环境中保持用户状态的一致性。 首先,让我们了解一下Session的概念。Session是Web服务器用来跟踪用户状态的一种机制。当用户登录后,...
"nginx+tomcat shiro实现多tomcat下session共享"这一主题,就是探讨在这样的架构中,如何有效管理和共享session。 1. **Nginx的作用**: Nginx是一个高性能的HTTP和反向代理服务器,常用于负载均衡,可以将用户的...
此压缩包为tomcat8利用redis实现session共享所需要的jar包,包含(commons-pool2-2.6.0.jar、jedis-2.9.0.jar、tomcat-redis-session-manager.jar)直接将三个jar包复制Tomcat目录lib下面,在修改conf下context.xml...
标题 "Tomcat7+Redis+Session 负载之后session 共享 tomcat jar包" 涉及的是在使用Nginx做负载均衡时,如何通过集成Redis来实现Tomcat7服务器之间的Session共享,从而确保用户在不同服务器之间切换时仍然能够保持...
tomcat session共享 redis
综上所述,实现Tomcat集群session共享主要涉及Tomcat的session管理机制、Redis的集成以及相应的配置和优化。通过合理配置,可以确保在高并发环境下提供无缝的用户体验,同时提升系统的可扩展性和可靠性。
在IT行业中,尤其是在Web...总的来说,通过使用Tomcat和Redis,我们可以构建一个高效且可扩展的session共享方案,为大型Web应用提供稳定的服务。同时,这也体现了IT行业对高并发、分布式处理能力的需求以及应对策略。
包含的jar包如下: commons-pool2-2.0.jar jedis-2.5.2.jar tomcat-juli-adapters.jar tomcat-juli.jar tomcat-redis-session-manager1.2.jar
标题中的“memcached+tomcat7共享session所需要的jar包”是指使用Memcached作为分布式缓存系统,实现Tomcat7服务器间的Session共享。这通常是为了在集群环境中解决Session复制或粘滞会话的问题,提高Web应用的可扩展...
在分布式系统中,Tomcat集群的session共享是一个重要的议题,特别是在高并发、高可用的Web应用环境中。这里的“tomcat集群session共享jar(三个)”指的是实现Tomcat集群间session共享所需的一些关键组件或者库。...
当我们谈论“Tomcat7集群实现session共享”时,我们关注的是如何在多个Tomcat实例之间有效地同步用户会话信息,以便在集群环境中提供高可用性和负载均衡。 首先,理解session共享的重要性。在Web应用中,session是...
本篇文章将深入探讨Tomcat集群中session共享的解决方案,以及相关的应用知识。 1. **Session复制**:这是最基础的session共享方法。通过配置Tomcat的`cluster`模块,可以设置session复制策略。每当一个session在...
在构建分布式系统时,Session共享是一个关键问题,特别是在使用Linux上的Tomcat服务器集群与Nginx作为反向代理的情况。标题“tomcat-session共享”和描述中提到的问题,主要是指如何在多台Tomcat服务器之间以及通过...
接下来,我们将介绍如何配置Tomcat以使用Redis进行Session共享: 1. 安装Redis:在所有参与集群的服务器上安装并启动Redis服务,确保它们可以通过网络互相通信。 2. 添加Redis Session Manager:在Tomcat的web应用...