博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Apache+Tomcat cluster 实践
阅读量:6372 次
发布时间:2019-06-23

本文共 3337 字,大约阅读时间需要 11 分钟。

hot3.png

近来我们的程序部署给客户,不过有些客户提出了更高的性能,以及更好的利用客户的硬件资源的要求. 我们的程序很简单, Java写的基于spring框架的webservice,部署在tomcat7上。

程序后台可以访问数据库,程序也有逻辑来维护额外的session信息,所以我想尝试下session可用度。

Cluster配置还是比较简单的,我基于如下文章和官方帮助。

简单说有3块,

1。 配置Apache的load balance, 可以试用mod_jk或mod_proxy, 我还没有试验过nginx,以后有机会尝试。

     配置以后,mod_jk可以把请求进行负载均衡,通信使用ajp协议,跳转到相应的tomcat节点.

     如果web程序是有session的,在配置中要把stickySession设置为true

2. tomcat 这边最重要的是web app中,加上<distributable/> element在web.xml中。

3。配置1和2后,程序可以做到load balance,但是还做不到high availability,因为session仍然是某一个节点的独有资源,一旦该节点挂掉,那么Apache就会把请求分配给其它节点,此时该请求被作为新请求,原来session信息丢失。

  解决方法是session replication.这个tomcat cluster的功能,涉及大堆信息和配置。一般使用multicast,来动态发现新的节点。可能我的两台机器都在不同网段,所以死活不能互相发现,session复制不工作。郁闷。。。暂时放弃,毕竟不是生产环境。

  我还尝试了静态节点的方式,就是直接配置节点ip和端口,时间不多,没有尝试成功。

思考1,对于特殊的session管理部分(管理session,时间,用户登录状态等),如何让这些信息也被复制呢,是不是需要特别的接口,来程序调用呢? 

---待续(2)

今天尝试了在同一天机器上配置多个tomcat7的实例,配置如下:

在磁盘的任何位置,创建一个目录作为tomcat instance2, 复制如下目录:

    • conf contains configuration files and related DTDs. The most important file located here is server.xml.

    • logs holds log and output files.

    • webapps is where you put the applications.

    • work – Tomcat translates and converts any JavaServer Pages (JSP) into servlets and stores them here.

    • temp is used for temporary files.

 然后修改 server.xml,主要是一些端口,避免和instance1重叠。

    
    
    

当然了,此时apache的httpd.conf,需要修改tomcat2的节点配置。

哦克了,启动,可以看到如下log,证明multicast组可以工作了

INFO: Received member disappeared:org.apache.catalina.tribes.membership.MemberImpl[tcp://{155, 35, 104, 217}:4000,{155, 35, 104, 217},4000, alive=1981323, securePort=-1, UDP Port=-1, id={-78 108 -27 15 35 6 65 -39 -74 -45 -13 47 98 -106 -35 49 }, payload={}, command={66 65 66 89 45 65 76 69 88 ...(9)}, domain={}, ]Jul 18, 2014 5:33:41 PM org.apache.catalina.ha.tcp.SimpleTcpCluster memberAddedINFO: Replication member added:org.apache.catalina.tribes.membership.MemberImpl[tcp://{155, 35, 104, 217}:4000,{155, 35, 104, 217},4000, alive=1015, securePort=-1, UDP Port=-1, id={120 69 126 41 -80 -91 76 -60 -128 7 -15 -108 -37 3 25 127 }, payload={}, command={}, domain={}, ]

不过故事还没有完,启动会发现log有一个错误:

Unable to process request in NioReceiver java.net.SocketException: Invalid argument: no further information at sun.nio.ch.Net.setIntOption0(Native Method) at sun.nio.ch.Net.setSocketOption(Net.java:261) at sun.nio.ch.SocketChannelImpl.setOption(SocketChannelImpl.java:162) at sun.nio.ch.SocketAdaptor.setIntOption(SocketAdaptor.java:296) at sun.nio.ch.SocketAdaptor.setTrafficClass(SocketAdaptor.java:391) at org.apache.catalina.tribes.transport.nio.NioReceiver.listen(NioReceiver.java:273) at org.apache.catalina.tribes.transport.nio.NioReceiver.run(NioReceiver.java:353) at java.lang.Thread.run(Thread.java:717)

解决方案:把jdk1.7.0_01换成jdk1.6.0_30一切就正常了。 

至此,Load Balance 和 High Availability应该工作了。

测试:访问:,返回:

Server Info: localhost : 80ID A300BA1E92D168A5902BB488AF24C9DC.tomcat1155.35.104.217 This is responsed by 198.126.0.1Host Name : mywork2Time : Fri Jul 18 17:44:16 GMT+08:00 2014

这时,停掉tomcat1, 继续访问这个网址,会发现反应迟钝,然后最后还是返回了,观察session Id没有变化,说明session replication 和 migration成功。

思考2

实践证明,对于有额外session信息的应用,如我们的应用, web service要绑定session 和用户信息,并有一些validation的操作,这些信息tomcat是不知道的。那么就需要人为复制了,有些文章里说,可以存储在另一个中央server上,比如某mysql,mongodb上等,然后每次validating是从这些server同步信息,这是一个策略。

我的另一个想法应该也可行,那就是配置session复制的额外信息,然后程序收到复制的信息,及时恢复session信息。不知道谁有经验?

转载于:https://my.oschina.net/zhujinbao/blog/291658

你可能感兴趣的文章
Extend Volume 操作 - 每天5分钟玩转 OpenStack(56)
查看>>
IronPython教程
查看>>
squid via检测转发循环
查看>>
计算分页
查看>>
iptables 做nat路由器脚本
查看>>
数据结构(C语言版)第三章:栈和队列
查看>>
Stopping and/or Restarting an embedded Jetty in...
查看>>
Oracle存储过程中的数据集输入参数
查看>>
vsftp 配置
查看>>
VCSA中配置时间和时区,实测至6.5适用
查看>>
高并发IM系统架构优化实践
查看>>
产品经理教你玩转阿里云负载均衡SLB系列(一):快速入门--什么是负载均衡
查看>>
有关linux--进程组、会话、守护进程详解
查看>>
我的友情链接
查看>>
monkeyrunner运行Python脚本来检查apk渠道和验证是否可以调用微信
查看>>
github获得SSH Key解决Permission denied (publickey)问题
查看>>
用java代码编写Oracle存储过程
查看>>
APACHE转发
查看>>
android-market-api
查看>>
解決 yum update錯誤:[Errno -1] Metadata file does not match checksum
查看>>