热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

Tomcat集群中如何同步Session

因为最近的项目要用到多web服务器实现访问负载和集群,负载调度使用的是LVS,而非apache的负载调度,因为在高访问量和大并发量的时候LVS的性能比APACHE好。然后在web服务器上是使用tomcat5.5.25做应用服务器,对于tomcat的集群有两种方式,这个主要是针对sess
因为最近的项目要用到多web服务器实现访问负载和集群,负载调度使用的是LVS,而非apache的负载调度,因为在高访问量和大并发量的时候LVS的性能比APACHE好。然后在web服务器上是使用tomcat5.5.25做应用服务器,对于tomcat的集群有两种方式,这个主要是针对 session而言的。一种就是sticky模式,即黏性会话模式;另外一种就是session复制模式了。所谓sticky模式就是说同一个用户的访问请求都被派送到同一个tomcat实例上,这样我们就无须在多台服务器之间实现session共享了,这是其好处,不好的地方就是不能实现 failureover了,一但用户访问的机器挂掉,那么其session就会丢失。而session复制模式就可以很好的解决failureover的问题,即使某一台web服务器挂掉了,用户的请求还会被负载到其他的web服务器上,而且session也被复制了,这样对用户而言就像是在同一台机器上操作一样,不好的地方就是session复制需要系统资源和网络的开销,尤其是当web服务器多的时候或session里存储的数据量大的时候,这点将会比较的明显(不过自己还没有做这方面的测试)。

针对这两种方式的弊端和好处,我们可以采用将两种方式结合的方式来达到更好的效果,那就是sticky+session复制模式了。用户的请求按照 sticky方式被分发到同一个web服务器上,同时tomcat在后台做异步复制(非同步)session到其他web服务器,这样我们使用 sticky的简便性,同时又有了一定的容错能力。

下面我就将自己的tomcat集群配置经验跟大家分享一下,呵呵。现在想来,其实tomcat的集群配置真的是非常简单,几乎不需要改什么东西了。我今天就在windows上用一台机器来跑两个tomcat实例,下面是一些基础条件:
1.两个tomcat的目录分别为:d:\apache-tomcat-5.5.25-node1和d:\apache-tomcat-5.5.25-node2
2.在每个tomcat目录下的conf\Catalina\localhost目录下建立一个ROOT.xml文件,其内容为:
1
2 3 privileged="true" antiResourceLocking="false" antiJARLocking="false" distributable="true">
4

3.修改apache-tomcat-5.5.25-node1的connector端口为8091,修改apache-tomcat-5.5.25-node2的connector的端口为8092,这样是为了避免在同一机器上同时启动时造成访问端口冲突;
4.修改apache-tomcat-5.5.25-node2的Server端口为8006,与apache-tomcat-5.5.25-node1的Server端口8005不一样,也是避免两个tomcat实例启动时造成程序端口的冲突问题;
5.修改apache-tomcat-5.5.25-node2的AJP/1.3的端口为8019或其他非8009(默认)的端口,也是为了避免与apache-tomcat-5.5.25-node1的AJP/1.3端口冲突;

这样,我们就可以保证每一个tomcat单独启动时都可以提供D:/mywebapps/test1的web服务,注意是单个启动哦,然后分别启动 apache-tomcat-5.5.25-node1和apache-tomcat-5.5.25-node2后,输入如下地址分别进行访问你的web 应用:
apache-tomcat-5.5.25-node1的访问地址:http://localhost:8091/你的页面地址
apache-tomcat-5.5.25-node2的访问地址:http://localhost:8092/你的页面地址
如果你的tomcat没能成功的提供服务,那么你就需要查看一下是否tomcat部署成功了。注意这里的D:/mywebapps/test1就是你的web应用的物理路径了,可以随意修改。下面就开始对server.xml文件的配置了。

找到apache-tomcat-5.5.25-node1目录下的server.xml文件,打开并找到配置Engine的位置,我们在最后加入 jvmRoute="node1",表示这个tomcat的实例名称为node1。修改前后的对比如下:

修改前:

修改后:

然后找到Cluster标签,并取消它的注释即可,无须做任何修改。同样,我们修改apache-tomcat-5.5.25-node2下的 server.xml文件,修改jvmRoute="node2",然后也是注释掉Cluster标签,注意,然后还要修改Cluster标签下的 Receiver标签的tcpListenPort端口号,我们改为4002(默认的是4001),这个是为了避免两个tomcat实例同时启动时造成冲突。

通过上面的配置后,我们两个tomcat已经配置完毕,并且可以完成集群任务了。注意启动的时候不能直接双击其bing目录下的 startup.bat文件,我们还需要为每一个tomcat设置环境变量,分别在apache-tomcat-5.5.25-node1和 apache-tomcat- 5.5.25-node2的根目录下编写一个bat文件,内容如下:

