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

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

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中。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章