Symfoware

Symfowareについての考察blog

Tomcat 7のセッションをRedisに保存し、ロードバランスを行う

Tomcatのセッションの保存先をRedisにできるようです。
https://github.com/jcoleman/tomcat-redis-session-manager

面白そうなので、触ってみることにしました。



構成



せっかくなので、Tomcat2台をロードバランス。
別のTomcatサーバーに接続しても、セッションが保持されるよねという
構成を取ってみたいと思います。

サーバーは全部で3台のFreeBSDで構成。
フロントとなるサーバーにnginxをインストールして、
バックエンドのTomcat2台にロードバランス。

nginxをインストールしたサーバーにredisもインストールして、
Tomcatのセッションをここに保存します。

ざっくりな構成図はこんな感じ。

383_01.png




フロントエンドの準備



nginxとredisをインストールします。
pkg installを使用しました。


# pkg install nginx
# pkg install redis



nginxは「1.4.6」、redisは「2.8.7」がインストールされました。
「/etc/rc.conf」を編集して起動許可を与えます。


# vi /etc/rc.conf




以下の2行を追記。


nginx_enable="YES"
redis_enable="YES"




nginxを起動してみます。


# /usr/local/etc/rc.d/nginx start




ブラウザでhttp://[サーバーIP]を表示。
こんな画面になったらインストール成功です。

383_02.png


次にredisを起動。


# /usr/local/etc/rc.d/redis start




別の端末からtelnetで接続。
応答があればOK。


$ telnet 192.168.1.111 6379
Trying 192.168.1.111...
Connected to 192.168.1.111.
Escape character is '^]'.
quit
+OK
Connection closed by foreign host.








Tomcatサーバーの準備



pkg installでインストールしました。
FreeBSD 10.0にpkg installでTomcat 7をインストールする

同じ構成のものを2台用意しておきます。





tomcat-redis-session-manager



tomcat-redis-session-managerをビルドします。

build.gradleを使用すれば簡単にビルドできるのでしょうが、
Eclipseにソースを放り込んでビルドしてやろうと思います。
思いの外苦戦しました。


依存しているjarは、まずTomcat由来のものが3つ。

tomcatのlibフォルダー
・catalina.jar
・servlet-api.jar

tomcatのbinフォルダー
・tomcat-juli.jar

jedisのコネクションプールがcommons-pool2に依存しています。
以下のURLからcommons-pool2-2.2.jarを取得しました。
https://commons.apache.org/proper/commons-pool/download_pool.cgi


jedisは、公開されているjar
https://github.com/xetorthio/jedis/downloads

こちらを使用したかったのですが、tomcat-redis-session-managerの
ビルドを通せなかったので、ソースからビルドします。


地味に苦労したので、ここに置いておきます。
https://bitbucket.org/symfo/tomcat-redis-session-manager-with-jedis

downloadsから「redis-session.jar」がダウンロードできます。
これと、lib/commons-pool2-2.2.jarがあれば、とりあえず動かせると思います。






設置手順



同じ手順を2台のTomcatサーバーに対して実施します。

まず、commons-pool2-2.2.jarとredis-session.jarをTomcatのlibに放り込みます。

383_03.png


Tomcatのconf/context.xmlを編集。
セッションストレージとしてRedisを使用するよう指定します。

以下、コメントを除いたファイルの内容になります。


  1. <?xml version='1.0' encoding='utf-8'?>
  2. <Context>
  3.     <WatchedResource>WEB-INF/web.xml</WatchedResource>
  4.     
  5.     <!-- 以下の記載を追加 -->
  6.     <Valve className="com.radiadesign.catalina.session.RedisSessionHandlerValve" />
  7.     <Manager className="com.radiadesign.catalina.session.RedisSessionManager"
  8.         host="192.168.1.111"
  9.         port="6379"
  10.         database="0"
  11.         maxInactiveInterval="60" />
  12. </Context>




hostでredisが動いているサーバーを指定。
今回は「192.168.1.111」のサーバーです。

wwwユーザー以外の権限でファイルを編集すると、どうもTomcat起動時に
context.xmlの読み込みに失敗するようです。


# chown -R www:www context.xml



として、権限をwwwに渡しました。


Tomcatを再起動します。


