使用Memcached做session server实现会话保持

使用Memcached做session server实现会话保持
最新回答
只想待在家

2022-04-16 15:45:09

使用Memcached作为Session Server实现会话保持的方案,核心在于将会话数据集中存储在Memcached中,多台应用服务器共享同一Session数据。以下是具体实现步骤和关键配置说明:

一、架构设计
  1. 组件角色

    前端调度器(如Apache HTTPD):负责请求分发(基于AJP协议)。

    Tomcat服务器集群:处理业务逻辑,但自身不存储Session,而是从Memcached读写。

    Memcached服务:集中存储所有Session数据,确保多台Tomcat访问一致性。

  2. 数据流

    用户请求 → Apache调度 → Tomcat处理 → 从Memcached读取/写入Session → 返回响应。

二、环境准备1. 软件包部署
  • Tomcat类库目录(根据安装方式选择):

    /usr/share/java/tomcat/(yum安装)

    /usr/local/tomcat/lib/(官网包安装)

  • 必需JAR包(需下载并放入类库目录):

    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

2. Memcached服务
  • 安装并启动:yum install memcachedsystemctl start memcached
三、Apache配置

在/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
www.example.com
ProxyVia On ProxyRequests Off ProxyPreserveHost On ProxyPass / balancer://tomcatservers/ ProxyPassReverse / balancer://tomcatservers/ # 管理页面配置 <Location /balancer-manager> SetHandler balancer-manager Require all granted </Location></VirtualHost>四、Tomcat配置1. 修改server.xml

在<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)。

2. 创建测试页面

在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>五、测试验证
  1. 访问
    http://www.example.com/test/
    ,多次刷新页面。
  2. 验证Session一致性

    检查Session ID是否保持不变。

    观察counter值是否递增(证明Session数据在Memcached中持久化)。

六、常见问题排查
  1. Session丢失

    检查Memcached服务是否运行(systemctl status memcached)。

    确认Tomcat类库中JAR包版本兼容。

  2. 性能优化

    调整Memcached内存分配(-m参数)。

    启用Session备份压缩(compressEnabled="true")。

总结

通过Memcached集中管理Session,实现了多台Tomcat的无状态化,便于水平扩展。核心优势是解耦应用服务器与Session存储,但需注意网络延迟和Memcached高可用性(可部署多节点)。