Apache + Tomcat 负载均衡 session复制

C++开发基础之掌握常用的三种异步编程模型 以上是三种常见的C++异步编程模型,每种模型都有其适用的场景和特点。根据具体需求,你可以选择合适的模型来进行异步编程。 阅读详情

http://snowolf.iteye.com/blog/743611

Apache 和 Tomcat原本就是一家,更是一家亲!Apache与Tomcat整合,无非是将Apache作为前端根据请求路径、端口、代理分发给多个Tomcat,以到达转发和负载均衡的目的!同时,通过Apache和Tomcat相互作用,进行粘性会话,会话拷贝构建集群!这一切的最终结果就是“云服务”!不要说Session不重要,当下火爆的团购,如果离开Session还能快活多久?如何保证Session同步,仍然是不能回避的问题! 


这里要说的是基于HTTP和AJP跳转方式的负载均衡实现,关于JK,由于效率问题一直成为诟病,并且mod_jk2模块已经不再被更新了,这里就不折腾它的复杂配置了! 

至于说Apache+Tomcat+SSL,并不是难题!只要完成了Apache+SSL然后配置相应的负载均衡、反向代理等等就可以达到目的,相关Apache+SSL参考 征服 Apache + SSL  

Ubuntu Server 10.04版本,Apache选用2.2.14,Tomcat选用6.0.24。 


相关内容: 
征服 Apache + SSL 
征服 Apache + SVN 
征服 Apache + SVN +  LDAP 
征服 Apache + Tomcat 
征服 Nginx 
征服 Nginx + Tomcat 


步骤: 
  1. 安装Apache基本模块
  2. 后台监控
  3. 负载均衡简单测试
  4. 配置Tomcat相关模块(AJP)
  5. 保持Session唯一,粘性会话
  6. Tomcat集群,Session复制


1.安装Apache相关模块  
负载均衡需要的主要是代理模块! 
经过几次Apache配置尝试,在Ubuntu下配置Apache实在是太容易了。加载什么模块、取消什么模块两个命令搞定。 

Shell代码   收藏代码
  1. #启用模块  
  2. sudo a2enmod <model>  
  3. #禁用模块  
  4. sudo a2dismod <model>  


这里,我们需要让Apache提供代理服务,其中又包含基于http、ftp、ajp等等协议的代理功能,同时还需要负载均衡模块。我们可以通过命令逐个加载: 

Shell代码   收藏代码
  1. #代理核心模块  
  2. sudo a2enmod proxy  
  3. #代理AJP模块  
  4. sudo a2enmod proxy_ajp  
  5. #代理负载均衡模块  
  6. sudo a2enmod proxy_balancer  
  7. #代理HTTP模块  
  8. sudo a2enmod proxy_http  
  9. #代理FTP模块  
  10. sudo a2enmod proxy_ftp  


完成上述操作后,系统会提示重启Apache! 
先不着急重启,现学现卖,了解下Apache的目录结构。在Ubuntu下配置Apache主要是在 /etc/apache2 目录下: 
 
分述: 
  • apache2.conf核心配置文件,一般不需要修改!
  • conf.d目录,里面包含了一些字符集设置,文档等设置!
  • dav_svn.authz和dav_svn.passwd是前面做SVN时,相关权限、密码文件。
  • envvars定义了运行时的用户身份——www-data。
  • httpd.conf是Apache留给我们自己折腾的配置文件,默认为空。apache2.conf会加载这个文件。
  • ports.conf端口默认配置。apache2.conf会加载这个文件。
  • magic为mod_mime_magic模块服务。
  • mods-enabled和mods-available mods-enabled会被apache2.conf加载,里面包含*.load和*.conf文件。*.load文件中是加载相应的模块(位于/usr/lib/apache2/modules/中),而*.conf中是对应的基本配置。但这些文件其实都是链接到mods-available中相应的文件上。当我们通过a2enmod操作时,实际上正是操作了这些软链接。
  • sites-available和sites-enabled 与 mods-enabled和mods-available的关系类似,只是其中包含的是站点内容。

罗嗦了一堆,下面配置负载均衡部分。 
执行修改: 
Shell代码   收藏代码
  1. sudo vi /etc/apache2/mods-available/proxy.conf  

 
上图红框中的内容是原始内容,白框中的内容是我新加的部分。 
注意红框中的配置: 
Conf代码   收藏代码
  1. <Proxy *>  
  2.         AddDefaultCharset off  
  3.         Order deny,allow  
  4.         #Deny from all  
  5.         Allow from localhost ip6-localhost    
  6. </Proxy>  

在默认配置中,Deny from all处于可用状态。当我们配置其他代理节点时,将导致杜绝访问! 使用 Allow from localhost ip6-localhost  限制仅允许本机访问! 
再说,白框中的内容: 
Conf代码   收藏代码
  1. <Proxy balancer://zlex>  
  2.         BalancerMember http://localhost:8080/  
  3.         BalancerMember http://192.168.49.1:8080/  
  4. </Proxy>  

