码迷,mamicode.com
首页 > 其他好文 > 详细

Apache+Tomcat cluster 实践之郁闷

时间:2014-07-21 10:23:42      阅读:239      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   java   color   使用   

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

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

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

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


简单说有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重叠。

    <Server port="XXXX" shutdown="SHUTDOWN">
    <Connector port="XXXX" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
    <Connector port="XXXX" protocol="AJP/1.3" redirectPort="8443" />

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

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

INFO: Received member disappeared:org.apache.catalina.tribes.membership.MemberIm
pl[tcp://{155, 35, 104, 217}:4000,{155, 35, 104, 217},4000, alive=1981323, secur
ePort=-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 memberAdded

INFO: 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应该工作了。

测试:访问:http://localhost/test/test.jsp,返回:

Server Info: localhost : 80

ID A300BA1E92D168A5902BB488AF24C9DC.tomcat1
155.35.104.217 This is responsed by 198.126.0.1
Host Name : mywork2
Time : 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信息。不知道谁有经验?

Apache+Tomcat cluster 实践之郁闷,布布扣,bubuko.com

Apache+Tomcat cluster 实践之郁闷

标签:style   blog   http   java   color   使用   

原文地址:http://my.oschina.net/zhujinbao/blog/291658

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!