nginx负载均衡多台tomcat,session共享,session丢失

用loadrunner负载测试了一下一个项目,结果发现,并发量在70的时候,响应时间已经达到了30秒,这是不能忍受的。再次负载100个并发,tomcat挂了,session丢失率9成多。 css

考虑到多并发,搭载nginx转发请求,分发丢给tomcat处理。下面是步骤: html

1.复制多个tomcat,我这里用tomca6版本,分别命名为tomcat1tomcat2等,这里用两个tomact。tomcat1配置: java

在server.xml文件中,<Server port="8007" shutdown="SHUTDOWN">,分别设置为800七、8008; node

而后,<Connector port="11081" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />  分别设置为1108一、11082,由于个人8080端口被占用了;
nginx

接下来, <Engine name="Catalina" jvmRoute="tomcat2" defaultHost="localhost">,给tomcat一、tomcat2。 web

2.配置完了tomcat,咱们要配置咱们的nginx了,打开nginx.conf文件,咱们刚开始配置一个简单的,有几个地方要配置一下。 apache

首先, upstream  localhost   {   
       server   localhost:11081;
       server   localhost:11082;
      
    }   ,这里的11081好11082是刚才咱们tomcat的端口号,前面的upstream localhost这个localhost能够本身命名,可是要和下面的
tomcat

server {
        listen       1010;
        server_name  localhost; 
session

server_name 对应。其余的没什么配置了,简单的负载均衡就搭载好了。 并发

基本的搭载是没问题了,可是仔细想一想,java的项目有session共享的问题,查了一些资料。

目前tomcat集群的时候一般会遇到相似的问题,比较成熟的办法有:

一. memcached开源共享session

步骤:

1.须要的包:Memcached的序列化方式有两种,须要的包都不一样,第一种是kryo,我的试过了一遍,不行,不知道是否是版本的问题。建议采用javolution的序列化方式,用如下的包:

下载一个memcached.exe,双击打开。
而后修改每台tomcatconf目录下得context.xml文件或者server.xml文件,在其中加入以下代码

<Manager
className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:localhost:11211"
requestUriIgnorePattern=".*/.(png|gif|jpg|css|js)$" 
sticky="false"  
lockingMode="uriPattern:/path1|/path2" 
sessionBackupAsync="false"
sessionBackupTimeout="100"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory"
 copyCollectionsForSerialization="false"/>

这是memcached须要的代码,其中,memcahchedNodes是配置节点,我这里只采用一个节点,因此配一个node

以后,启动项目,项目可以启动证实配置成功。

我试过这种方法,没能成功共享session,求大神指路。

2.tomcat自带的组播方式共享session

这是官网的配置:http://tomcat.apache.org/tomcat-7.0-doc/cluster-howto.html

能够注释tomcatserver.xml中的cluster节点,而后配置,能够参照官网的配置;tomcat集群各节点经过创建TCP连接来完成Session的拷贝,拷贝有同步和异步两种模式。Membership用于发现集群中的其余节点,这里的address用的是组播地址,使用同一个组播地址和端口的多个节点同属一个子集群,所以经过自定义组播地址和端口就可将一个大的tomcat集群分红多个子集群。

本身按照官网的配置配置了三个tomcat来集群,仍是不能实现共享session。

错误是:Non-serializable attribute ,本身苦逼了很久,原来这个错误是本身项目的实体没有序列号,

解决方案:在bean里面添加implements Serializable.我给每一个javabean都序列化了。

bean内添加implements Serializable记得是io包里面的。是要添加在保存进sessionbean里面。

用了这个方式以后,发现解决了共享session的问题。

可是测试以后,又发现了问题,session会丢失?

例如登录页面,登录进去以后,点击刷新......多点几回会发现,又跑回来了登录页面,明显这是sesison丢失的问题。

再苦逼研究,仍是没找到办法。

相关文章
相关标签/搜索