这里,我配置了一个负载均衡节点 balancer://zlex ,其中包含了两个服务 http://localhost:8080/ 和 http://192.168.49.1:8080/ ,一个是虚拟机上的Tomcat、一个是真机上的Tomcat。这里使用的Http的转发方式,当然,使用AJP未尝不可,稍后详述! 
这里的节点次序会有一个先后关系,Apache会将请求按照FIFO的方式调度顺次分配到各个节点上!如果其中有一个节点挂掉,将跳过该节点顺次寻找可用节点。  
再说代理和反向代理: 
Conf代码   收藏代码
  1. ProxyPass /zlex balancer://zlex  
  2. ProxyPassReverse /zlex balancer://zlex  

这里配置,如果要访问 /zlex 路径时,将跳转到 balancer://zlex 上,也就是享受负载均衡! 

2.后台监控  
我们如何知道某个节点负载多少,响应时间多久,服务是否正常呢?Apache提供了负载均衡监控平台: http://localhost/balancer-manager 。但是,这个服务默认是不存在。 
除了用于负载均衡配置、监控的 balancer-manager 还有 http://localhost/server-status 和 http://localhost/server-info  
我们需要添加info模块: 
Shell代码   收藏代码
  1. #系统信息模块  
  2. sudo a2enmod info  

同时,为了能够使用 balancer-manager ,我们需要配置: 
Conf代码   收藏代码
  1. <Location /balancer-manager>  
  2.         SetHandler balancer-manager  
  3.         Order Deny,Allow  
  4.         #Deny from all  
  5.         Allow from localhost ip6-localhost  
  6. </Location>  

把这段代码放到哪?由于它同属系统信息配置,我把它放到了 info.conf 中,说白了就是照猫画虎: 
Shell代码   收藏代码
  1. sudo vi /etc/apache2/mods-available/info.conf  

 
注意,这段代码放到了 <IfModule mod_info.c> 和 </IfModule> 之间! 
现在,我们重启Apache: 
Shell代码   收藏代码
  1. sudo /etc/init.d/apache2 restart  

来看看管理界面 http://localhost/balancer-manager : 


我们再来看看服务器基本信息 http://localhost/server-info : 


上述两个服务需要加载info模块,而服务器状态(server-status)不需要 http://localhost/server-status : 


