關於 tomcat 集群中 session 共享的三種方法


前兩種均需要使用 memcached 或 redis 存儲 session ,最后一種使用 terracotta 服務器共享。
建議使用 redis ,不僅僅因為它可以將緩存的內容持久化,還因為它支持的單個對象比較大,而且數據類型豐富,
不只是緩存 session ,還可以做其他用途,一舉幾得啊。

test url: http://sms.reyo.cn/session.jsp

1、使用 filter 方法存儲
這種方法比較推薦,因為它的服務器使用范圍比較多,不僅限於 tomcat ,而且實現的原理比較簡單容易控制。
可以使用 memcached-session-filter
官方網址:http://code.google.com/p/memcached-session-filter/
官方介紹:解決集群環境下java web容器session共享,使用filter攔截器和memcached實現。在tomcat 6和websphere 8測試通過,現網並發2000,日PV量1100萬。
暫不支持session event包括create destory 和 attribute change
東西很不錯,體積很小,不過這個東東要和 spring 一起使用,而且要求存儲到 memcached 的對象要實現 java 的序列化接口
大家也知道,java 本身的序列化性能也很一般。
我將其簡單擴展了一下,不再依賴 spring ,並且利用 javolution 實現序列化,緩存的對象不再有限制。
暫時沒有發現 redis 的實現,后面將自己實現使用 redis 存儲並且序列化使用 kyro ,詳細情況有時間再單獨寫出來。


2、使用 tomcat session manager 方法存儲
這種方法服務器只能使用 tomcat ,但網上有針對 memcached 和 redis 實現,直接配置就行了。
memcached 實現:
網址: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 實現:
網址: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 服務器共享
這種方式配置有點復雜,大家到網上搜索一下吧。

以上配置成功后,前端使用 nginx 進行負載均衡就行了,同時使用 Gzip 壓縮 和 靜態文件緩存。

 

以下是實例:

一、nginx+tomcat+memcached  (依賴包下載)

1.memcached配置:(v1.4.13)

節點1(192.168.159.131:11444)

節點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節點,加入

<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節點,加入

	<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,用於測試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;
}

最后,將你的應用放到兩個tomcat中,並依次啟動memcached、tomcat、nginx。訪問你的nginx,可以發現兩個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只需要添加一個manager標簽,而redis需要增加的內容如下:(注意:valve標簽一定要在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,用於測試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;
}

最后,將你的應用放到兩個tomcat中,並依次啟動redis、tomcat、nginx。訪問你的nginx,可以發現兩個tomcat中的session可以保持共享了。

上面文章中,有一點需要說明的是:

如果tomcat配置中,將manager放在server.xml中,那么使用maven做熱部署時,會發生失敗。所以,推薦放在context.xml中。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM