Pivotal Knowledge Base

フォローする

tcServer/Tomcat 上に Redis Session Manager を設定する方法

環境

製品 バージョン
Apache Tomcat  
Redis  

目的

Tomcat に同梱されている DeltaManager あるいは BackupManager を用いたセッションレプリケーションの代わりに、非スティッキーストアベースで高性能である Redis Session Manager を使用して tcServer や Tomcat クラスターを簡単に構築することができる。

Apache Tomcat オープンソースプロジェクトにて、Redis クラスターインスタンス全体にリクエストを分散させる非スティキーストアベースで Tomcat のセッションを格納可能とする tomcat-redis-session-manager 実装が開発されており、それが jcoleman Redis Session Manager である。こちらはサードパーティー製ライブラリー実装で、tcServer には同梱されておらず、すぐに使えるようなサポートは提供されていない。内容については、Tomcat Redis Session Manager 概要を参照されたい(https://github.com/jcoleman/tomcat-redis-session-manager)。

現状、tomcat-redis-session-manager プロジェクトでは Java 6 上で Tomcat 6 を、Java 7 上で Tomcat 7 のみサポートしている。残念ながら、Tomcat 8 は現状サポートされていない。

手順

ここでのデモ設定では、ローカル環境上で Redis サーバーバージョン 3 と tcServer-Tomcat-7 を使用する。Redis のインストール方法について解説が必要な場合は、ナレッジベース記事「Linux 上で Redis をインストールし使用する方法」を参照のこと。

1) 以下の必須 jar ファイルをダウンロードし、[tcServer インストールディレクトリ]/lib フォルダー配下にインストールする。

tomcat-redis-session-manager-2.0.0.jar - Redis にセッションを格納する Tomcat セッション管理実装ライブラリー
jedis-2.5.2.jar - Jedis は非常にコンパクトでよくできた Redis クライアントライブラリーである。
commons-pool2-2.2.jar - Apache commons のオブジェクトプールライブラリー。

> cd [tcServer インストールディレクトリ]/lib
> wget -c https://github.com/rmohr/tomcat-redis-session-manager/releases/down...
> wget -c http://central.maven.org/maven2/redis/clients/jedis/2.5.2/jedis-2.5...
> wget -c http://central.maven.org/maven2/org/apache/commons/commons-pool2/2....

2) [tcServer インストールディレクトリ]/conf/context.xml に以下の行を追加する。

<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />
<Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
         host="localhost"   <!-- Redis のサーバー名、あるいは IP -->
         port="6379"  <!-- Redis のサーバーポート -->
  password="mypass" <!-- Redis サーバーへのアクセスにパスワード認証が必要な場合に追加 -->
         database="0"
         maxInactiveInterval="30" <!-- 秒単位 --> />

3) tcServer を再起動し、Redis サーバーに Tomcat へのリクエストに対するセッション情報が入ってきていることを確認する。

Redis サーバーを監視する。

> redis-cli -p 6379 -a mypass monitor
OK


tcServer のサンプルアプリケーションにアクセスし、セッションの名前と値を生成する。

> http://localhost:8081/examples/servlets/servlet/SessionExample

そして、Redis に格納されるユーザーセッションデータを確認する。

 > redis-cli -p 6379 -a mypass monitor
OK
1431038650.026827 [0 127.0.0.1:36434] "AUTH" "mypass"
1431038650.027075 [0 127.0.0.1:36434] "info"
1431038893.190903 [0 127.0.0.1:37018] "AUTH" "kymeng"
1431038893.192301 [0 127.0.0.1:37018] "GET" "1B8AB24BC2B339EABB5AA4C9BAFC9384"
1431038893.192850 [0 127.0.0.1:37018] "GET" "1B8AB24BC2B339EABB5AA4C9BAFC9384"
1431038905.685080 [0 127.0.0.1:37018] "PING"
1431038935.681059 [0 127.0.0.1:37018] "PING"
...
1431039295.682350 [0 127.0.0.1:37670] "PING"
1431039316.602917 [0 127.0.0.1:37670] "GET" "09DE015D6704185FF1D9B9B4FACF60D8"
1431039316.607184 [0 127.0.0.1:37670] "SET" "09DE015D6704185FF1D9B9B4FACF60D8" "\xac\xed\x00\x05sr\x00Dcom.orangefunction.tomcat.redissessions.SessionSerializationMetadataB\xd9\xd9\xf7v\xa2\xdbL\x03\x00\x01[\x00\x15sessionAttributesHasht\x00\x02[Bxpw\x14\x00\x00\x00\x10\xe6#l\xd9h>\xc4\xd3\xd1\xe9t+H\xbb\xd3(xsr\x00\x0ejava.lang.Long;\x8b\xe4\x90\xcc\x8f#\xdf\x02\x00\x01J\x00\x05valuexr\x00\x10java.lang.Number\x86\xac\x95\x1d\x0b\x94\xe0\x8b\x02\x00\x00xp\x00\x00\x01M0\x95\xaf;sq\x00~\x00\x03\x00\x00\x01M0\x95\xaf;sr\x00\x11java.lang.Integer\x12\xe2\xa0\xa4\xf7\x81\x878\x02\x00\x01I\x00\x05valuexq\x00~\x00\x04\x00\x1bw@sr\x00\x11java.lang.Boolean\xcd r\x80\xd5\x9c\xfa\xee\x02\x00\x01Z\x00\x05valuexp\x00sq\x00~\x00\t\x01sq\x00~\x00\x03\x00\x00\x01M0\x97\x12{t\x00 09DE015D6704185FF1D9B9B4FACF60D8sq\x00~\x00\a\x00\x00\x00\x01t\x00\x06servert\x00\x05redisw\b\x00\x00\x01M0\x95\xaf;"
1431039316.607814 [0 127.0.0.1:37670] "EXPIRE" "09DE015D6704185FF1D9B9B4FACF60D8" "1800"
1431039325.682566 [0 127.0.0.1:37670] "PING"
...

ユーザーセッション ID 09DE015D6704185FF1D9B9B4FACF60D8 の値を取得してみる。

> redis-cli -a mypass get 09DE015D6704185FF1D9B9B4FACF60D8
"\xac\xed\x00\x05sr\x00Dcom.orangefunction.tomcat.redissessions.SessionSerializationMetadataB\xd9\xd9\xf7v\xa2\xdbL\x03\x00\x01[\x00\x15sessionAttributesHasht\x00\x02[Bxpw\x14\x00\x00\x00\x10\xe6#l\xd9h>\xc4\xd3\xd1\xe9t+H\xbb\xd3(xsr\x00\x0ejava.lang.Long;\x8b\xe4\x90\xcc\x8f#\xdf\x02\x00\x01J\x00\x05valuexr\x00\x10java.lang.Number\x86\xac\x95\x1d\x0b\x94\xe0\x8b\x02\x00\x00xp\x00\x00\x01M0\x95\xaf;sq\x00~\x00\x03\x00\x00\x01M0\x95\xaf;sr\x00\x11java.lang.Integer\x12\xe2\xa0\xa4\xf7\x81\x878\x02\x00\x01I\x00\x05valuexq\x00~\x00\x04\x00\x1bw@sr\x00\x11java.lang.Boolean\xcd r\x80\xd5\x9c\xfa\xee\x02\x00\x01Z\x00\x05valuexp\x00sq\x00~\x00\t\x01sq\x00~\x00\x03\x00\x00\x01M0\x97\x12{t\x00 09DE015D6704185FF1D9B9B4FACF60D8sq\x00~\x00\a\x00\x00\x00\x01t\x00\x06servert\x00\x05redisw\b\x00\x00\x01M0\x95\xaf;"

その他、tcServer/Tomcat 用の高性能セッションマネージャーは存在するのか?

tcServer に同梱される GemFire HTTP セッション管理モジュールや、tcServer/Tomcat 6、7、8 に対応済みのサードーパーティー製 memcached-session-manager 実装プロジェクトが存在する。

追加情報

GemFire HTTP セッション管理モジュール:
http://gemfire.docs.pivotal.io/docs-gemfire/latest/tools_modules/http_session_mgmt/chapter_overview.html

コメント

Powered by Zendesk