3.负载均衡简单测试  
疯狂访问 http://localhost/zlex ,直到手酸眼烦! 
我这里故意使用不同了Tomcat界面,来验证自己的配置是否生效。更疯狂的是,我甚至把节点指向了百度、搜狐,来测试负载均衡的效果。如果你细致观察,Apache是将请求顺次分配到各个节点上的。 
如果其中一个节点发生问题(例如,强行关闭一个Tomcat,或配置一个错误节点)Apache将会经过几次尝试后,绕过这个问题节点,寻找可以成功访问的节点。如果这个节点恢复正常使用,Apache将在该Tomcat恢复正常工作后大约1分钟内将该节点标识为可用!  
现在,再看看现在的后台( http://localhost/balancer-manager )啥样子: 
 
如果我们控制一个节点的状态是否可用,该怎么做: 

涉及到负载量,session同步等等,我们最后讨论! 

4.配置Tomcat相关模块(AJP)  
基于Http协议分发并不复杂,但AJP效果更好!一次诡异事件中,内网访问正常,外网访问多次失败,最后通过AJP方式完美解决了! 
在Tomcat中配置AJP也很简单,修改 server.xml 开启AJP模块: 
Shell代码   收藏代码
  1. sudo vi /etc/tomcat6/server.xml   

开启AJP配置: 
Xml代码   收藏代码
  1. <Connector  port="8009" protocol="AJP/1.3"   
  2.                 URIEncoding="UTF-8"  
  3.                 redirectPort="8443" />  

注意使用的端口port="8009",字符集URIEncoding="UTF-8",这是输入框、请求字符集乱码的入口!  
接下里就可以通过AJP方式进行节点分发了。修改 /etc/apache2/mods-available/proxy.conf  : 
Shell代码   收藏代码
  1. sudo vi /etc/apache2/mods-available/proxy.conf    

将 http 改为 ajp ,将 8080 改为 8009 : 
Conf代码   收藏代码
  1. <Proxy balancer://zlex>  
  2.         BalancerMember ajp://localhost:8009/  
  3.         BalancerMember ajp://192.168.49.1:8009/  
  4. </Proxy>  

重启Apache: 
Shell代码   收藏代码
  1. sudo /etc/init.d/apache2 restart   

再看看管理界面 http://localhost/balancer-manager  
 
至此,我们完成了基本负载均衡的基本配置!  

/etc/apache2/mods-available/proxy.conf 还有一些属性: 
noFailOver 是否打开失败转移, On | Off ,默认为Off,添加在 ProxyPass 后面,如: 
Conf代码   收藏代码
  1. ProxyPass /zlex balancer://zlex  stickySession=JSESSIONID noFailOver=On  

如果这样配置,当提供给你服务的服务器发生异常,那么你将一直看着它返回给你503,直到系统恢复正常!  

loadfactor 表示后台服务器负载到由Apache发送请求的权值,默认值为1添加在 BalancerMember 后面: 
Conf代码   收藏代码
  1. <Proxy balancer://zlex>  
  2.         BalancerMember ajp://localhost:8009/  
  3.         BalancerMember ajp://192.168.49.1:8009/  
  4. </Proxy>  


可以实现三种策略: 
  1. 轮询均衡策略的配置
  2. 按权重分配均衡策略的配置
  3. 权重请求响应负载均衡策略的配置


5.Session唯一,粘性会话  
Apache已经可以轻松将内容处理的工作分配给各个Tomcat了! 
当然,这还不够,Session还是个问题! 
WHY?
 
我们来做一系列修改,来检测Session到底出现了什么问题! 
先来改造Tomcat,修改 server.xml : 
Shell代码   收藏代码
  1. sudo vi /etc/tomcat6/server.xml   

修改 <Engine /> 节点,增加 jvmRoute 属性: 
Xml代码   收藏代码
  1. <Engine   
  2.              name="Catalina"   
  3.              defaultHost="localhost"   
  4.              jvmRoute="tomcat1">  

另一个Tomcat设置改为 
Xml代码   收藏代码
  1. <Engine   
  2.              name="Catalina"   
  3.              defaultHost="localhost"   
  4.              jvmRoute="tomcat2">  

通过 jvmRoute ,指定了Tomcat唯一标识! 
然后修改 /etc/apache2/mods-available/proxy.conf  
Shell代码   收藏代码
  1. sudo vi /etc/apache2/mods-available/proxy.conf  

如下: 
Java代码   收藏代码
  1. <Proxy balancer://zlex>  
  2.         BalancerMember ajp://localhost:8009/zlex     route=tomcat1   
  3.         BalancerMember ajp://192.168.49.1:8009/zlex        route=tomcat2   
  4. </Proxy>  
  5.   
  6. ProxyPass /zlex balancer://zlex  
  7. ProxyPassReverse /zlex balancer://zlex  


这里需要通过修改 route 属性,将Apache与Tomcat关联起来! 
注意,Tomcat中定义的jvmRoute需要与Apache定义的route相对应!  
我们来看一下 http://localhost/balancer-manager 发生了什么变化: 

我们注意到route字段有了新的标识,当然,我们也可以通过这个配置界面修改这些信息,但当前修改不会真的修改/etc/apache2/mods-available/proxy.conf文件,Apache重启后将丢失。  

为了更细致的对比进过复杂均衡的结果,这里增加了zlex应用!主要是监控Session的变化! 
只看核心代码: 
Jsp代码   收藏代码
  1. <b>当前SessionID:</b>  
  2. <br />  
  3. <%  
  4.         String sessionID = session.getId();  
  5.         out.println(sessionID);  
  6.         System.err.println("sessionID = " + sessionID);  
  7.   
  8.         // 如果有新的 Session 属性设置  
  9.         String dataName = request.getParameter("dataName");  
  10.         if (dataName != null && !dataName.isEmpty()) {  
  11.                 String dataValue = request.getParameter("dataValue");  
  12.                 session.setAttribute(dataName, dataValue);  
  13.         }  
  14. %>  
  15. <br />  
  16. <br />  
  17. <b>Session属性列表:</b>  
  18.   
  19. <br />  
  20. <%  
  21.         Enumeration<String> e = (Enumeration<String>) session  
  22.                         .getAttributeNames();  
  23.         while (e.hasMoreElements()) {  
  24.                 String name = e.nextElement();  
  25.                 String value = (String) session.getAttribute(name);  
  26.                 out.println(name + " = " + value + "<br>");  
  27.                 System.err.println(name + " = " + value);  
  28.         }  
  29. %>  
  30. <form method="POST">  
  31. <ul style="list-style-type: none;">  
  32.         <li><label for="dataName">键:</label><input size="20" id="dataName"  
  33.                 name="dataName"></li>  
  34.         <li><label for="dataValue">值:</label><input size="20"  
  35.                 id="dataValue" name="dataValue"></li>  
  36.         <li><input type="submit" value="提交" /></li>  
  37. </ul>  
  38. </form>  

将其做成一个名为zlex的web应用,分别部署到两个Tomcat上! 
然后重启Apache: 
Shell代码   收藏代码
  1. sudo /etc/init.d/apache2 restart  

不断刷新 http://localhost/zlex ,看看真正的结果: 
第1次:  
第2次:  
第3次:  
第4次:  
仔细观察,每次请求都按照负载均衡配置的节点次序依次请求到不同的Tomcat上。尤其是当我们通过 jvmRoute 和 route 做了绑定之后,信息更加准确。但是, 仔细观察,每次请求的SessionID都是不一样! 对于纯Web应用,尤其是依靠SessionID区分唯一用户的应用,这将是一场噩梦——解决了服务器压力均衡问题,却带来了SessionID不唯一问题!这就需要SessionID绑定,或者说叫做“会话复制”。 
如果这时候你在页面上提交表单,将键值对保持在session中,在页面刷新后,将无法获得该信息,因为Seesion丢失了!  
接着修改 /etc/apache2/mods-available/proxy.conf ,让SeesionID保持唯一: 
Shell代码   收藏代码
  1. sudo vi /etc/apache2/mods-available/proxy.conf  

增加 stickySession 属性: 
Conf代码   收藏代码
  1. ProxyPass /zlex balancer://zlex  stickySession=JSESSIONID  

stickySession 粘性会话,根据这一属性,浏览器将通过cookie绑定SeesionID。如果这个时候再次访问 http://localhost/zlex ,你会发现,页面不会来回跳转了! 
sticky是什么?  
引用
sticky模式 
利用负载均衡器的sticky模式的方式把所有同一session的请求都发送到相同的Tomcat节点。这样不同用户的请求就被平均分配到集群中各个tomcat节点上,实现负载均衡的能力。这样做的缺点是没有灾难恢复的能力。一旦一个节点发生故障,这个节点上所有的session信息全部丢失; 
同一用户同一session只和一个webServer交互,一旦这个webserver发生故障,本次session将丢失,用户不能继续使用 !



提交一个Session设定看看 http://localhost/zlex : 
 
观察后台日志: 
 
再看看返回页面,这相当于一次页面刷新,如果正常粘性会话,我们将获得当前SessionID对应的一切信息: 
 
这说明粘性会话生效了! 
我们得到了形如
引用
50DAF14C6CDF8ACFBDC1095A5EE8E2CF.tomcat1
的SessionID。这样,我们就能知道当前访问的是哪台服务器了!  
如果,换一个浏览器打开该页面http://localhost/zlex,将会获得一个新的SessionID,并且,根据Apache中配置的负载均衡节点列表依次访问下一个节点! 
如果这时候负载均衡节点列表中某一节点发生异常,那么Apache将按照惯例,跳转该节点,并在该节点恢复正常后约1分钟内重新将其纳入可用节点!
 
修改刚才的jsp页面,看看Http头中都有些什么: 
Jsp代码   收藏代码
  1. <b>Cookie信息:</b>  
  2. <br />  
  3. ${header["cookie"]}  
  4. <br />  
  5. <b>Host信息:</b>  
  6. <br />  
  7. ${header["host"]}  
  8. <br />  

 
sticky模式的根本在于浏览器支持cookie,如果浏览器不支持cookie,则需要修改server.xml文件中的<Context />节点,将cookie置为false,关闭cookie功能,让jsessionid显式传递!  

6.Tomcat集群,Session复制  
经过两天反复研究,两只互不相认的Tomcat终于在网络上“资源共享”了——Session复制成功!  
关于 Tomcat集群以及Session复制 ,网上已经有很多很多,但是否真的能用?!为了确认这一问题,周末还跑到书店翻了翻《Apache Tomcat 高级编程》,参考 Clustering/Session Replication HOW-TO (有点小错误),经过两天苦战,克服种种小问题,终于拿下! 

整理概念: 
引用

群集,是包含多个服务器实例的指定集合,这些服务器实例共享相同的应用程序、资源以及配置信息。您可以将不同计算机上的服务器实例分组到一个逻辑群集中并将其作为一个单元来管理。您可以使用 DAS 轻松控制多机群集的生命周期。 

群集可以实现水平可伸缩性、负载平衡和故障转移保护。根据定义,群集中的所有实例都具有相同的资源和应用程序配置。当群集中的服务器实例或计算机出现故障时,负载平衡器检测到该故障,会将通信从出现故障的实例重定向至群集中的其他实例,并恢复用户会话状态。由于群集中所有实例上的应用程序和资源都相同,因此一个实例可以故障转移至群集中的任何其他实例。


引用
Session复制,主要是指集群环境下,多台应用服务器之间同步Session,确保Session保持一致,且Session中的内容保持一致,对外透明——看起来就像是一台应用服务器! 
如果其中一台服务器发生故障,根据负载均衡的原理,Apache会遍历寻找可用节点,分发请求。与此同时,当前用户Session不能发生数据丢失,其余各节点服务器应保证用户Session数据同步。

Session复制核心内容主要是: 
  1. Session内容序列化(serialize),会消耗系统性能。
  2. Session内容通过广播同步给成员,会造成网络流量瓶颈,即便是内网瓶颈。


因此,Session复制的这两个潜在问题,致使复杂均衡节点最多不会超过4个。因为,当节点数大于4时,整个集群的吞吐量将不再上升!  

为了搭建Tomcat集群,我将两个Tomcat分别部署到两台虚拟机上,确保网段一致。(这一步很关键,我最初将 Tomcat1(192.168.49.132) 部署在虚拟机上,将 Tomcat2(192.168.49.128) 部署在本机上,结果,网络总有问题,耽误了很多时间。  ) 

由于变换了IP,我需要修改Apache的 /etc/apache2/mods-available/proxy.conf 文件: 
Shell代码   收藏代码
  1. sudo vi /etc/apache2/mods-available/proxy.conf   


修改负载均衡节点如下: 
Conf代码   收藏代码
  1. <Proxy balancer://zlex>  
  2.         BalancerMember ajp://192.168.49.128:8009/zlex        route=tomcat1  
  3.         BalancerMember ajp://192.168.49.132:8009/zlex        route=tomcat2  
  4. </Proxy>  


对于windows系统,不需要考虑网络问题,广播地址(这里用到 224.0.0.0 和 240.0.0.0 )默认开放,对于linux则需要通过命令开放地址。 
Ubuntu上开放广播地址(eth0网卡): 
Shell代码   收藏代码
  1. sudo route add -net 224.0.0.0 netmask 240.0.0.0 dev eth0  

然后通过 -v 参数查看当前开放的广播地址: 
Shell代码   收藏代码
  1. route -v  

 

注意,重启后,该路由设置将丢失!  

在Ubuntu下,可以考虑修改 /etc/networks 文件! 


如果有必要,Windows上开放广播地址(192.168.49.128本机地址): 
Cmd代码   收藏代码
  1. route add 224.0.0.0 mask 240.0.0.0 192.168.49.128  

然后通过 print 参数查看当前开放的广播地址: 
Shell代码   收藏代码
  1. route print  

 

然后,修改tomcat的server.xml文件: 
Shell代码   收藏代码
  1. sudo vi /etc/tomcat6/server.xml   

在 <Engine />  节点中加入如下内容: 
Xml代码   收藏代码
  1.   <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"  
  2.          channelSendOptions="8">  
  3.   
  4.   <Manager className="org.apache.catalina.ha.session.DeltaManager"  
  5.            expireSessionsOnShutdown="false"  
  6.            notifyListenersOnReplication="true"/>  
  7.   
  8.   <Channel className="org.apache.catalina.tribes.group.GroupChannel">  
  9.     <Membership className="org.apache.catalina.tribes.membership.McastService"  
  10.                 address="224.0.0.0"  
  11.                 port="45564"  
  12.                 frequency="500"  
  13.                 dropTime="3000"/>  
  14.     <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"  
  15.               address="192.168.49.1"  
  16.               port="4000"  
  17.               autoBind="100"  
  18.               selectorTimeout="5000"  
  19.               maxThreads="6"/>  
  20.   
  21.     <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">  
  22.       <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>  
  23.     </Sender>  
  24.     <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>  
  25.     <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>  
  26.   </Channel>  
  27.   
  28.   <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"  
  29.          filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"/>  
  30.   <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>  
  31.   
  32.   <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>  
  33.   <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>  
  34. </Cluster>   


这里需要注意 <Membership /> 和 Receiver : <Membership /> 节点的 address 属性是广播地址; Receiver 节点的 address 属性是本地绑定地址。当然,默认为 auto 。由于我在启动Tomcat时,Tomcat频频将地址指向 127.0.0.1 ,无奈只好使用固定IP。 
此外,为了降低Session复制的成本,Tomcat通过 <Valve /> 节点,以过滤器的方式控制哪些请求可以忽略Session复制: 
Xml代码   收藏代码
  1. <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"  
  2.        filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"/>  


同时,在<Host>节点中加入如下内容: 
Xml代码   收藏代码
  1. <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"  
  2.           tempDir="/tmp/war-temp/"  
  3.           deployDir="/tmp/war-deploy/"  
  4.           watchDir="/tmp/war-listen/"  
  5.           watchEnabled="false"/>  


在Tomcat的官方文档(Tomcat 6)中,对于<Deployer  />节点的部署位置是错误的,通过观察Tomcat启动日志,确认该节点应当不属于<Host />节点中!  

注意:Tomcat 6与Tomcat5在上述节点中使用的类包(包中名称由cluster变化为ha)有所不同,且结构有所调整。  

先别急着重启,我们需要修改应用中的 web.xml 文件,将 <distributable /> 节点部署到 <web-app /> 节点中,开启分布式服务: 


注意:如果没有设置该节点,SessionID将不能保持同步,不同的服务器将各自建立独立的SessionID!  

监控Tomcat日志: 
Shell代码   收藏代码
  1. tail -f /var/lib/tomcat6/logs/catalina.out   

然后重启Tomcat1: 
Shell代码   收藏代码
  1. sudo /etc/init.d/tomcat6 restart  

观察日志: 

注意两处红框: 
第一处,Cluster启动,并绑定192.168.49.132:4000上,进行TCP通讯,并等待其它成员(Member)。 
第二处,在管理器中注册/zlex,绑定JvmRouteBinderValve。
 

至此,说明集群设置已经生效,但不能说明集群配置成功! 

接着我们启动Tomcat2,观察其日志: 
 
Cluster启动,并绑定192.168.49.128:4000上并发现成员[b]192.168.49.132 ![/b] 
再看Tomcat1的日志: 

Tomcat1发现其成员Tomcat2!这说明TCP通讯已建立,Tomcat成员可以进行Session同步!  
同时,Tomcat成员直接会每隔一个时间段相互侦测/验证其他成员是否正常: 
 

现在,开始访问 http://localhost/zlex ,并不断刷新当前页面: 
 
除了两处标识主机来源的tomcatX不同外,session是完全一致的! 
提交一次修改,并不断刷新当前页: 
 
如果仔细观察,当前SessionID在不断交替变化,这说明负载均衡在起作用! 
我们再来看看2个Tomcat后台日志都做了什么! 
Tomcat1:  

Tomcat2:  
两只猫都打印了相同的内容( a=1 )不同的细节在于,sessionID带有服务器标识! 

如果我们强行关闭Tomcat2: 
首先,Tomcat1会很快侦测到Tomcat2离线,因为这是TCP通讯,成员之间很容易检测到其他成员是否离线!Tomcat1后台日志如下: 

其次,Apache会侦测到Tomcat2发生异常,将其余请求转交给其他节点,即交由Tomcat1处理! 
继续刷新 http://localhost/zlex 当前页面,耐心等待几秒。你会发现,即便再次刷新页面,sessionID仍旧绑定在标识tomcat1服务器上。 
然后,我们恢复Tomcat2服务,Tomcat1会马上侦测到Tomcat2已经恢复正常: 

最后,我们再次刷新当前页,Apache已经将请求分发给Tomcat2了,从后台日志可以看到session信息会很快被同步了! 

如果带有tomcatX标识的sessionID有很多不便之处,可以关闭粘性会话。简单的讲,就是取消Tomcat中[b]server.xml 中 <Engine/ > 节点的 jvmRoute 属性![/b]然后,重启tomcat、apache! 
 
页面提交一个 b=3 ! 

左边为Tomcat1,右边为Tomcat2!SessionID一致! 

除了上述几种方案外,还有 Terracotta 模式。一种第三方集群组件,2009年收购了缓存组件EhCache,可以结合Tomcat、JBoss等多种服务器,提供多种负载均衡、集群等功能实现,且当负载均衡节点超过8个时,仍然能够保持集群吞吐量的线性增长。 
Eclipse插件地址: 
http://download.terracotta.org/eclipse/update  
下载地址: 
http://www.terracotta.org/dl/oss-download-catalog  

至此,Apache + Tomcat成功完成,征服Apache系列暂告一段落! 
作为开博以来的第100帖,算是很成功了!  
SpringBoot中使用FastJson解析Json数据 场景 1.SpringBoot默认配置的是Jackson。 2.项目搭建专栏: https://blog.youkuaiyun.com/BADAO_LIUMANG_QIZHI/column/info/35688 实现 引入fastJson的依赖 <!-- fastjson的依赖 --> <dependency> <groupId>com.alibab... 阅读详情

相关推荐

时序基础模型Timer-S1:十亿参数如何革新时间序列预测

时间序列预测是数据分析与机器学习中的核心任务,旨在基于历史数据预测未来趋势。其原理在于捕捉数据中的趋势、周期性和季节性等时序依赖关系。这项技术的价值在于赋能业务决策,广泛应用于金融风控、能源管理、物联网监控和供应链优化等关键场景。传统方法依赖针对特定任务的专用模型,面临泛化能力弱和开发成本高的挑战。本文聚焦的时序基础模型,通过在海量跨领域数据上进行预训练,学习时序通用模式,并结合十亿级参数带来的强大容量,实现了性能的显著突破。这种范式转变,使得模型能够像“全科医生”一样,通过少量数据微调即可快速适应新任务,

weixin_29164843的博客 269

征服 Apache + Tomcat

<br />Apache 和 Tomcat 原本就是一家,更是一家亲!Apache与Tomcat整合,无非是将Apache作为前端根据请求路径、端口、代理分发给多个Tomcat,以到达转发 和负载均衡 的目的!同时,通过Apache和Tomcat相互作用,进行粘性会话 ,会话拷贝 构建集群 !这一切的最终结果就是“云服务 ”!不要说Session 不重要,当下火爆的团购 ,如果离开Session 还能快活多久?如何保证Session同步 ,仍然是不能回避的问题!<br /><br

IOT之无线网络传输技术 1431

Redis TLS 加密传输实战:从证书生成到安全配置

本文详细介绍了为Redis启用TLS加密传输的完整实战流程。从阐述TLS加密的必要性开始,逐步指导读者生成自签名CA和服务器证书,并深入解析Redis服务端的核心安全配置,包括端口设置、认证模式与性能优化。最后,提供了主流客户端连接示例及生产环境下的排错与运维最佳实践,帮助构建安全的Redis通信通道。

weixin_29274969的博客 516

apache 配置各种参数的说明

1、httpd-vhosts.conf配置关键参数的解释 #虚拟机配置,负载均衡配置  注意空格 &lt;VirtualHost *:8090&gt;     ServerAdmin sun@locahost       ServerName localhost     ServerAlias localhost     ProxyPass / balancer://cluster/ stic...

heqinghua217的博客 6308

Win11下DCMTK的Visual Studio 2022配置教程

最近有个新需求,需要完成读取和解析DICOM数据相关的SDK

qq_45797625的博客 3261

Chromatix 7实战:从零开始调优ISP模块的完整流程(附常见报错解决方案)

本文提供了高通平台Camera调试工具Chromatix 7的完整实战指南。详细阐述了从环境准备、项目初始化、基础校正(如LSC、BPC)到核心ISP管线(Demosaic、CCM、HDR)及后处理(CAC、ANR)的调优全流程,并附带了常见报错(如“未初始化实例”)的解决方案,旨在帮助工程师建立系统性的调试方法论。

weixin_29290863的博客 622

实践中整理出tomcat集群和负载均衡

实践中整理出tomcat集群和负载均衡 (一)环境说明 (1)服务器有4台,一台安装apache,三台安装tomcat (2)apache2.0.55、tomcat5.5.15、jk2.0.4、jdk1.5.6或jdk1.4.2 (3)ip配置,一台安装apache的ip为192.168.0.88,三台安装tomcat的服务器ip分别为192.168.0.1/2/4 (二)安装过程 (1)在三台要...

zhjh17426的专栏 446

ShardingSphere分库分表教程,java后端开发面试题

???? 简介:Java领域优质创作者????、优快云哪吒公众号作者✌ 、Java架构师奋斗者???? ???? 扫描主页左侧二维码,加入群聊,一起学习、一起进步 ???? 欢迎点赞 ???? 收藏 ⭐留言 ???? 目录 一、分库分表 二、分库分表的方式 1、垂直分表 2、垂直分库 3、水平分表 4、水平分库 三、分库分表带来的问题 1、学习成本问题 2、事务问题 3、跨节点join问题 4、跨节点的count、order by、group by以及聚合函数问题 5、数据迁移、容量规划、扩

m0_64205716的博客 3016

Tomcat群集系列第2部分:会话相似性负载均衡器

这是Tomcat群集系列的第二部分。 在第一部分中,我们讨论了如何设置简单的负载均衡器。 我们看到了负载均衡器如何以循环方式将请求分配给tomcat实例。 在本文中,我们讨论在Web应用程序中引入会话时,简单负载均衡器中会出现什么问题。 我们将看到如何解决此问题。 Session如何在Servlet / Tomcat中工作? 在解决问题之前,让我们看一下Tomcat中的会话管理 。 ...

danpob13624的博客 146

20-CUDA规约算法:并行求和优化策略-✨

本文介绍了GPU上高效并行规约(Reduction)算法的优化技巧。规约是将大量数据合并为单个值的基础计算模式,广泛应用于科学计算等领域。文章从基础并行规约实现出发,逐步讲解了三种关键优化策略:1)交错寻址减少共享内存bank冲突;2)循环展开降低分支预测开销;3)多级规约处理大规模数据。性能对比显示,优化策略可带来最高4.5倍的加速效果。最后总结了最佳实践,包括合理使用共享内存、循环展开和warp级优化等技巧。这些优化方法可显著提升GPU计算密集型应用的性能。

