三姉妹年子ママのtoi toi toi!日記

長女5歳、次女4歳、三女3歳の子育て中です。いつの間にか3人の子供に囲まれて日々過ごしています。3年育休から復職し、慌ただしい日々ですが、この日々を少しでも残しておきたいと思い書いています。最近は特に子供の教育についてばかり考えています。

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&amp;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&amp;password=postgres"
          factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
/>

</Context>

どちらの方法でもいいので、修正したら、あとはTomcatを再起動。
portは8080と8181と交互に表示されるが、port(session)は8080か8181どちらかに固定されている。
f:id:mirea-no-k:20190123092011p:plain

おまけ
JMeterでレスポンス検証を実施。
コネクションプールを使用したほうが早いことが分かった。
f:id:mirea-no-k:20190129190009p:plain

検証環境

[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]#