apache-tomcat-5.5.25-node1目录下的startup_node1.bat内容:
set CATALINA_HOME=d:\apache-tomcat-5.5.25-node1
bin/startup.bat

apache-tomcat-5.5.25-node2目录下的startup_node2.bat内容:
set CATALINA_HOME=d:\apache-tomcat-5.5.25-node2
bin/startup.bat

然后分别运行这两批处理文件即可正常启动tomcat了。我们先启动node1,双击startup_node1.bat启动node1。我们可以在窗口的最上面看到如下的输出信息:
2008-1-4 19:12:24 org.apache.catalina.cluster.tcp.SimpleTcpCluster start
信息: Cluster is about to start
2008-1-4 19:12:25 org.apache.catalina.cluster.tcp.ReplicationTransmitter start
信息: Start ClusterSender at cluster Catalina:type=Cluster,host=localhost with n
ame Catalina:type=ClusterSender,host=localhost
2008-1-4 19:12:25 org.apache.catalina.cluster.mcast.McastServiceImpl setupSocket

信息: Setting cluster mcast soTimeout to 500
2008-1-4 19:12:25 org.apache.catalina.cluster.mcast.McastService start
信息: Sleeping for 2000 milliseconds to establish cluster membership
2008-1-4 19:12:27 org.apache.catalina.cluster.mcast.McastService registerMBean
信息: membership mbean registered (Catalina:type=ClusterMembership,host=localhos
t)
2008-1-4 19:12:27 org.apache.catalina.cluster.deploy.FarmWarDeployer start
信息: Cluster FarmWarDeployer started.
2008-1-4 19:12:29 org.apache.catalina.cluster.session.DeltaManager start
信息: Starting clustering manager...:
2008-1-4 19:12:29 org.apache.catalina.cluster.session.DeltaManager start
信息: Register manager to cluster element Host with name localhost
2008-1-4 19:12:29 org.apache.catalina.cluster.session.DeltaManager start
信息: Starting clustering manager at
2008-1-4 19:12:29 org.apache.catalina.cluster.session.DeltaManager getAllCluster
Sessions
信息: Manager []: skipping state transfer. No members active in cluster group.

这表明我们的tomcat集群已经正常启动了。然后我们再运行apache-tomcat-5.5.25-node2目录下的startup_node2.bat以启动node2。然后我们可以可以在窗口的最上方看到如下的信息输出:
2008-1-4 19:16:32 org.apache.catalina.cluster.tcp.SimpleTcpCluster start
信息: Cluster is about to start
2008-1-4 19:16:32 org.apache.catalina.cluster.tcp.ReplicationTransmitter start
信息: Start ClusterSender at cluster Catalina:type=Cluster,host=localhost with n
ame Catalina:type=ClusterSender,host=localhost
2008-1-4 19:16:32 org.apache.catalina.cluster.mcast.McastServiceImpl setupSocket

