用loadrunner负载测试了一下一个项目,结果发现,并发量在70的时候,响应时间已经达到了30秒,这是不能忍受的。再次负载100个并发,tomcat挂了,session丢失率9成多。
考虑到多并发,搭载nginx转发请求,分发丢给tomcat处理。下面是步骤:
1.复制多个tomcat,我这里用tomca6版本,分别命名为tomcat1、tomcat2等,这里用两个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的序列化方式,用以下的包:
下载一个memcached.exe,双击打开。
然后修改每台tomcat的conf目录下得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
可以注释tomcat,server.xml中的cluster节点,然后配置,可以参照官网的配置;tomcat集群各节点通过建立TCP链接来完成Session的拷贝,拷贝有同步和异步两种模式。Membership用于发现集群中的其他节点,这里的address用的是组播地址,使用同一个组播地址和端口的多个节点同属一个子集群,因此通过自定义组播地址和端口就可将一个大的tomcat集群分成多个子集群。
自己按照官网的配置配置了三个tomcat来集群,还是不能实现共享session。
错误是:Non-serializable attribute ,自己苦逼了好久,原来这个错误是自己项目的实体没有序列号,
解决方案:在bean里面添加implements Serializable.我给每个javabean都序列化了。
在bean内添加implements Serializable记得是io包里面的。是要添加在保存进session的bean里面。
用了这个方式之后,发现解决了共享session的问题。
但是测试之后,又发现了问题,session会丢失?
例如登陆页面,登陆进去之后,点击刷新......多点几次会发现,又跑回来了登陆页面,明显这是sesison丢失的问题。
再苦逼研究,还是没找到办法。