Session共享与Sticky模式:优化Web应用性能
在分布式Web应用程序中,会话(Session)管理是确保用户状态在整个服务集群中保持一致的关键。随着应用规模的扩大和用户基数的增长,如何高效地处理会话数据成为了开发者面临的一个重要课题。本文将探讨两种常用的会话管理策略——Session共享与Sticky模式,并讨论它们各自的适用场景及实现方式。
什么是Session?
首先,我们需要了解什么是Session。简单来说,Session是一种用于存储特定用户会话所需信息的方法。它使得服务器能够在一段时间内记住用户的动作和偏好设置,比如登录状态、购物车内容等。然而,在分布式环境中,由于请求可能被路由到不同的服务器实例上,传统的基于内存的Session管理方式面临着挑战。
Session 共享服务器
Session共享指的是所有参与服务的节点都能访问相同的会话数据。这通常通过将Session数据存储在一个中心化的存储系统中来实现,如Redis、Memcached或数据库。
MSM 介绍
注意:当前MSM不支持 tomcat11版本
MSM(memcached session manager)提供将Tomcat的session保持到memcached或Redis的程序,可以实现高可用。
项目早期托管在google code,目前在Github。
github 网站链接:https://github.com/magro/memcached-session-manager
支持Tomcat的 6.x、7.x、8.x、9.x
Tomcat的Session管理类,Tomcat版本不同
- memcached-session-manager-2.3.2.jar
- memcached-session-manager-tc8-2.3.2.jar
Session数据的序列化、反序列化类
- 官方推荐kyro
- 在webapp中WEB-INF/lib/下
驱动类
- memcached(spymemcached.jar)
- Redis(jedis.jar)
安装
参考链接
https://github.com/magro/memcached-session-manager/wiki/SetupAndConfiguration
将spymemcached.jar、memcached-session-manage、kyro相关的jar文件都放到Tomcat的lib目录中去,这个目录是 $CATALINA_HOME/lib/,对应本次安装就是/usr/local/tomcat/lib。
kryo-3.0.3.jar
asm-5.2.jar
objenesis-2.6.jar
reflectasm-1.11.9.jar
minlog-1.3.1.jar
kryo-serializers-0.45.jar
msm-kryo-serializer-2.3.2.jar
memcached-session-manager-tc8-2.3.2.jar
spymemcached-2.12.3.jar
memcached-session-manager-2.3.2.jar
Sticky 模式
Sticky 模式工作原理
sticky 模式即前端tomcat和后端memcached有关联(粘性)关系
参考文档
https://github.com/magro/memcached-session-manager/wiki/SetupAndConfiguration
对于最简单的集成,你只需要安装一个 tomcat(6、7、8 或 9)和一个 memcached 或 Redis(或支持 memcached 协议的 s.th)。
在您的生产环境中,您可能会有多个 tomcat,并且还应该在不同的硬件上提供多个 memcached 节点。
或者,您可以将会话数据存储在 Redis 中,而不是 memcached 中。
你可以使用粘性会话和非粘性会话,memcached-session-manager (msm) 支持两种作模式。以下描述显示了一个具有粘性会话的设置示例,其中安装了两个 tomcat 实例和两个 memcached 实例。
Tomcat-1 (t1) 将主要将其会话存储在运行在另一台机器上的 memcached-2 (m2) 中(m2 是 t1 的常规节点)。
仅当 m2 不可用时,t1 才会将其会话存储在 memcached-1 中(m1,m1 是 t1 的 failoverNode)。
使用此配置,当计算机 1(服务 t1 和 m1)崩溃时,会话不会丢失。
下面非常好的 ASCII 图片展示了这种设置。<t1> <t2>. \ / .. X .. / \ .
<m1> <m2>
t1和m1部署可以在一台主机上,t2和m2部署也可以在同一台。
当新用户发请求到Tomcat1时, Tomcat1生成session返回给用户的同时,也会同时发给memcached2备份。即Tomcat1 session为主session,memcached2 session为备用session,使用memcached相当于备份了一份Session。
如果Tomcat1发现memcached2 失败,无法备份Session到memcached2,则将Sessoin备份存放在memcached1中。
配置过程
下载相关jar包
下载相关jar包,参考下面官方说明的下载链接
https://github.com/magro/memcached-session-manager/wiki/SetupAndConfiguration
tomcat和memcached相关包
修改tomcat配置
修改 $CATALINA_HOME/conf/context.xml 特别注意,t1配置中为failoverNodes=“n1”, t2配置为failoverNodes=“n2”
#以下是sticky的配置
<Context>...<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"memcachedNodes="n1:192.168.1.80:11211,n2:192.168.1.70:11211"failoverNodes="n1"requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"/></Context>
配置说明
memcachedNodes="n1:host1.yourdomain.com:11211,n2:host2.yourdomain.com:11211"memcached的节点: n1、n2只是别名,可以重新命名。
failoverNodes 为故障转移节点,n1是备用节点,n2是主存储节点。
另一台Tomcat将此处的n1改为n2,其主节点是n1,备用节点是n2
实战案例 1:tomcat和memcached集成在一台主机
环境准备
时间同步,确保NTP或Chrony服务正常运行
防火墙规则
禁用SELinux 三台主机
192.168.1.60 nginx nginx
192.168.1.70 tomcat1 jdk21,tomcat10,memcached1.6.24
192.168.1.80 tomcat2 jdk21,tomcat10,memcached1.6.24
配置 Nginx 充当 Proxy
[root@nginx conf.d]#cat tomcat.conf
upstream tomcat {server 192.168.1.70:8080;server 192.168.1.80:8080;
}
server {listen 80;server_name www.caoge.com;location / {proxy_pass http://tomcat;
}
}
[root@nginx conf.d]#systemctl restart nginx.service
配置 Memcached
在 tomcat1 上配置 memcached
[root@tomcat1 ~]#apt -y install memcached
[root@tomcat1 ~]#vim /etc/memcached.conf
#-l 127.0.0.1
#-l ::1
[root@tomcat1 ~]#systemctl restart memcached.service
在 tomcat2 上配置 memcached
[root@tomcat2 ~]#apt -y install memcached
[root@tomcat2 ~]#vim /etc/memcached.conf
#-l 127.0.0.1
#-l ::1
[root@tomcat2 ~]#systemctl restart memcached.service
配置 Tomcat
[root@tomcat1 conf]#vim context.xml
......