信息: Setting cluster mcast soTimeout to 500
2008-1-4 19:16:32 org.apache.catalina.cluster.mcast.McastService start
信息: Sleeping for 2000 milliseconds to establish cluster membership
2008-1-4 19:16:32 org.apache.catalina.cluster.tcp.SimpleTcpCluster memberAdded
信息: Replication member added:org.apache.catalina.cluster.mcast.McastMember[tcp
://192.168.1.227:4001,catalina,192.168.1.227,4001, alive=245203]
2008-1-4 19:16:34 org.apache.catalina.cluster.mcast.McastService registerMBean
信息: membership mbean registered (Catalina:type=ClusterMembership,host=localhos
t)
2008-1-4 19:16:34 org.apache.catalina.cluster.deploy.FarmWarDeployer start
信息: Cluster FarmWarDeployer started.
2008-1-4 19:16:35 org.apache.catalina.cluster.session.DeltaManager start
信息: Starting clustering manager...:
2008-1-4 19:16:35 org.apache.catalina.cluster.session.DeltaManager start
信息: Register manager to cluster element Host with name localhost
2008-1-4 19:16:35 org.apache.catalina.cluster.session.DeltaManager start
信息: Starting clustering manager at
2008-1-4 19:16:35 org.apache.catalina.cluster.session.DeltaManager getAllCluster
Sessions
警告: Manager [], requesting session state from org.apache.catalina.cluster.mcas
t.McastMember[tcp://192.168.1.227:4001,catalina,192.168.1.227,4001, alive=248203
]. This operation will timeout if no session state has been received within 60 s
econds.
2008-1-4 19:16:35 org.apache.catalina.cluster.session.DeltaManager waitForSendAl
lSessions

请注意node2窗口输出的不同颜色部分,这个已经表示node2节点和node2节点联系上了。我们再回过来看node1窗口的输出信息,发现多出了如下的信息:
2008-1-4 19:16:34 org.apache.catalina.cluster.tcp.SimpleTcpCluster memberAdded
信息: Replication member added:org.apache.catalina.cluster.mcast.McastMember[tcp
://192.168.1.227:4002,catalina,192.168.1.227,4002, alive=0]
这表明node1也已经侦听到了node2,两个tomcat服务器已经建立了联系。然后我们访问node1的一个地址A,假设这个地址A往 session里设置一个属性,然后我们再在同一窗口中访问node2的一个地址B,假设B是从session里读取这个属性,我们会发现B地址确实得到了这个刚刚我们在node1上设置进去的值。这里要特别注意的是,我们两个地址的分别访问必须是在同一个窗口中,因为我们没有做前端的web负载,所以使用不同的窗口进行访问会出现不同的session(因为端口号不一样,也就导致访问地址不一样了),这样就导致无法查看的问题。


推荐阅读
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 本文介绍了在Hibernate配置lazy=false时无法加载数据的问题,通过采用OpenSessionInView模式和修改数据库服务器版本解决了该问题。详细描述了问题的出现和解决过程,包括运行环境和数据库的配置信息。 ... [详细]
  • 本文介绍了关于apache、phpmyadmin、mysql、php、emacs、path等知识点,以及如何搭建php环境。文章提供了详细的安装步骤和所需软件列表,希望能帮助读者解决与LAMP相关的技术问题。 ... [详细]
  • 本文介绍了使用cacti监控mssql 2005运行资源情况的操作步骤,包括安装必要的工具和驱动,测试mssql的连接,配置监控脚本等。通过php连接mssql来获取SQL 2005性能计算器的值,实现对mssql的监控。详细的操作步骤和代码请参考附件。 ... [详细]
  • Servlet多用户登录时HttpSession会话信息覆盖问题的解决方案
    本文讨论了在Servlet多用户登录时可能出现的HttpSession会话信息覆盖问题,并提供了解决方案。通过分析JSESSIONID的作用机制和编码方式,我们可以得出每个HttpSession对象都是通过客户端发送的唯一JSESSIONID来识别的,因此无需担心会话信息被覆盖的问题。需要注意的是,本文讨论的是多个客户端级别上的多用户登录,而非同一个浏览器级别上的多用户登录。 ... [详细]
  • 目录浏览漏洞与目录遍历漏洞的危害及修复方法
    本文讨论了目录浏览漏洞与目录遍历漏洞的危害,包括网站结构暴露、隐秘文件访问等。同时介绍了检测方法,如使用漏洞扫描器和搜索关键词。最后提供了针对常见中间件的修复方式,包括关闭目录浏览功能。对于保护网站安全具有一定的参考价值。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • mac php错误日志配置方法及错误级别修改
    本文介绍了在mac环境下配置php错误日志的方法,包括修改php.ini文件和httpd.conf文件的操作步骤。同时还介绍了如何修改错误级别,以及相应的错误级别参考链接。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 如何提高PHP编程技能及推荐高级教程
    本文介绍了如何提高PHP编程技能的方法,推荐了一些高级教程。学习任何一种编程语言都需要长期的坚持和不懈的努力,本文提醒读者要有足够的耐心和时间投入。通过实践操作学习,可以更好地理解和掌握PHP语言的特异性,特别是单引号和双引号的用法。同时,本文也指出了只走马观花看整体而不深入学习的学习方式无法真正掌握这门语言,建议读者要从整体来考虑局部,培养大局观。最后,本文提醒读者完成一个像模像样的网站需要付出更多的努力和实践。 ... [详细]
  • 分享css中提升优先级属性!important的用法总结
    web前端|css教程css!importantweb前端-css教程本文分享css中提升优先级属性!important的用法总结微信门店展示源码,vscode如何管理站点,ubu ... [详细]
  • Activiti7流程定义开发笔记
    本文介绍了Activiti7流程定义的开发笔记,包括流程定义的概念、使用activiti-explorer和activiti-eclipse-designer进行建模的方式,以及生成流程图的方法。还介绍了流程定义部署的概念和步骤,包括将bpmn和png文件添加部署到activiti数据库中的方法,以及使用ZIP包进行部署的方式。同时还提到了activiti.cfg.xml文件的作用。 ... [详细]
  • 本文讨论了在shiro java配置中加入Shiro listener后启动失败的问题。作者引入了一系列jar包,并在web.xml中配置了相关内容,但启动后却无法正常运行。文章提供了具体引入的jar包和web.xml的配置内容,并指出可能的错误原因。该问题可能与jar包版本不兼容、web.xml配置错误等有关。 ... [详细]
author-avatar
宝贝小左手很开心
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有