Apache+Tomcat cluster 实践
博客专区 > woodo 的博客 > 博客详情
Apache+Tomcat cluster 实践
woodo 发表于3年前
Apache+Tomcat cluster 实践
  • 发表于 3年前
  • 阅读 780
  • 收藏 8
  • 点赞 0
  • 评论 2
摘要: session cluster

近来我们的程序部署给客户,不过有些客户提出了更高的性能,以及更好的利用客户的硬件资源的要求. 我们的程序很简单, 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信息。不知道谁有经验?

共有 人打赏支持
粉丝 5
博文 52
码字总数 32118
评论 (2)
PaulWong
用MEMCACHED或MONGODB作为SESSION的存储即可。
woodo

引用来自“PaulWong”的评论

用MEMCACHED或MONGODB作为SESSION的存储即可。
谢谢你的建议,有机会尝试配置一个。 不知道轻量级的跟随复制可行吗?按道理spring应该可以收到复制过来的session吧,然后我把额外信息业复制过来,怎么样?
×
woodo
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: