分散環境でのsessionのストレージのいくつかのソリューション


エンタープライズクラスのアプリケーションシステムは単一のサーバに導入されることは少なく、サーバ間でどのようにsession共有を行うかという問題をもたらし、筆者は2つのシナリオを提供し、それぞれ2つの異なる場合に適用し、持続化sessionは高信頼性の環境に適しており、性能的に破損する可能性があるが、memcacheベースのソリューションは相対的に性能が良い.しかしmemcacheが再起動すると、データが失われます.
 
分散セッションの持続化
mysqlで例を挙げる
 
1.データベースの構築
 
create database session_persistence;

use session_persistence;

create table session(
   session_id varchar(100) NOT NULL,
   valid_session char(1) NOT NULL,
   max_inactive int(11) NOT NULL,
   last_access bigint(20) NOT NULL,
   app_name varchar(255) DEFAULT NULL,
   session_data mediumblob,
   primary key (session_id),
   KEY kapp_name (app_name)
 ) engine=InnoDB default charset=utf8;

注意:表のフィールドは、次の構成に対応する必要があります.
 
2.tomcatのcontextを設定.xml
 
<Manager className="org.apache.catalina.session.PersistentManager"
		distributable="true" duplicates="-1" saveOnRestart="true"
		maxActive="-1" maxActiveSessions="0" minIdleSwap="-1" maxIdleSwap="-1"
		maxIdleBackup="-1" maxInactiveInterval="-1" sessionCounter="-1">

		<Store className="org.apache.catalina.session.JDBCStore"
			checkInterval="1"
connectionURL="jdbc:mysql://server_address:port/session_persistence?user=username&amp;password=password"
			driverName="com.mysql.jdbc.Driver" sessionAppCol="app_name"
			sessionDataCol="session_data" sessionIdCol="session_id"
			sessionLastAccessedCol="last_access" sessionMaxInactiveCol="max_inactive"
			sessionTable="session" sessionValidCol="valid_session" />
	</Manager>

パラメータはデータベースフィールドに対応
 
3.tomcatのlibディレクトリにmysqlドライバjarをインポートする
 
 
分散キャッシュセッション
memcacheで例を挙げる
 
筆者はgoogle codeの下のmemcached-session-managerを用いて分散環境でのsessionのキャッシュを実現し,筆者のテストで性能は悪くなかった.もちろん、読者は似たような考え方で自分で実現することができます.
 
memcached-session-managerプロジェクトアドレス:http://code.google.com/p/memcached-session-manager/
 
筆者はkryoを用いてオブジェクトのシーケンス化を行う.
 
1.WEB-INFの下に導入する必要がある
kryo-1.04-all.jar
kryo-serializers-0.9.jar
msm-kryo-serializer.1.5.0.jar
 
2.tomcatのlibは以下に導入する
memcached-2.5.jar
memcached-session-manager-1.5.0.jar
memcached-session-manager-tc6-1.5.0.jar
 
3.context.xmlのcontextラベルの下には、
 
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:127.0.0.1:11211" sticky="false" lockingMode="auto"
requestUriIgnorePattern=".*\.(png|gif|jpg|css|js)$"
sessionBackupAsync="false" sessionBackupTimeout="0"
memcachedProtocol="binary" copyCollectionsForSerialization="true"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
 />

 
ここでmemcachedNodesはmemcacheノードを表し、複数の中間スペース分割を構成する必要がある場合(n 1:192.168.0.11.1:1211 n 2:192.168.0.10:11211など)