2301_79143213的博客 172

基于深度学习的茶叶等级检测识别系统:YOLOv10 + UI界面 + 数据集

YOLOv10是YOLO系列的最新版本,继承了YOLO模型的优点,并对速度和精度进行了优化。YOLOv10在目标检测中使用卷积神经网络(CNN)作为基础,通过改进网络结构和优化训练策略,实现了在更低的延迟下进行高精度的目标检测。本文详细介绍了基于YOLOv10的茶叶等级检测与识别系统的设计与实现过程。我们从数据集准备、模型训练与推理、UI界面设计等多个方面进行了详细讲解,并给出了相应的代码实现。通过本系统,我们可以高效地自动检测茶叶的等级,并通过UI界面直观地展示结果。

YOLO 765

Apache 2.2.10+Apusic 5.1负载均衡应用实践

近日,系统应用突然慢的受不了,有时还不能正常登录,于是下决心将系统负载均衡方案实践下。 环境准备。 负载均衡采用的方式无非是两类,硬件的负载均衡服务器,软件的类Apache的proxy_balancer,其他的方式暂时没有了解,我选择了后者,其一是不要花钱,其二,达到的效果并不逊于硬件设备。好了,方案选定后,开始实施吧,根据apache官方文档,负载均衡配置确实很简单。 实践步骤: 1.加

