msmベースtomcatでのセッション共有
前提条件システムcentos 7 1908 mini を使用 nginx逆エージェントの実装:192.168.38.30(エージェントtomcat 1とtomcat 2) tomcatサーバ1:192.168.38.60 を実現 tomcatサーバ2:192.168.38.61 を実現 memcacheサーバ1:192.168.38.78 を実現 memcacheサーバ2:192.168.38.79 を実装 redisサーバの実装:192.168.38.70 redisサーバの実装:192.168.38.71 時間同期 ファイアウォールを閉じ、selinux インプリメンテーション
1.tomcatインストール関連jarパッケージ現在のプロジェクトはGithub、 に管理されている.
2.stickyモードによるセッション共有
2.1原理
要求が終了すると、Tomcatのセッションはmemcachedバックアップに送信されます.すなわち、Tomcatセッションはメインセッションであり、memcachedセッションはバックアップセッションであり、memcachedを使用することはセッションをバックアップすることに相当する.
Sessionを検索するとTomcatは自分のメモリのSessionを優先的に使用し、TomcatはjvmRouteで自分のSessionではないことを発見し、memcachedからそのSessionを見つけ、本機Sessionを更新し、完了後にmemcachedの更新を要求する.
2.2配置方式
2.3 memcache実装
2.3.1配置 tomcatサーバで を変更
2.3.2テスト構成が成功すればlogs/catalina.outには次の内容が表示されます リバースエージェントにアクセスし、効果 を表示します. python結果 を表示
2.4 redis実装 tomcatサーバで を変更
3.non-stickyモードに基づいてセッション共有を実現
3.1 memcache実装 tomcatサーバで を変更
3.1 redis実装 tomcatサーバで を変更
1.tomcatインストール関連jarパッケージ
https://github.com/magro/memcached-session-manager
3
Tomcat Session ,Tomcat
memcached-session-manager-2.3.2.jar
memcached-session-manager-tc8-2.3.2.jar
Session 、
kyro( )
memcached(spymemcached.jar)
Redis(jedis.jar)
, webapp WEB-INF/lib/
asm-5.2.jar
kryo-3.0.3.jar
kryo-serializers-0.45.jar
memcached-session-manager-2.3.2.jar
memcached-session-manager-tc8-2.3.2.jar
minlog-1.3.1.jar
msm-kryo-serializer-2.3.2.jar
objenesis-2.6.jar
reflectasm-1.11.9.jar
spymemcached-2.12.3.jar
2.stickyモードによるセッション共有
2.1原理
要求が終了すると、Tomcatのセッションはmemcachedバックアップに送信されます.すなわち、Tomcatセッションはメインセッションであり、memcachedセッションはバックアップセッションであり、memcachedを使用することはセッションをバックアップすることに相当する.
Sessionを検索するとTomcatは自分のメモリのSessionを優先的に使用し、TomcatはjvmRouteで自分のSessionではないことを発見し、memcachedからそのSessionを見つけ、本機Sessionを更新し、完了後にmemcachedの更新を要求する.
2.2配置方式
<t1> <t2>
· \ / ·
· XX ·
· / \ ·
<m1> <m2>
2.3 memcache実装
2.3.1配置
$CATALINA_HOME/conf/context.xml
# tomcat1
<Context>
...
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:192.168.38.78:11211,n2:192.168.38.79:11211"
failoverNodes="n1"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
</Context>
# tomcat2
<Context>
...
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:192.168.38.78:11211,n2:192.168.38.79:11211"
failoverNodes="n2"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
</Context>
# memcached ;n1、n2 , 。
# failoverNodes ,n1 ,n2
# Tomcat n1 n2, n1, n2。
2.3.2テスト
[192.168.38.60-startStop-1]
de.javakaffee.web.msm.MemcachedSessionService.startInternal --------
- finished initialization:
- sticky: true
- operation timeout: 1000
- node ids: [n2]
- failover node ids: [n1]
- storage key prefix: null
- locking mode: null (expiration: 5s)
http://192.168.38.30
On tomcats
192.168.38.78:8080
SessionID = 2A19B1EB6D9649C9FED3E7277FDFD470-n2.Tomcat1
Wed Jun 26 16:32:11 CST 2019
On tomcats
192.168.38.79:8080
SessionID = 2A19B1EB6D9649C9FED3E7277FDFD470-n1.Tomcat2
Wed Jun 26 16:32:36 CST 2019
import memcache # pip install python-memcached
mc = memcache.Client(['192.168.38.78:11211','192.168.38.79:11211'], debug=True)
stats = mc.get_stats()[0]
print(stats)
for k,v in stats[1].items():
print(k, v)
print('-' * 30)
# key
print(mc.get_stats('items')) # stats items items:5:number 1
print('-' * 30)
print(mc.get_stats('cachedump 5 0')) # stats cachedump 5 0 # 5 items ;0
2.4 redis実装
$CATALINA_HOME/conf/context.xml
# tomcat1
<Context>
...
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:redis://192.168.38.70:6379,n2:redis://192.168.38.71:6379"
failoverNodes="n1"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
</Context>
# tomcat2
<Context>
...
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:redis://192.168.38.70:6379,n2:redis://192.168.38.71:6379"
failoverNodes="n2"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
</Context>
3.non-stickyモードに基づいてセッション共有を実現
3.1 memcache実装
$CATALINA_HOME/conf/context.xml
# tomcat1
<Context>
...
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:192.168.38.78:11211,n2:192.168.38.79:11211"
sticky="false"
sessionBackupAsync="false"
lockingMode="uriPattern:/path1|/path2"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
</Context>
# tomcat2
<Context>
...
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:192.168.38.78:11211,n2:192.168.38.79:11211"
sticky="false"
sessionBackupAsync="false"
lockingMode="uriPattern:/path1|/path2"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
</Context>
3.1 redis実装
$CATALINA_HOME/conf/context.xml
# tomcat1
<Context>
...
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:redis://192.168.38.70:6379,n2:redis://192.168.38.71:6379"
sticky="false"
sessionBackupAsync="false"
lockingMode="uriPattern:/path1|/path2"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
</Context>
# tomcat2
<Context>
...
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:redis://192.168.38.70:6379,n2:redis://192.168.38.71:6379"
sticky="false"
sessionBackupAsync="false"
lockingMode="uriPattern:/path1|/path2"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
</Context>