memcached-session-manager配置

memcached-session-manager是一个用于解决分布式Tomcat环境下session共享的问题的开源解决方案,支持黏性、非黏性Session,无单一故障点,可处理Tomcat和memcached故障转移,支持多种缓存组件,包括memcached、memcachedb、membase等。通过配置和特定的工作原理,memcached-session-manager能够在提高系统并发量和可用性的同时,解决单点故障问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        最近项目有使用到memcached-session-manager,简称msm,是一个用于解决分布式tomcat环境下session共享的问题的开源解决方案。我在网上查阅了一些资料,在这里做下总结。部分内容转自http://gong1208.iteye.com/blog/1596120

一 .简介

引言
        MSM–memcached session manager是一个高可用的Tomcat session共享解决方案,除了可以从本机内存快速读取Session信息(仅针对黏性Session)外,同时可使用memcached存取Session,以实现高可用。
        对于非黏性Session,memcached直接存储session。
        除memcached外,还可以其他缓存组件如memcachedb, membase等。
特性
        支持Tomcat6、Tomcat7、Tomcat8
        支持黏性、非黏性Session
        无单一故障点
        可处理tomcat故障转移
        可处理memcached故障转移
        插件式session序列化
        允许异步保存session,以提升响应速度
        只有当session有修改时,才会将session写回memcached
        JMX管理&监控
MSM解决的问题
        假设你有一个Tomcat集群,使用黏性session,如何应对单点故障问题?为了应对更多的并发量和可用性,你可以不断的增加Tomcat节点,但是单点故障仍旧会是个问。如果使用黏性Session,一个Tomcat故障时,其他Tomcat并不能接管故障Tomcat节点的Session。
        解决此问题的思路就是将黏性Session同时保存在Memcached中,如果单个Tomcat发生故障,集群中的其他Tomcat可以从Memcached中得到Session信息。
       【注】对于非黏性Session,MSM V1.4.0及以后版本已经支持。
MSM如何工作
       【注】以下论述仅针对黏性Session
        安装在Tomcat上的MSM使用本机内存保存session,和StandardManager一样。另外,当一个请求结束时,session会被送回Memcached进行备份。当下一次请求开始时本地Session可用,直接服务,请求结束后session又被送回Memcached备份。当集群中的一个Tomcat挂掉,下一次请求会被路由到其他Tomcat上。负责处理此此请求的Tomcat并不清楚Session的信息。此时它会从Memcached查找该Session,更新该Session并将其保存在本机内容。此次请求结束,session被修改,送回Memcached备份。
故障转移
        上边介绍的是处理Tomcat故障转移,MSM又是如何处理Memcached故障转移呢?
        如果一个Memcached故障,当前Memcached中的Session会转移到其他Memcached节点,同时,JSESSIONID被修改并送回浏览器。如果使用黏性Session,应确保loadbalancer中配置生成的JSESSIONID无任何后缀。
SESSIONID的格式
        MSM知道Memcached节点列表,这些节点标识会存储在SESSIONID中,
        SESSIONID值类似:602F7397FBE4D9932E59A9D0E52FE178-n1 【其中n1为Memcached节点标识】

二 .配置

        安装环境为tomcat8+memcached1.4.2,以前版本的tomcat配置方法相同但是依赖的jar包有所区别,
本文以tomcat8为主。之前版本的可以参考上面给出的地址
所需jar包
所需jar包
        需要的同学可以到 http://download.youkuaiyun.com/detail/im_mvp/8797431这里进行下载,
        也可以在http://mvnrepository.com/上自行查找需要的jar包
        下载完成后请将上面的jar包放到/tomcat/lib目录下
修改配置文件
        修改每台tomcat的conf目录下得context.xml文件或者server.xml文件,在其中加入以下任意一段代码
A:使用默认的sticky session,kryo序列化方式

<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"  
    memcachedNodes="n1:127.0.0.1:11211,n2:127.0.0.1:11212"  
    failoverNodes="n1"  
    requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"  
    transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"  
/> 

B:使用non-sticky session,kryo序列化方式

<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
    memcachedNodes="n1:127.0.0.1:11211,n2:127.0.0.1:11212"
    sticky="false"
    sessionBackupAsync="false"
    requestUriIgnorePattern=".*\.(png|gif|jpg|css|js)$"
    transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>

C:使用membase

<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"  
    memcachedNodes="http://host1.yourdomain.com:8091/pools"  
    username="bucket1"  
    password="topsecret"  
    memcachedProtocol="binary"  
    sticky="false"  
    sessionBackupAsync="false"  
    requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"  
    transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"  
/> 

当使用javolution序列化方式将

transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"

替换为

transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory"

启动tomcat,若配置成功控制台会显示以下内容

六月 12, 2015 9:49:42 上午 de.javakaffee.web.msm.MemcachedSessionService startInternal
信息: --------
- finished initialization:
- sticky: false
- operation timeout: 1000
- node ids: [n1]
- failover node ids: []
- storage key prefix: null

三 .原理

        MSM(memcached-session-manager) 利用 Value(Tomcat 阀)对Request进行跟踪。
        Request请求到来时,从memcached加载session。
        Request请求结束时,将tomcat session更新至memcached,以达到session共享之目的,