Kete的技术实践 702

手把手教你学simulink(57.3)--电励磁同步电动机场景示例:基于Simulink的自适应控制(Adaptive Control)电励磁同步电动机

目录基于Simulink的自适应控制(Adaptive Control)电励磁同步电动机项目实例1. 项目背景2. 系统架构2.1 电励磁同步电动机模型2.2 三相逆变器模型2.3 自适应控制器(Adaptive Controller)2.4 系统框图3. 模型设计3.1 创建Simulink模型3.2 自适应控制(Adaptive Control)设计3.3 仿真环境搭建4. 参数优化4.1 自动调优5. 实际应用案例5.1 工业驱动系统5.2 风力发电系统6. 结论需求分析电励磁同步电动机(Electr

MHD0815的博客 505

apache + tomcat集群负载均衡,Session复制

转自:http://jackandroid.iteye.com/blog/627147  无意间看到tomcat 6集群的内容,就尝试配置了一下,还是遇到很多问题,特此记录。apache服务器和tomcat的连接方法其实有三种:JK、http_proxy和ajp_proxy。本文主要介绍最为常见的JK。 环境:PC2台:pc1(IP 192.168.88.118)安装了apache和t

bubaxiu的专栏 1444

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

从480p到4K:FFmpeg+Real-ESRGAN老动画修复全流程实战

视频修复是一项涉及超分辨率重建、去隔行与视频降噪的系统工程,其核心是在放大分辨率的同时恢复有效细节。对于老动画素材,常见的480p片源往往带有隔行扫描、噪点和色带,传统拉伸只会放大缺陷,而AI超分与滤波处理相结合,能够重建线条、平滑色块并改善观感。FFmpeg提供了从片源分析、预处理到色彩校正的完整命令行工具链,Real-ESRGAN则负责将低分辨率画面提升至3840×2160。这套流程可应用于动漫重制、经典影视数字化与存档修复,具有明显的工程实践价值。以具体剧集为例,从片源分析、去隔行、降噪、AI超分、色

weixin_34032792的博客 303

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Apache+Tomcat+keepalived的负载均衡session复制及HA

1 Apache负载均衡 0、关闭防火墙(service iptables stop; chkconfig --level 35 iptables off),    关闭selinux vi /etc/selinux/config   SELINUX=disabled setenforce 0 生效   1、将mod_jk-1.2.31-httpd-2.2.x.so上传至/etc/h...

汪云飞记录本 239

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

apache+tomcat集群 实现负载均衡和session复制

一 安装准备 本次需要安装apache+tomcat集群 来实现负载均衡和集群间session的复制。 本次准备了3台机器,一台安装apache作为前端访问,两台安装tomcat做集群负载均衡 apache 192.168.10.1 apache版本为2.2.20 tomcatA 192.168.10.10 ...

weixin_33877885的博客 173

apache+tomcat负载均衡以及session复制

   1.tomcat的server.xml   //jvmRoute 指定名字是apache认识的唯一表示 &lt;Engine name="Standalone" defaultHost="localhost" jvmRoute="tomcat2"&gt; &lt;!-- &lt;Engine name="Catalina" defaultHost="localhost&quo

J2EE<a href="www.xiongzz.com"></a> 153

linux下apache tomcat ajp_proxy 负载均衡+集群+session 复制

apache-tomcat-7.0.6.tar.gz httpd-2.2.17.tar.gz jdk-6u23-linux-i586.bin 1个apache  2个tomcat在一台机器上,修改其中一个tomcat相关端口,对应如下 8080     8980 8005     8905 8009     8909 4000     4001 1.安装httpd tar zxvf httpd-2.2.17.tar.gz cd httpd-2.2.17 ./confi

ppzlyg的专栏 3572

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

系统环境:Windows XP SP3 ,jdk1.5.0_05 软件版本:apache_2.2.11-win32-x86-openssl-0.9.8i.msi apache-tomcat-6.0.16 apache-tomcat-6.0.18 备注:tomcat可以下载压缩包直接解压就可以,另外也下载整合了APR(Apache Tomcat Native library 1.1.16) ...

enet_java的专栏 186

apache+tomcat集群、负载均衡及session复制

[color=blue][size=medium]一、环境搭建: * 准备机器两台:192.168.0.2、192.168.0.3 * 下载apache2.2.9,地址:http://httpd.apache.org/download.cgi ,安装在192.168.0.2的D:\Apache * 下载apache-tomcat-5.5.26.zip,地址:http://tomcat...

技术交流 141

apache负载均衡和tomcat6集群和session复制

系统环境:Windows XP SP3 ,jdk1.5.0_05 软件版本:apache_2.2.11-win32-x86-openssl-0.9.8i.msi apache-tomcat-6.0.16 apache-tomcat-6.0.18 备注:tomcat可以下载压缩包直接解压就可以,另外也下载整合了APR(Apache Tomcat Native library 1.1.16)

Gavinlib的专栏 1021

Apache2.2+Tomcat6配置集群、负载均衡、session复制随笔

一直以来都在javaeye潜水,得到了很多人的经验分享,这两天在学习tomcat配置集群的过程中,积累了一点东西觉得应该与大家分享。关于Tomcat和Apache的连接方式,请参阅 http://www.ibm.com/developerworks/cn/opensource/os-lo-apache-tomcat/index.html 。详细的配置过程,不再重复描述,请先看看罗代均http://...

teamojiao的专栏 204
上一篇: C语言中的Sleep函数
下一篇: Linux软连接和硬链接
我是一只懒虫
博客等级 码龄17年 147粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值