`

2.基于memcached-session-manager的负载均衡

 
阅读更多

环境CentOS 6.5,Nginx 1.7.2 ,Memcached 1.4.20

一.导出lib

1.利用maven,构建并导出基于kryo-serializer的lib,可以将下面的依赖版本和配置如下

    <properties>
        <memcached-session-manager.version>1.8.2</memcached-session-manager.version>
        <spymemcached.version>2.11.4</spymemcached.version>
        <kryo-serializers.version>0.11</kryo-serializers.version>
        <kryo.version>1.04</kryo.version>
        <minlog.version>1.2</minlog.version>
        <reflectasm.version>1.01</reflectasm.version>
        <asm.version>3.2</asm.version>
    </properties>

    <dependencies>
        <!-- memcached-session-manager -->
        <dependency>
            <groupId>de.javakaffee.msm</groupId>
            <artifactId>memcached-session-manager</artifactId>
            <version>${memcached-session-manager.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>net.spy</groupId>
                    <artifactId>spymemcached</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.couchbase.client</groupId>
                    <artifactId>couchbase-client</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.google.code.findbugs</groupId>
                    <artifactId>jsr305</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.google.code.findbugs</groupId>
                    <artifactId>annotations</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>de.javakaffee.msm</groupId>
            <artifactId>memcached-session-manager-tc7</artifactId>
            <version>${memcached-session-manager.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>com.google.code.findbugs</groupId>
                    <artifactId>jsr305</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.google.code.findbugs</groupId>
                    <artifactId>annotations</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <!-- spymemcached -->
        <dependency>
            <groupId>net.spy</groupId>
            <artifactId>spymemcached</artifactId>
            <version>${spymemcached.version}</version>
        </dependency>

        <!-- kryo-serializer -->
        <dependency>
            <groupId>de.javakaffee.msm</groupId>
            <artifactId>msm-kryo-serializer</artifactId>
            <version>${memcached-session-manager.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>com.google.code.findbugs</groupId>
                    <artifactId>jsr305</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.google.code.findbugs</groupId>
                    <artifactId>annotations</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>de.javakaffee</groupId>
            <artifactId>kryo-serializers</artifactId>
            <version>${kryo-serializers.version}</version>
        </dependency>
        <dependency>
            <groupId>com.googlecode</groupId>
            <artifactId>kryo</artifactId>
            <version>${kryo.version}</version>
        </dependency>
        <dependency>
            <groupId>com.googlecode</groupId>
            <artifactId>minlog</artifactId>
            <version>${minlog.version}</version>
        </dependency>
        <dependency>
            <groupId>com.googlecode</groupId>
            <artifactId>reflectasm</artifactId>
            <version>${reflectasm.version}</version>
        </dependency>
        <dependency>
            <groupId>asm</groupId>
            <artifactId>asm</artifactId>
            <version>${asm.version}</version>
        </dependency>
    </dependencies>

 

2.执行下面的命令下载lib

mvn dependency:copy-dependencies -DoutputDirectory=./target/lib

 lib就会被自动下载到/target/lib目录下,内容如下图。

 

 

 

二.配置tomcat

配置方式主要见https://code.google.com/p/memcached-session-manager/wiki/SetupAndConfiguration

 

1.拷贝LIB

将上面导出的lib拷贝到 $CATALINA_HOME/lib/ 目录下

 

2.配置$CATALINA_HOME/conf/context.xml

以下两种配置选择其中一种,推荐第二种

第一种: sticky sessions + kryo

 

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

注意:

(1) sticky模式时,配置jvmroute参数,每台tomcat的jvmroute参数都不能一样 (测试这种配置方式不适用于多台Servlet容器,或适用于反向代理服务器可以把相同来源的请求映射到同一台容器上的情况下,不推荐;另网上看到该配置修改transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory" 未验证)

$CATALINA_HOME/conf/server.xml

<Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">

 

(2) 必须启动两个Memcached实例,比如

/usr/local/memcached/bin/memcached -d -m 256 -u root -p 11211 -c 128 -P /tmp/memcached1.pid     
/usr/local/memcached/bin/memcached -d -m 256 -u root -p 11212 -c 128 -P /tmp/memcached2.pid

 

 

第二种:non-sticky sessions + kryo

<Context>
  ...
  <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
    memcachedNodes="n1:host1.yourdomain.com:11211,n2:host2.yourdomain.com: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.可选配置$CATALINA_HOME/conf/logging.properties

如果需要调试日志,可以在logging.properties中添加如下内容

 

de.javakaffee.web.msm.level=FINE

 

4. 多台Tomcat配置 需要注意下面内容

1) 修改http访问端口(默认为8080端口)

2) 修改Shutdown端口(默认为8005端口) 

3) 修改AJP 访问端口(默认为8009端口) 

4) 修改http访问(默认 Connector port="8080"),添加 URIEncoding="UTF-8"

 

三.配置Nginx

 

 Nginx安装方式在这:http://sgq0085.iteye.com/blog/2089266

 

修改配置文件 /usr/local/nginx/conf/nginx.conf

下面是Nginx 1.7.2完整事例

#user  nobody;
user gqshao;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    // windows系统下不要 use epoll
    use epoll;
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;
    gzip  on;
    gzip_types       text/javascript text/plain text/css application/xml application/x-javascript;
    gzip_disable "MSIE [1-6].";

    # 配置tomcat服务器
    upstream web_server {
        #ip_hash;
        server 192.168.158.131:8080 max_fails=3  fail_timeout=30s;
        server 192.168.158.131:8081 max_fails=3  fail_timeout=30s;
        server 192.168.158.131:8082 max_fails=3  fail_timeout=30s;
    }

    server {
        # 侦听192.168.158.131的80端口
        listen       80;
        server_name  192.168.158.131;

        #charset koi8-r;
        charset utf-8;

        access_log  logs/host.access.log  main;

        location / {
            proxy_pass    http://web_server ;
            proxy_redirect off ;

            #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

 

 四.启动和停止

启动

# 启动 memcached
sudo /usr/local/memcached/bin/memcached -d -m 256 -u gqshao -p 11211 -c 128 -P /tmp/memcached1.pid
sudo /usr/local/memcached/bin/memcached -d -m 256 -u gqshao -p 11212 -c 128 -P /tmp/memcached2.pid

# 启动 Tomcat
./startup.sh

# 启动 Nginx
sudo /usr/local/nginx/sbin/nginx 
 

停止

# 停止Memcached
sudo kill -9 `cat /tmp/memcached1.pid`
sudo kill -9 `cat /tmp/memcached2.pid`

# 停止Tomcat
./shutdown.sh

# 停止Nginx
ps -ef  | grep nginx  
sudo kill -QUIT 主进程号 
# 强制停止 Nginx 
sudo pkill -9 nginx  

 

 个别问题

 (1)

# 查看端口占用
sudo netstat -tlnp|grep 80  

 

 (2)

项目中如果用到JVM缓存,改为放到session中,相当于通过中央缓存维护session

比如shiro中不要再使用EhCache缓存

 

Sticky(黏性)模式:tomcat session 为 主session, memcached 为备 session。Request请求到来时, 从memcached加载备 session 到 tomcat (仅当tomcat jvmroute发生变化时,否则直接取tomcat session);Request请求结束时,将tomcat session更新至memcached,以达到主备同步之目的。 
Non-Sticky模式:tomcat session 为 中转session, memcached1 为主 session,memcached 2 为备session。Request请求到来时,从memcached 2加载备 session 到 tomcat,(当 容器 中还是没有session 则从memcached1加载主 session 到 tomcat, 这种情况是只有一个memcached节点,或者有memcached1 出错时),Request请求结束时,将tomcat session更新至 主memcached1和备memcached2,并且清除tomcat session 。以达到主备同步之目的

 

附一.Manager标签属性说明

 

1.className  必须
类名:de.javakaffee.web.msm.MemcachedBackupSessionManager
2.memcachedNodes  必须
memcached节点:此属性应该包含所有运行的memcached节点或者membase bucket的uri地址,每一个memcached节点的属性定义格式为<id>:<host>:<port>,多个节点定义直接使用空格或者逗号分隔,形如:memcachedNodes="n1:app01:11211,n2:app02:11211",如果只有单个的memcached节点,则<id>是可选项,只需配置<host>:<port>即可,形如:memcachedNodes="localhost:11211"。
如果我们配置的是membase,那么从1.6.0版本开始,我们可以配置指定一个或者多个membase bucket uris,形如:http://host1:8091/pools,http://host2:8091/pools。Bucket 名称和密码通过属性username,password来定义。membase buckets连接需要遵循memcached协议,传输数据通过二进制流方式。
3.failoverNodes 可选项
故障转移节点:可选项,对非黏性session不可用,属性必须包含memcached节点集群的所有ids。节点id之间用空格或者逗号分隔。
4.username 可选项
从1.6.0版开始使用,并且是可选的。用来进行membase bucket或者SASL验证,密码可以为空。
5.password 可选项
从1.6.0版开始使用,并且是可选的。用来进行membase bucket或者SASL验证,密码可以为空。
6.memcachedProtocol    可选项
定义memcached协议,默认使用text文本,出属性指明memcached使用的存储协议。只支持text或者binary。
7.sticky    可选项
定义session方式为黏性或非黏性,默认为true,多个tomcat时需使用非黏性
8.lockingMode    可选项
只有非黏性session才使用,默认值为none
none: 从不对session进行锁定
all: session将一直被锁定,知道请求结束
auto: 对于只读请求,session将不会被锁定,如果是非只读请求,则session会被锁定
uriPattern:<regexp>: 通过正则表达式的方式来对请求uri以及查询字符串进行匹配,只有匹配上的才会被锁定。
9.requestUriIgnorePattern   可选项
此属性是那些不能改备份Session的请求的正则表达式。如果像css,javascript,图片等静态文件被同一个Tomcat和同一个应用上下文来提供,这些请求也会通过memcached-session-manager。但是这些请求在一个http会话中几乎没什么改变,所以他们没必要触发Session备份。所以那些静态文件没必要触发Session备份,你就可以使用此属性定义。此属性必须符合java regex正则规范。
   如:".*\.(png|gif|jpg|css|js)$"  
10.sessionBackupAsync   可选项
指定Session是否应该被异步保存到Memcached中。 如果被设置为true,backupThreadCount设置起作用,如果设置false,通过sessionBackupTimeout设置的过期时间起作用。
11.backupThreadCount    可选项
用来异步保存Session的线程数,(如果sessionBackupAsync="true")。默认值为cup的内核数。
12.sessionBackupTimeout    可选项
设置备份一个Session所用的时间,如果操作超过时间那么保存失败。此属性只在sessionBackupAsync="false"是起作用。默认100毫秒
13.operationTimeout    可选项
从1.6.0版开始使用, 默认值为1000
14.sessionAttributeFilter    可选项
此属性是用来控制Session中的那个属性值保存到Memcached中的正则表达式。郑则表达式被用来匹配Session中属性名称。如sessionAttributeFilter="^(userName|sessionHistory)$" 指定了只有"userName"和"sessionHistory"属性保存到Memcached中。依赖于选择的序列化策略。
15.transcoderFactoryClass    可选项
此属性值是创建序列化和反序列化保存到Memcached中的Session的编码转换器的工厂类名。这个指定的类必须实现了de.javakaffee.web.msm.TranscoderFactory和提供一个无参的构造方法。例如其他的有效的实现在其他packages/jars中提供如:msm-kryo-serializer,msm-xstrea-serializer和msm-javolution-serializer.
默认为 de.javakaffee.web.msm.JavaSerializationTranscoderFactory
16.copyCollectionsForSerialization    可选项
默认值为false。
17.customConverter    可选项
自己定义特殊的类注册到kryo自定义转换器中,实现序列化
18.enableStatistics    可选项
用来指定是否进行统计。 默认值为true。
19.enabled   可选项
指定Session保存到Memcached中是否可用和是否可以通过JMX进行改变。只用于粘性Session。 默认值为true。
 

 附二.会话管理相关测试结果

按非黏性的配置,经过多次测试,得到如下结论()

1.web.xml中配置的session-config.session-timeout是起作用的;

2.HttpSession监听,HttpSessionListener的测试中,sessionCreated方法每次请求都会被触发,但sessionDestroyed不会被自动触发,如果在缓存销毁后一段时间(不到一分钟左右)内发生访问才会被触发。手动调用request.getSession().invalidate();,也会被触发。

 

0
0
分享到:
评论

相关推荐

    session共享 memcached-session-manager 1.9.6 jar

    总结来说,`memcached-session-manager`是一个用于在Tomcat环境中实现基于Memcached的session共享的工具,版本1.9.6已被证实兼容Tomcat 7和8,并且能有效支持负载均衡。它利用Kryo等高效序列化库,优化了session在...

    tomcat-7.0.54配合使用的memcached-session-manager1.6.1的整套jar包

    需要注意的是,使用`memcached-session-manager`可能会带来额外的网络开销,因此,在大型分布式环境中,最好对Memcached集群进行合理规划和负载均衡,以确保性能和可用性。 总之,`memcached-session-manager`为...

    memcached-session-manager_4_tomcat8

    3. **Memcached-Session-Manager**:这是用于Tomcat的第三方模块,使得可以将用户的session数据存储在memcached服务器上,实现session的分布式管理,适合多服务器环境,提供高可用性和负载均衡。 4. **Java 1.8**:...

    nginx集成memcached-session-manager所需要的jar

    Memcached-session-manager是Java应用程序,用于在Tomcat或其他基于Servlet的容器中管理会话,并将其存储在Memcached中,以实现会话的分布式和高可用性。 首先,我们需要理解会话管理在Web应用中的重要性。会话允许...

    memcached-session-manager-1.8.1

    3. **负载均衡**:MSM支持多种负载均衡策略,如轮询、最少连接等,确保session在多个服务器之间均匀分布,提高系统整体性能。 4. **故障转移**:如果某个Memcached服务器宕机,MSM会检测到这一情况,并自动将...

    Memcached_Session_Manager jar

    传统的基于内存的会话管理在服务器扩展时容易导致数据不一致或丢失,而 Memcached_Session_Manager 解决了这个问题。 **Memcached** 是一个高性能、分布式内存对象缓存系统,它可以存储任意的数据类型,包括字符串...

    Memcached-Session-Manager多tomcat实现session共享配置

    一致性哈希可以确保Session在负载均衡下的分布更均匀。通过设置`hashAlgorithm`属性,如`hashAlgorithm="CRC32"`,可实现一致性哈希策略。 4. **会话复制策略** 可以通过设置`sessionBackupAsync`属性来控制...

    tomcat9+tomcat-cluster-redis-session-manager_4.0.zip

    "tomcat9+tomcat-cluster-redis-session-manager_4.0.zip"这个文件组合涉及到的是在Tomcat 9上实现负载均衡以及使用Redis作为Session管理器的高级配置。 首先,Tomcat 9是Apache Tomcat服务器的一个版本,它是Java ...

    Nginx+Tomcat+Memcached-Session-Manager集群Session共享

    在本篇文章中,我们将深入探讨如何使用Nginx、Tomcat和Memcached-Session-Manager(MSM)来构建一个集群环境,并实现Session共享。这涉及到集群搭建、分布式应用以及缓存管理等多个方面的IT知识。下面将详细展开这些...

    nginx-1.9.3--tomcat-(6,7)-memcached-session共享负载

    在构建高性能、高可用性的Web服务时,"nginx-1.9.3--tomcat-(6,7)-memcached-session共享负载"是一个典型的架构模式,它整合了Nginx、Tomcat以及Memcached来实现负载均衡和Session共享。这个配置方案能够有效地提高...

    nginx+tomcat+memcached负载均衡集群搭建许jar包大全

    2)Tomcat6和Tomcat7使用不同msm支持包:memcached-session-manager-tc6-1.6.5.jar和memcached-session-manager-tc7-1.6.5.jar,只可选一,否则启动报错。 3)msm源码中的lib包版本太低:spymemcached需要使用...

    apache-tomcat-7.0.47-memcached-各种序列化策略-session共享

    在Web应用中,session管理是关键,尤其是在集群环境中,确保用户会话在多个服务器之间共享以实现负载均衡和高可用性。 在这个压缩包中,包含了使用不同序列化策略的Tomcat与Memcached集成示例。序列化是将Java对象...

    负载均衡session共享memcached jar包

    在这个场景中,"负载均衡session共享memcached jar包"的主题涉及到使用Nginx作为负载均衡器,解决多台Tomcat服务器之间Session共享的问题,以及如何通过引入特定的jar包来实现这一目标。 Nginx是一款高性能的HTTP和...

    nginx+tomcat8.0+memcached1.5 session共享所需jar包

    为了设置session共享,你需要在Tomcat的配置文件(如`context.xml`或`server.xml`)中配置Memcached Session Manager,并指定Spy Memcached为客户端,同时在Nginx配置中启用session sticky或负载均衡策略。...

    memcached-1.4.15

    - **负载均衡**:通过缓存减轻数据库负载,实现负载均衡。 - **Session共享**:在集群环境中,通过memcached实现用户session的跨服务器共享。 综上所述,`memcached-1.4.15` 是一个强大且高效的内存缓存系统,结合...

    jar包.zip(Nginx的Session一致性,使用memcached解决所需要的jar包)

    2. **配置Nginx**:在Nginx的负载均衡配置中启用`sticky`或`ip_hash`策略。`sticky`可以让相同客户端的请求总是被分发到同一台后端服务器,以保持Session的一致性;`ip_hash`则是根据客户端IP的哈希结果来分发,同样...

    Arch-03-15- Nginx+tomcat 配置负载均衡动静分离

    标题“Arch-03-15- Nginx+tomcat 配置负载均衡动静分离”涉及的是在Web服务器架构中使用Nginx与Tomcat的集成,通过配置实现负载均衡和动静态资源分离。这样的架构可以提高系统的可用性和响应速度,减轻后端应用...

    Linux-memcached-tomcat8-session共享lib.rar

    这个名为“Linux-memcached-tomcat8-session共享lib.rar”的压缩包文件显然旨在解决一个特定的问题:在Linux系统上,通过Nginx作为负载均衡器,利用Memcached实现跨多个Tomcat实例的session共享。下面将详细解释这个...

    nginx+tomcat7+memcached所需jar

    通过这些jar包的集成,我们可以构建出一个高效的、基于Memcached的session管理解决方案,使得在nginx负载均衡下运行的Tomcat 7应用能充分利用Memcached进行session数据的存储和共享,从而提高系统的整体性能和可靠性...

    Tomcat +memcached 依赖jar包

    通过这个jar包,开发者可以将用户的session状态存储在memcached中,从而实现负载均衡和高可用性。 4. **msm-javolution-serializer-1.5.1.jar**:这是一个额外的序列化器,基于Javolution库,用于memcached-session...

Global site tag (gtag.js) - Google Analytics