2022-04-16 15:45:09
使用Memcached作为Session Server实现会话保持的方案,核心在于将会话数据集中存储在Memcached中,多台应用服务器共享同一Session数据。以下是具体实现步骤和关键配置说明:
一、架构设计组件角色
前端调度器(如Apache HTTPD):负责请求分发(基于AJP协议)。
Tomcat服务器集群:处理业务逻辑,但自身不存储Session,而是从Memcached读写。
Memcached服务:集中存储所有Session数据,确保多台Tomcat访问一致性。
数据流
用户请求 → Apache调度 → Tomcat处理 → 从Memcached读取/写入Session → 返回响应。
/usr/share/java/tomcat/(yum安装)
/usr/local/tomcat/lib/(官网包安装)
memcached-session-manager-1.8.3.jar
memcached-session-manager-tc7-1.8.3.jar
spymemcached-2.11.1.jar
javolution-5.4.3.1.jar
msm-javolution-serializer-1.8.3.jar
在/etc/httpd/conf.d/ajp-tomcat.conf中配置负载均衡和代理规则:
<Proxy balancer://tomcatservers> BalancerMember ajp://172.18.68.21:8009 route=tomcatA BalancerMember ajp://172.18.68.22:8009 route=tomcatB ProxySet lbmethod=byrequests</Proxy><VirtualHost *:80> ServerName在<Host>标签内添加Memcached Session Manager配置:
<Context path="" docBase="/usr/local/tomcat/webapps/test"> <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" memcachedNodes="n1:172.18.68.11:11211" sticky="false" sessionBackupAsync="false" lockingMode="uriPattern:/path1|/path2" requestUriIgnorePattern=".*.(ico|png|jpg|css|js)$" /></Context>memcachedNodes:指定Memcached节点地址。
sticky="false":禁用Session粘滞,确保请求可路由到任意Tomcat。
sessionBackupAsync:是否异步备份Session(建议生产环境设为true)。
在TomcatA和TomcatB中分别创建测试页面(路径需不同):
mkdir -p /usr/local/tomcat/webapps/test/{WEB-INF/classes,WEB-INF/lib}vim /usr/local/tomcat/webapps/test/index.jsp内容示例:
<%@ page session="true" %><html><body> <h1>Tomcat A/B Session Test</h1> <p>Session ID: <%= session.getId() %></p> <p>Counter: <%= session.getAttribute("counter") %></p> <% session.setAttribute("counter", (Integer)session.getAttribute("counter") + 1); %></body></html>五、测试验证检查Session ID是否保持不变。
观察counter值是否递增(证明Session数据在Memcached中持久化)。
检查Memcached服务是否运行(systemctl status memcached)。
确认Tomcat类库中JAR包版本兼容。
调整Memcached内存分配(-m参数)。
启用Session备份压缩(compressEnabled="true")。
通过Memcached集中管理Session,实现了多台Tomcat的无状态化,便于水平扩展。核心优势是解耦应用服务器与Session存储,但需注意网络延迟和Memcached高可用性(可部署多节点)。