精华帖 (15) :: 良好帖 (13) :: 新手帖 (8) :: 隐藏帖 (1)
|
|
---|---|
作者 | 正文 |
发表时间:2010-05-26
最后修改:2010-05-27
今天看到"基于apache的tomcat负载均衡和集群配置 "这篇文章成为javaEye热点。 略看了一下,感觉太复杂,要配置的东西太多,因此在这里写出一种更简洁的方法。
要集群tomcat主要是解决SESSION共享的问题,因此我利用memcached来保存session,多台TOMCAT服务器即可共享SESSION了。
你可以自己写tomcat的扩展来保存SESSION到memcached。 这里推荐使用memcached-session-manager这个开源项目(http://code.google.com/p/memcached-session-manager/ ),下面简称msm。
如何安装nginx、memcached、tomcat这些就不多说了。
先说明一下测试环境: tomcat1、nginx、memcached安装在192.168.1.11 tomcat2安装在192.168.1.101
下面分步实现基于nginx的tomcat负载均衡和集群配置
一,tomcat集群 1,先下载msm及其依赖包 http://memcached-session-manager.googlecode.com/files/memcached-session-manager-1.3.0.jar
http://memcached-session-manager.googlecode.com/files/msm-javolution-serializer-jodatime-1.3.0.jar
http://memcached-session-manager.googlecode.com/files/msm-javolution-serializer-cglib-1.3.0.jar
http://spymemcached.googlecode.com/files/memcached-2.4.2.jar http://memcached-session-manager.googlecode.com/files/javolution-5.4.3.1.jar
2,将这5个包放到$TOMCAT_HOME/lib目录下
3,修改$TOMCAT_HOME/conf/server.xml
<Context docBase="E:/java_codes/TestSession/WebContent" path="" reloadable="true" > <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" memcachedNodes="n1:localhost:11211" requestUriIgnorePattern=".*\.(png|gif|jpg|css|js)$" sessionBackupAsync="false" sessionBackupTimeout="100" transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory" copyCollectionsForSerialization="false" /> </Context> 这里的memcachedNodes是填写memcached节点,多个节点时可以以空隔分开,如: n1:localhost:11211 n2:localhost:11212
E:/java_codes/TestSession/WebContent 替换成你的WEB目录
修改后重启两个TOMCAT即可,这个时候已经解决SESSION的共享问题.
二,配置nginx实现负载均衡 以我的nginx.conf为例 #user nobody; worker_processes 1; error_log logs/error.log; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; #gzip on; upstream www.docyeah.com { server 192.168.1.11:8080; server 192.168.1.101:8080; } server { listen 80; server_name www.docyeah.com; charset utf-8; location / { root html; index index.html index.htm; proxy_pass http://www.docyeah.com; proxy_set_header X-Real-IP $remote_addr; client_max_body_size 100m; } location ~ ^/(WEB-INF)/ { deny all; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }
将www.docyeah.com替换成你的域名 192.168.1.11和192.168.1.101替换成你服务器的IP
OK,已经完成。启动nginx即可。
这是我采用的负载均衡及集群方案,希望大家拍砖.
ps:javaeye的编辑器有问题,代码里加颜色后居然变乱了 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-05-27
nginx在配置upstream时,有两个参数:
ip_hash(同一IP一直使用同一台server服务) weight(server的使用权重,数值越大,nginx分发的请求越多) 通过配合这两个参数,能粗糙地解决session共享的问题。 对于一些不是太依赖session的应用,或者只有用户登录时保存,那么我认为可以用Cookies代替。 即使真的要Session共享,我认为手动写代码保存到Memcached比为Tomcat加插件好,这样能获得更好的可控性。 而且我不用Tomcat,用Resin,这个msm就用不上啦,不过我会按照我的思想实现session共享,呵呵,个人愚见!! |
|
返回顶楼 | |
发表时间:2010-05-27
嗯,我也试过像你一样,手动写代码将会话写到MEMCACHED中。但后来觉得在代码级别来实现集群那不太好。
|
|
返回顶楼 | |
发表时间:2010-05-27
heyjjay8 写道 负载均衡需要会话同步吗?个人愚见,用ngnix做基于访问IP地址的分发策略实现负载均衡,不需要会话同步
只是负载均衡的话,的确只要基于访问IP地址的分发策略就可以了。但这要就不能实现高可用。如果集群中的某台服务器挂掉,那这台服务器上的session用户都将丢失。 |
|
返回顶楼 | |
发表时间:2010-05-27
这里的memcachedNodes是填写memcached节点,多个节点时可以以空隔分开,如:
n1:localhost:11211 n2:localhost:11212 sessionBackupTimeout的单位为分钟 E:/java_codes/TestSession/WebContent 替换成你的WEB目录 修改后重启两个TOMCAT即可,这个时候已经解决SESSION的共享问题 这样就解决了两个应用服务器之间session共享的问题?还是同步?,什么原理.讲详细点嘛 |
|
返回顶楼 | |
发表时间:2010-05-27
对session同步的必要性和性能表示极大怀疑,试过几千人同时在线的情况吗?!
|
|
返回顶楼 | |
发表时间:2010-05-27
嗯,经过大家这么讨论,似乎没必要同步session.如果紧紧为了保证在某台服务器挂掉时保持用户的在线状态,那好像代价有点大。看具体应用吧,如聊天室,那就有必要了。
几千人同时在线这个没有问题,并不是每一个会话都会跟memcached产生一个链接。如果几千并发,那我就没测试过了。 |
|
返回顶楼 | |
发表时间:2010-05-28
192.168.1.11和192.168.1.101,有通信的嗎?
如果沒有,192.168.1.11突然down了,正在訪問的用戶如何處理?? |
|
返回顶楼 | |
发表时间:2010-05-28
前提:以下论述不包含 服务器 宕机 的有效处理
其实同步session只是为了保证一个用户在访问时,无论访问到哪台服务器,session都要一致,那为什么要让一个用户去访问1台以上的服务器呢? ngnix做基于访问IP地址的分发策略 跟 session的策略不太一致,session 的 key一般是保存在cookie中,而 一个用户却可能改变IP,但cookie不变,session就应当保持 所以我做了nginx的基于cookie中某个值的分发策略,在基于IP的策略中,nginx可以保证IP相同的必定访问同一台机器,基于cookie中某个值的分发策略则可以保证只要cookie不丢,就可以访问同一台机器,避免因为同一用户可能在集群环境中访问多台服务器而必须考虑session共享的复杂问题 |
|
返回顶楼 | |
发表时间:2010-05-28
jiopi 写道 前提:以下论述不包含 服务器 宕机 的有效处理
其实同步session只是为了保证一个用户在访问时,无论访问到哪台服务器,session都要一致,那为什么要让一个用户去访问1台以上的服务器呢? ngnix做基于访问IP地址的分发策略 跟 session的策略不太一致,session 的 key一般是保存在cookie中,而 一个用户却可能改变IP,但cookie不变,session就应当保持 所以我做了nginx的基于cookie中某个值的分发策略,在基于IP的策略中,nginx可以保证IP相同的必定访问同一台机器,基于cookie中某个值的分发策略则可以保证只要cookie不丢,就可以访问同一台机器,避免因为同一用户可能在集群环境中访问多台服务器而必须考虑session共享的复杂问题 同意,基于IP分发的策略已经能解决绝大部分需求。 |
|
返回顶楼 | |