# /usr/local/etc/rc.d/tomcat7 restart




これでセッションの情報はredisに保存されるようになりました。






nginxの設定



フロントである192.168.1.111のサーバーのnginx設定ファイルを編集します。


# vi /usr/local/etc/nginx/nginx.conf




サンプルプログラムはjspで作成する予定です。
拡張子jspのアクセスを、2台のTomcatサーバーに割り振るよう構成しました。
以下、設定ファイルの抜粋です。


http {
    include     mime.types;
    default_type application/octet-stream;

    #log_format main '$remote_addr - $remote_user [$time_local] "$request" '
    #                 '$status $body_bytes_sent "$http_referer" '
    #                 '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log logs/access.log main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout 0;
    keepalive_timeout 65;

    #gzip on;
    upstream tomcat_servers{
        server 192.168.1.112:8080;
        server 192.168.1.113:8080;
    }
    
    server {
        listen     80;
        server_name localhost;

        #charset koi8-r;

        #access_log logs/host.access.log main;

        location / {
            root /usr/local/www/nginx;
            index index.html index.htm;
        }

        location ~ \.jsp$ {
            proxy_pass http://tomcat_servers;
        }





設定が終わったらnginxを再起動しました。


# /usr/local/etc/rc.d/nginx restart








サンプルプログラム



JSP書くの、めっちゃ久しぶりです。
完全に忘れてたので試行錯誤しながらアクセス回数をセッションに保存するプログラムを書きました。
これを、Tomcatの「webapps/examples」に「redis.jsp」という名前で保存します。


差がわかるように、192.168.1.112と192.168.113のサーバーに保存するファイルを
若干変更します。

これが192.168.1.112用。


  1. <%@ page language="java" contentType="text/html; charset=utf8"
  2.     pageEncoding="utf-8"%>
  3. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  4. <html>
  5.     <title>Redisセッションテスト(112)</title>
  6. <body>
  7. <%
  8. if (session.isNew()) {
  9.     session.setAttribute("id", 1);
  10.     out.println("count:1");
  11. } else {
  12.     int id = 1;
  13.     if (session.getAttribute("id") != null) {
  14.         id = Integer.parseInt(session.getAttribute("id").toString());
  15.     }
  16.     id += 1;
  17.     session.setAttribute("id", id);
  18.     out.println("count:" + id);
  19. }
  20. %>
  21. </body>
  22. </html>





これが192.168.1.113用。
タイトルにIPの末尾を含めて判別できるようにしておきました。


  1. <%@ page language="java" contentType="text/html; charset=utf8"
  2.     pageEncoding="utf-8"%>
  3. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  4. <html>
  5.     <title>Redisセッションテスト(113)</title>
  6. <body>
  7. <%
  8. if (session.isNew()) {
  9.     session.setAttribute("id", 1);
  10.     out.println("count:1");
  11. } else {
  12.     int id = 1;
  13.     if (session.getAttribute("id") != null) {
  14.         id = Integer.parseInt(session.getAttribute("id").toString());
  15.     }
  16.     id += 1;
  17.     session.setAttribute("id", id);
  18.     out.println("count:" + id);
  19. }
  20. %>
  21. </body>
  22. </html>







テスト



フロントであるサーバーにアクセスします。
ブラウザで「http://192.168.1.111/examples/redis.jsp」を表示。

F5でリロードするたび、カウントが上がっていきます。

383_04.png

383_05.png


タイトルを見てみると、112と113に交互にアクセスしていますが、
カウントはちゃんと1ずづ増加しています。

これでラウンドロビンな負荷分散でもセッション情報が保存されるようになりました。
やったね。




【参考URL】

jcoleman / tomcat-redis-session-manager

xetorthio / jedis

JSP-8.暗黙オブジェクト(session)

Load Balancing Apache Tomcat with nginx
関連記事

テーマ:サーバ - ジャンル:コンピュータ

  1. 2014/03/21(金) 20:19:29|
  2. Redis
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<Tomcat JDBC Connection Poolで通常のJavaプログラムからPostgreSQL 9.3に接続する | ホーム | FreeBSD 10.0にpkg installでTomcat 7をインストールする>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/1363-7c38835a
この記事にトラックバックする(FC2ブログユーザー)