关于 tomcat 集群中 session 共享的三种方法
前兩種均需要使用 memcached 或 redis 存儲(chǔ) session ,最后一種使用 terracotta 服務(wù)器共享。
建議使用 redis ,不僅僅因?yàn)樗梢詫⒕彺娴膬?nèi)容持久化,還因?yàn)樗С值膯蝹€(gè)對(duì)象比較大,而且數(shù)據(jù)類型豐富,
不只是緩存 session ,還可以做其他用途,一舉幾得啊。
test url: http://sms.reyo.cn/session.jsp
1、使用 filter 方法存儲(chǔ)
這種方法比較推薦,因?yàn)樗姆?wù)器使用范圍比較多,不僅限于 tomcat ,而且實(shí)現(xiàn)的原理比較簡(jiǎn)單容易控制。
可以使用 memcached-session-filter
官方網(wǎng)址:http://code.google.com/p/memcached-session-filter/
官方介紹:解決集群環(huán)境下java web容器session共享,使用filter攔截器和memcached實(shí)現(xiàn)。在tomcat 6和websphere 8測(cè)試通過,現(xiàn)網(wǎng)并發(fā)2000,日PV量1100萬。
暫不支持session event包括create destory 和 attribute change
東西很不錯(cuò),體積很小,不過這個(gè)東東要和 spring 一起使用,而且要求存儲(chǔ)到 memcached 的對(duì)象要實(shí)現(xiàn) java 的序列化接口
大家也知道,java 本身的序列化性能也很一般。
我將其簡(jiǎn)單擴(kuò)展了一下,不再依賴 spring ,并且利用 javolution 實(shí)現(xiàn)序列化,緩存的對(duì)象不再有限制。
暫時(shí)沒有發(fā)現(xiàn) redis 的實(shí)現(xiàn),后面將自己實(shí)現(xiàn)使用 redis 存儲(chǔ)并且序列化使用 kyro ,詳細(xì)情況有時(shí)間再單獨(dú)寫出來。
2、使用 tomcat session manager 方法存儲(chǔ)
這種方法服務(wù)器只能使用 tomcat ,但網(wǎng)上有針對(duì) memcached 和 redis 實(shí)現(xiàn),直接配置就行了。
memcached 實(shí)現(xiàn):
網(wǎng)址:http://code.google.com/p/memcached-session-manager/
修改 tomcat 的 conf 目錄下的 context.xml 文件:
? <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"???
? memcachedNodes="n1:localhost:11211 n2:localhost:11212"???
? failoverNodes="n2"???
? requestUriIgnorePattern=".*\.(png|gif|jpg|css|js)$"???
? sessionBackupAsync="false"???
? sessionBackupTimeout="100"???
? transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory"???
? copyCollectionsForSerialization="false"??? />
以上是以 1.3 版為例子,需要用的 jar 包:
memcached-session-manager-1.3.0.jar
msm-javolution-serializer-1.3.0.jar
javolution-5.4.3.1.jar
memcached-2.4.2.jar
redis 實(shí)現(xiàn):
網(wǎng)址:https://github.com/jcoleman/tomcat-redis-session-manager
同樣修改 tomcat 的 conf 目錄下的 context.xml 文件:
<Valve className="com.radiadesign.catalina.session.RedisSessionHandlerValve" />
<Manager className="com.radiadesign.catalina.session.RedisSessionManager"
???????? host="localhost"
???????? port="6379"
???????? database="0"
???????? maxInactiveInterval="60"/>
以上是以 1.2 版為例子,需要用的 jar 包:
tomcat-redis-session-manager-1.2-tomcat-6.jar
jedis-2.1.0.jar
commons-pool-1.6.jar
3、使用 terracotta 服務(wù)器共享
這種方式配置有點(diǎn)復(fù)雜,大家到網(wǎng)上搜索一下吧。
以上配置成功后,前端使用 nginx 進(jìn)行負(fù)載均衡就行了,同時(shí)使用 Gzip 壓縮 和 靜態(tài)文件緩存。
?
以下是實(shí)例:
一、nginx+tomcat+memcached? (依賴包下載)
1.memcached配置:(v1.4.13)
節(jié)點(diǎn)1(192.168.159.131:11444)
節(jié)點(diǎn)2(192.168.159.131:11333)
2.tomcat配置
tomcat1(192.168.159.128:8081)
tomcat2(192.168.159.128:8082)
3.nginx安裝在192.168.159.131。
?????? 首先,是配置tomcat,使其將session保存到memcached上。有兩種方法:
方法一:在server.xml中配置。
找到host節(jié)點(diǎn),加入
<Context docBase="/var/www/html" path=""> <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" memcachedNodes="n1:192.168.159.131:11444 n2:192.168.159.131:11333" requestUriIgnorePattern=".*\.(png|gif|jpg|css|js)$" sessionBackupAsync="false" sessionBackupTimeout="3000" transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory" copyCollectionsForSerialization="false" /> </Context>方法二:在context.xml中配置。
找到Context節(jié)點(diǎn),加入
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" memcachedNodes="n1:192.168.159.131:11444" requestUriIgnorePattern=".*\.(png|gif|jpg|css|js)$" sessionBackupAsync="false" sessionBackupTimeout="3000" transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory" copyCollectionsForSerialization="false" />?????? 其次,配置nginx,用于測(cè)試session保持共享。
upstream xxy.com {server 192.168.159.128:8081 ;server 192.168.159.128:8082 ; }log_format www_xy_com '$remote_addr - $remote_user [$time_local] $request ''"$status" $body_bytes_sent "$http_referer"' '"$http_user_agent" "$http_x_forwarded_for"';server {listen 80;server_name xxy.com;location / {proxy_pass http://xxy.com;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}access_log /data/base_files/logs/www.xy.log www_xy_com; }最后,將你的應(yīng)用放到兩個(gè)tomcat中,并依次啟動(dòng)memcached、tomcat、nginx。訪問你的nginx,可以發(fā)現(xiàn)兩個(gè)tomcat中的session可以保持共享了。
二、nginx+tomcat+redis?? (依賴包下載)
1.redis配置(192.168.159.131:16300)(v2.8.3)
2.tomcat配置
tomcat1(192.168.159.130:8081)
tomcat2(192.168.159.130:8082)
3.nginx安裝在192.168.159.131。
?????? 首先,是配置tomcat,使其將session保存到redis上。有兩種方法,也是在server.xml或context.xml中配置,不同的是memcached只需要添加一個(gè)manager標(biāo)簽,而redis需要增加的內(nèi)容如下:(注意:valve標(biāo)簽一定要在manager前面。)
<Valve className="com.radiadesign.catalina.session.RedisSessionHandlerValve" /> <Manager className="com.radiadesign.catalina.session.RedisSessionManager"host="192.168.159.131"port="16300" database="0" maxInactiveInterval="60"/>其次,配置nginx,用于測(cè)試session保持共享。
upstream redis.xxy.com {server 192.168.159.130:8081;server 192.168.159.130:8082; }log_format www_xy_com '$remote_addr - $remote_user [$time_local] $request ''"$status" $body_bytes_sent "$http_referer"' '"$http_user_agent" "$http_x_forwarded_for"';server {listen 80;server_name redis.xxy.com; location / {proxy_pass http://redis.xxy.com;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}access_log /data/base_files/logs/redis.xxy.log www_xy_com; }最后,將你的應(yīng)用放到兩個(gè)tomcat中,并依次啟動(dòng)redis、tomcat、nginx。訪問你的nginx,可以發(fā)現(xiàn)兩個(gè)tomcat中的session可以保持共享了。
上面文章中,有一點(diǎn)需要說明的是:
如果tomcat配置中,將manager放在server.xml中,那么使用maven做熱部署時(shí),會(huì)發(fā)生失敗。所以,推薦放在context.xml中。
總結(jié)
以上是生活随笔為你收集整理的关于 tomcat 集群中 session 共享的三种方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用R语言分析我的fitbit计步数据
- 下一篇: C# 学习笔记1 .NET平台,C#的重