支持 sticky 和 non-sticky 模式
        需要注意的是使用sticky模式时需要配置jvmroute参数,配置方式如下:
        修改/tomcat/conf/server.xml,
        <Engine name=”Catalina”defaultHost=”localhost”jvmRoute=”tomcat2”/>
        注意每台tomcat的jvmroute参数都不能一样
        返回sessionid :011F1CAEAF5AE925F4124D94785AFE41-n1 .tomcat2
        n1 表示memcached ; .tomcat2表示配置jvmRoute。
Sticky 模式:
        tomcat session 为 主session, memcached 为备 session。Request请求到来时, 从memcached加载备 session 到tomcat (仅当tomcat jvmroute发生变化时,否则直接取tomcat session);Request请求结束时,将tomcat session更新至memcached,以达到主备同步之目的。
Non-Sticky模式:
        tomcat session 为 中转session, memcached1 为主 sessionmemcached 2 为备session。Request请求到来时,从memcached 2加载备 session 到 tomcat,(当容器中还是没有session 则从memcached1加载主 session 到 tomcat, 这种情况是只有一个memcached节点,或者有memcached1 出错时),Request请求结束时,将tomcat session更新至 主memcached1和备memcached2,并且清除tomcat session 。以达到主备同步之目的

四 .Manager标签属性说明

className 必要
        类名:de.javakaffee.web.msm.MemcachedBackupSessionManager
memcachedNodes 必要
        这个属性必须包含你所有运行的memcached节点。每个节 点的定义格式为id:host:port
        多个之间用空格或半角逗号隔开(如:memcachedNodes=”n1:localhost:11211,n2:localhost:11212”)。
        如果你设置单个memcache节点<id>是可选的,所以它允许设置为 memcachedNodes=”localhost:11211”。
failoverNodes 可选项
        属性只能用在非粘连Session机制中。此属性必须包含memcached节点的Id,此节点是Tomcat作为备份使用。多个之间用空格或逗号隔开
memcachedProtocol 可选项
        可选项,默认为text。出属性指明memcached使用的存储协议,只支持text或者binary。
sticky 可选项
        指定使用粘性的还是非粘性的Session机制,默认为true。
lockingMode 可选项
        此属性只对非粘性Session有用,默认为none。 指定非粘性Session的锁定策略,有以下几种
        (1) none:从来不加锁
        (2) all: 当请求时对Session锁定,直到请求结束
        (3) auto:对只读的request不加锁,对非只读的request加锁
        (4) uriPattern:<regexp>: 使用正则表达式来比较requestRUI + “?” + queryString来决定是否加锁,
requestUriIgnorePattern 可选项
        此属性是那些不能改备份Session的请求的正则表达式。如果像css,javascript,图片等静态文件被同一个Tomcat和同一个应用上下文来提供,这些请求也会通过memcached-session-manager。但是这些请求在一个http会话中几乎没什么改变,所以他们没必要触发Session备份。所以那些静态文件没必要触发Session备份,你就可以使用此属性定义。此属性必须符合java regex正则规范。
sessionBackupAsync 可选项
        默认true,指定Session是否应该被异步保存到Memcached中。
        如果设置为true,backupThreadCount设置起作用,
        如果设置为false,通过sessionBackupTimeout设置的过期时间起作用
backupThreadCount 可选项
        默认为CPU内核数。用来异步保存Session的线程数(如果sessionBackupAsync=”true”)
sessionBackupTimeout 可选项
        默认100,单位毫秒。设置备份一个Session所用的时间,如果操作超过时间那么保存失败。
此属性只在sessionBackupAsync=”false”时起作用
sessionAttributeFilter 可选项
        从1.5.0版本加入,此属性是用来控制Session中的那个属性值保存到Memcached中的正则表达式。
正则表达式被用来匹配Session中属性名称。如sessionAttributeFilter=”^(userName|sessionHistory)$”
指定了只有”userName”和”sessionHistory”属性保存到Memcached中。
transcoderFactoryClass 可选项
        默认为 de.javakaffee.web.msm.JavaSerializationTranscoderFactory
        属性值是创建序列化和反序列化保存到Memcached中的Session的编码转换器的工厂类名。
        这个指定的类必须实现了de.javakaffee.web.msm.TranscoderFactory和提供一个无参的构造方法。例如其他的有效的实现在其他packages/jars中提供如:msm-kryo-serializer,msm- xstrea-serializer和msm-javolution-serializer.
copyCollectionsForSerialization 可选项,默认false
operationTimeout 可选项,操作超时时间,默认1000毫秒
enableStatistics 可选项,默认true,用来指定是否进行统计
enabled 可选项
        默认true,指定Session保存到Memcached中是否可用和是否可以通过JMX进行改变。只用于粘性Session

1,在tomcat中找到文件apache-tomcat-6.0.37\conf\context.xml 加入内部 <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" memcachedNodes="n1:192.168.1.65:11211" requestUriIgnorePattern=".*\.(png|gif|jpg|css|js)$" sessionBackupAsync="false" sessionBackupTimeout="100" transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory" copyCollectionsForSerialization="false" /> 加入之后的content.xml的内容为 <?xml version='1.0' encoding='utf-8'?> <!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --> <!-- The contents of this file will be loaded for each web application --> <Context> <!-- Default set of monitored resources --> <WatchedResource>WEB-INF/web.xml</WatchedResource> <!-- Uncomment this to disable session persistence across Tomcat restarts --> <!-- <Manager pathname="" /> --> <!-- Uncomment this to enable Comet connection tacking (provides events on session expiration as well as webapp lifecycle) --> <!-- <Valve className="org.apache.catalina.valves.CometConnectionManagerValve" /> <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" memcachedNodes="n1:192.16
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值