1. 程式人生 > >關於 tomcat 叢集中 session 共享的三種方法

關於 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可以保持共享了。