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

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

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

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

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

然后,<Connector port="11081" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />  分别设置为11081、11082,因为我的8080端口被占用了;

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

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

首先, upstream  localhost   {   
       server   localhost:11081;
       server   localhost:11082;
      
    }   ,这里的11081好11082是刚才我们tomcat的端口号,前面的upstream localhost这个localhost可以自己命名,但是要和下面的

server {
        listen       1010;
        server_name  localhost; 

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

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

目前tomcat集群的时候通常会遇到类似的问题,比较成熟的办法有:

一. memcached开源共享session

步骤:

1.需要的包:Memcached的序列化方式有两种,需要的包都不同,第一种是kryo,个人试过了一遍,不行,不知道是不是版本的问题。建议采用javolution的序列化方式,用以下的包:nginx负载均衡多台tomcat,session共享,session丢失

下载一个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丢失的问题。

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



 



 



 



 

 



 

 

 

你可能感兴趣的:(tomcat,nginx,负载均衡,session共享,tomcat集群)