Nginx+Tomcat+Memcached集羣

Tomcat集羣session同步方案有如下幾種方式:css

  • 使用tomcat自帶的cluster方式,多個tomcat間自動實時複製session信息,配置起來很簡單。但這個方案的效率比較低,在大併發下表現並很差。原理:http://zyycaesar.iteye.com/blog/296606
  • 利用nginx的基於訪問ip的hash路由策略,保證訪問的ip始終被路由到同一個tomcat上,這個配置更簡單。但若是應用是某一個局域網大量用戶同時登陸,這樣負載均衡就沒什麼做用了。
  • 利用nginx插件實現tomcat集羣和session同步,nginx-upstream-jvm-route-0.1.tar.gz,是一個 Nginx 的擴展模塊,用來實現基於 Cookie 的 Session Sticky 的功能,可經過http://code.google.com/p/nginx-upstream-jvm-route/downloads/list獲取。
  • 利用memcached把多個tomcat的session集中管理,前端在利用nginx負載均衡和動靜態資源分離,在兼顧系統水平擴展的同時又能保證較高的性能。

如下使用第四種方案,集羣環境:html

1. nginx最新版本:1.5.7前端

2. tomcat版本:6.0.37java

3. memcached最新版本:1.4.15nginx

4. session複製同步使用memcache-session-manager最新版本:1.6.5c++

5. 系統:CentOS6.3web


1、Nginx安裝centos

- centos6.3默認未安裝gcc-c++,先裝gcc:tomcat

yum -y install gcc-c++

裝完後記得reboot系統。session

- cd到安裝目錄

cd /usr/lcoal/src

- 安裝pcre庫

cd /usr/local/src
wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.21.tar.gz
tar -zxvf pcre-8.21.tar.gz
cd pcre-8.21
./configure
make
make install

若是wget下載不到的話,去官網下載pcre-8.12.tar.gz包拷貝到src下。

- 安裝zlib庫

cd /usr/local/src
 
wget http://zlib.net/zlib-1.2.8.tar.gz
tar -zxvf zlib-1.2.8.tar.gz
cd zlib-1.2.8
./configure
make
make install

- 安裝ssl

cd /usr/local/src
wget http://www.openssl.org/source/openssl-1.0.1c.tar.gz
tar -zxvf openssl-1.0.1c.tar.gz

- 安裝nginx

cd nginx-1.5.7
 
./configure --prefix=/usr/local/nginx/nginx \
--with-http_ssl_module \
--with-pcre=/usr/local/src/pcre-8.12 \
--with-zlib=/usr/local/src/zlib-1.2.8 \
--with-openssl=/usr/local/src/openssl-1.0.1c
 
make
make install

安裝成功,cd /usr/local/nginx/conf/nginx.conf,修改配置文件:

http {
...
    upstream localhost {
        server    localhost:8081;
        server    localhost:8082;
        server    localhost:8083;
    }
...
}


location / {
      root   html;
      index  index.html index.htm;
      proxy_pass   http://localhost;
      proxy_redirect    off;
      proxy_set_header   Host $host;
      proxy_set_header   X-Real-IP $remote_addr;
      proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for; 
      client_max_body_size   10m;
      client_body_buffer_size   128k;
      proxy_connect_timeout   90;
      proxy_send_timeout   90;
      proxy_read_timeout   90;
      proxy_buffer_size   4k;
      proxy_buffers   4 32k;
      proxy_busy_buffers_size   64k;
      proxy_temp_file_write_size  64k;        
}

 

2、memcached安裝

- memcached安裝較簡單,須要先libevent庫:

sudo yum install libevent libevent-devel

wget http://www.danga.com/memcached/dist/memcached-1.4.15.tar.gz
tar zxf memcached-1.4.15.tar.gz
cd memcached-1.4.15
./configure
make
sudo make install

安裝成功(默認安裝在bin下),啓動:

#-vv 控制檯輸出
#-d 後臺運行
/usr/local/bin/memcached -vv

啓動後,能夠telnet上去看下狀態:

telnet 127.0.0.1 11211

stats

 

 

3、tomcat配置

1. 修改server.xml

<Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">

...

<Context path="" docBase="/demo/appserver/app/cluster" debug="0" reloadable="true" crossContext="true">    
  <Manager 
    className="de.javakaffee.web.msm.MemcachedBackupSessionManager" memcachedNodes="n1:192.168.2.43:11211"     requestUriIgnorePattern=".*\.(png|gif|jpg|css|js|ico|jpeg|htm|html)$"     sessionBackupAsync="false"     sessionBackupTimeout="1800000"     copyCollectionsForSerialization="false"     transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory" /> </Context>

2. 添加mem和msm的依賴jar包

couchbase-client-1.2.2.jar

javolution-5.4.3.1.jar

kryo-1.03.jar

kryo-serializers-0.10.jar

memcached-session-manager-1.6.5.jar

memcached-session-manager-tc6-1.6.5.jar

minlog-1.2.jar

msm-kryo-serializer-1.6.5.jar

reflectasm-0.9.jar

spymemcached-2.10.2.jar

注意點:

-msm1.6.5依賴了Couchbase,須要添加couchbase-client的jar包,不然啓動會報:java.lang.NoClassDefFoundError: com/couchbase/client/CouchbaseClient。

-tomcat6和7使用不一樣msm支持包:memcached-session-manager-tc6-1.6.5.jar和memcached-session-manager-tc7-1.6.5.jar,只可選一,不然啓動報錯。

-msm源碼中的lib包版本過低:spymemcached-2.7.jar須要使用2.10.2,不然啓動tomcat報錯:

java.lang.NoSuchMethodError: net.spy.memcached.MemcachedClient.set(Ljava/lang/String;ILjava/lang/Object;)Lnet/spy/memcached/internal/OperationFuture;
at de.javakaffee.web.msm.BackupSessionTask.storeSessionInMemcached(BackupSessionTask.java:227)

kryo-serializers-0.8.jar須要使用0.10版本,不然報錯:

Caused by: java.lang.ClassNotFoundException: de.javakaffee.kryoserializers.DateSerializer


tomcat啓動成功後能夠去刷新頁面,ip端口會變化,session是不會變化的:

 

memcached的狀態能夠看到同步session的操做日誌:

相關文章
相關標籤/搜索