TomcatのSessionManagerを利用しpostgre上でセッション情報共有する方法
Amazon Linux上にApacheとTomcatにてクラスタ構成を構築後、セッション情報をDBに格納してセッション共有を行う方法を試す。
前提環境:以下の構成がすべて終わっていること
EC2上にApache+Tomcat9のクラスタ構成構築 - 三姉妹年子ママのtoi toi toi!日記
・postgresインストール
# yum install postgresql8.x86_64
# yum install postgresql8-server.x86_64
# passwd postgres Changing password for user postgres. New password:postgres
# su - postgres Last failed login: Thu Jan 10 00:00:43 UTC 2019 from 113.22.4.10 on ssh:notty There were 159 failed login attempts since the last successful login.
-bash-4.2$ initdb
-bash-4.2$ pg_ctl start -w waiting for server to start.... done server started
-bash-4.2$ psql psql (8.4.20) Type "help" for help.
postgres=# create database tomcat; CREATE DATABASE
postgres=# \l List of databases Name | Owner | Encoding | Collation | Ctype | Access privileges -----------+----------+----------+-------------+-------------+----------------------- postgres | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | template0 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres : postgres=CTc/postgres template1 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres : postgres=CTc/postgres tomcat | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | (4 rows)
postgres=# \connect tomcat psql (8.4.20) You are now connected to database "tomcat".
tomcat=# CREATE TABLE tomcat_sessions tomcat-# ( tomcat(# session_id varchar(100) NOT NULL, tomcat(# valid_session char(1) NOT NULL, tomcat(# max_inactive int4 NOT NULL, tomcat(# last_access int8 NOT NULL, tomcat(# app_name varchar(255), tomcat(# session_data bytea, tomcat(# PRIMARY KEY (session_id) tomcat(# ); NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "tomcat_sessions_pkey" for table "tomcat_sessions" CREATE TABLE
tomcat=# select * from tomcat_sessions; session_id | valid_session | max_inactive | last_access | app_name | session_data ------------+---------------+--------------+-------------+----------+-------------- (0 rows) tomcat=# CREATE INDEX idx_tomcat_sessions_app_name ON tomcat_sessions(app_name); CREATE INDEX
これでDBの作成は終わり。
DB接続するために、TomcatのXMLファイルの修正を行います。
やり方1:毎回DBにConectしに行く方法
やり方2:JNDI接続し、JDBCコネクションプールを使う方法
やり方1
・context.xmlを修正
<Context> <Manager className="org.apache.catalina.session.PersistentManager" maxIdleBackup="1" minIdleSwap="0" maxIdleSwap="0" processExpiresFrequency="1" saveOnRestart='true' > <Store className="org.apache.catalina.session.JDBCStore" connectionURL="jdbc:postgresql://localhost:5432/tomcat?user=postgres&password=postgres" driverName="org.postgresql.Driver" sessionAppCol="app_name" sessionDataCol="session_data" sessionIdCol="session_id" sessionLastAccessedCol="last_access" sessionMaxInactiveCol="max_inactive" sessionTable="tomcat_sessions" sessionValidCol="valid_session" /> </Manager> </Context>
やり方2
・context.xmlを修正
<Context> <Manager className="org.apache.catalina.session.PersistentManager" maxIdleBackup="1" minIdleSwap="0" maxIdleSwap="0" processExpiresFrequency="1" saveOnRestart='true' > <Store className="org.apache.catalina.session.JDBCStore" dataSourceName="jdbc/postgres" driverName="org.postgresql.Driver" sessionAppCol="app_name" sessionDataCol="session_data" sessionIdCol="session_id" sessionLastAccessedCol="last_access" sessionMaxInactiveCol="max_inactive" sessionTable="tomcat_sessions" sessionValidCol="valid_session" /> </Manager> <Resource name="jdbc/postgres" auth="Container" username="postgres" password="postgres" driverClassName="org.postgresql.Driver" type="javax.sql.DataSource" url="jdbc:postgresql://localhost:5432/tomcat?user=postgres&password=postgres" factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" /> </Context>
どちらの方法でもいいので、修正したら、あとはTomcatを再起動。
portは8080と8181と交互に表示されるが、port(session)は8080か8181どちらかに固定されている。
おまけ
JMeterでレスポンス検証を実施。
コネクションプールを使用したほうが早いことが分かった。
検証環境
[root@ip-172-31-30-8 etc]# cat system-release Amazon Linux AMI release 2018.03 -bash-4.2$ postgres --version postgres (PostgreSQL) 8.4.20 [root@ip-172-31-30-8 /]# rpm -qa | grep httpd httpd24-2.4.37-1.83.amzn1.x86_64 httpd24-tools-2.4.37-1.83.amzn1.x86_64 [root@ip-172-31-30-8 /]# [root@ip-172-31-30-8 bin]# ./version.sh Using CATALINA_BASE: /opt/apache-tomcat-9.0.14 Using CATALINA_HOME: /opt/apache-tomcat-9.0.14 Using CATALINA_TMPDIR: /opt/apache-tomcat-9.0.14/temp Using JRE_HOME: /usr/lib/jvm/java Using CLASSPATH: /opt/apache-tomcat-9.0.14/bin/bootstrap.jar:/opt/apache-tomcat-9.0.14/bin/tomcat-juli.jar Server version: Apache Tomcat/9.0.14 Server built: Dec 6 2018 21:13:53 UTC Server number: 9.0.14.0 OS Name: Linux OS Version: 4.14.88-72.73.amzn1.x86_64 Architecture: amd64 JVM Version: 1.8.0_191-b12 JVM Vendor: Oracle Corporation [root@ip-172-31-30-8 bin]#