美文网首页
tomcat集群的会话保持及相关示例

tomcat集群的会话保持及相关示例

作者: 小尛酒窝 | 来源:发表于2018-06-18 21:50 被阅读0次

    一、前言

    tomcat集群会话保持方式大体可以分为三种:
    1、session sticky:利用前端调度器的负载均衡算法(如:ip_hash)实现session sticky,将来自同一个源Ip的会话负载到同一个后端服务器上。但是此方法的缺点在于,有可能会导致某个后端服务器负载过高,而其他后端服务器负载很低的情况出现,
    2、session cluster:通过定义tomcat集群节点,将会话共享同步到所有tomcat节点,使用一个连接会话不管调度到哪个后端服务器都能找到其对应的会话记录。但是此方法在于不适用于大规模的集群,因为当集群规模很大的时候, 需要同步的session信息将是巨量。此时session的复制同步有可能会成为影响系统性能的瓶颈。
    3、session server:通过会话服务器来保存session。tomcat可以结合memcache,将session保存到memcache服务器上,然后后端服务器通过在memcache服务器上读取session信息来实现会话保持。

    二、Session Sticky配置示例

    配置拓扑

    Session Sticky的配置原理为在前端director上应用相应的调度算法来实现会话保持,如使用Nginx调度时,设置使用ip_hash算法进行调度。

    1、配置TomcatA服务器

    #自行下载jdk和tomcat的源码包并防止在/usr/local/src目录下
    #编译安装jdk
    [root@tomcatA ~]# cd /usr/local/src/
    [root@tomcatA src]# tar xf jdk-10.0.1_linux-x64_bin.tar.gz
    [root@tomcatA src]# ln -sv /usr/local/src/jdk-10.0.1 /usr/local/jdk
    ‘/usr/local/jdk’ -> ‘/usr/local/src/jdk-10.0.1’
    [root@tomcatA src]# vim /etc/profile.d/jdk.sh
    export JAVA_HOME=/usr/local/jdk
    export PATH=$JAVA_HOME/bin:$PATH
    [root@tomcatA src]# source /etc/profile.d/jdk.sh
    [root@tomcatA src]# java -version
    java version "10.0.1" 2018-04-17
    Java(TM) SE Runtime Environment 18.3 (build 10.0.1+10)
    Java HotSpot(TM) 64-Bit Server VM 18.3 (build 10.0.1+10, mixed mode)
    
    #编译安装tomcat
    [root@tomcatA src]# tar xf apache-tomcat-7.0.88.tar.gz 
    [root@tomcatA src]# ln -sv /usr/local/src/apache-tomcat-7.0.88 /usr/local/tomcat
    ‘/usr/local/tomcat’ -> ‘/usr/local/src/apache-tomcat-7.0.88’
    [root@tomcatA src]# vim /etc/profile.d/tomcat.sh
    export TOMCAT_HOME=/usr/local/tomcat
    export PATH=$TOMCAT_HOME/bin:$PATH
    [root@tomcatA src]# source /etc/profile.d/tomcat.sh
    
    #添加tomcat测试页面
    [root@tomcatA src]# mkdir -pv /usr/local/tomcat/webapps/test/{WEB-INF,META-INF,classes,lib}
    mkdir: created directory ‘/usr/local/tomcat/webapps/test’
    mkdir: created directory ‘/usr/local/tomcat/webapps/test/WEB-INF’
    mkdir: created directory ‘/usr/local/tomcat/webapps/test/META-INF’
    mkdir: created directory ‘/usr/local/tomcat/webapps/test/classes’
    mkdir: created directory ‘/usr/local/tomcat/webapps/test/lib’
    [root@tomcatA src]# vim /usr/local/tomcat/webapps/test/index.jsp
    <%@ page language="java" %>
    <html>
      <head><title>TomcatA</title></head>
      <body>
        <h1><font color="red">TomcatA.example.com</h1>
        <table align="centre" border="1">
          <tr>
            <td>Session ID</td>
        <% session.setAttribute("example.com","example.com"); %>
            <td><%= session.getId() %></td>
          </tr>
          <tr>
            <td>Created on</td>
            <td><%= session.getCreationTime() %></td>
         </tr>
        </table>
      </body>
    </html
    
    #启动tomcat服务
    [root@tomcatA src]# /usr/local/tomcat/bin/catalina.sh start
    Using CATALINA_BASE:   /usr/local/tomcat
    Using CATALINA_HOME:   /usr/local/tomcat
    Using CATALINA_TMPDIR: /usr/local/tomcat/temp
    Using JRE_HOME:        /usr/local/jdk
    Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
    Tomcat started.
    [root@tomcatA src]# systemctl stop firewalld
    [root@tomcatA src]# systemctl disable firewalld
    Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
    Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
    [root@tomcatA src]# setenforce 0
    

    2、配置TomcatB服务器

    TomcatB服务器配置大体与TomcatA服务器差不多,只需修改index.jsp的内容为如下,其余的配置参考TomcatA的配置即可。

    [root@tomcatB src]# vim /usr/local/tomcat/webapps/test/index.jsp
    <%@ page language="java" %>
    <html>
      <head><title>TomcatB</title></head>
      <body>
        <h1><font color="green">TomcatB.example.com</h1>
        <table align="centre" border="1">
          <tr>
            <td>Session ID</td>
        <% session.setAttribute("example.com","example.com"); %>
            <td><%= session.getId() %></td>
          </tr>
          <tr>
            <td>Created on</td>
            <td><%= session.getCreationTime() %></td>
         </tr>
        </table>
      </body>
    </html
    

    3、配置Nginx调度器

    #安装Nginx服务
    [root@director ~]# yum install -y epel-release
    [root@director ~]# yum install -y nginx
    
    #修改nginx服务的配置文件
    [root@director ~]# vim /etc/nginx/nginx.conf
        include /etc/nginx/conf.d/*.conf;
            upstream tomcatsrvs {  #配置tomcat server的upstream服务器组并设置调度算法为ip_hash
                    server 192.168.0.83:8080;
                    server 192.168.0.84:8080;
                    ip_hash;
            }
        server {
            listen       80 default_server;
            listen       [::]:80 default_server;
            server_name  _;
            root         /usr/share/nginx/html;
            location / {
                    proxy_pass http://tomcatsrvs;    #将连接会话反代到tomcat server
                    index index.jsp;
            }
            error_page 404 /404.html;
                location = /40x.html {
            }
            error_page 500 502 503 504 /50x.html;
                location = /50x.html {
            }
        }
    
    #启动nginx服务
    [root@director ~]# systemctl start nginx
    [root@director ~]# systemctl stop firewalld
    [root@director ~]# systemctl disable firewalld
    [root@director ~]# setenforce 0
    

    4、配置结果

    此时使用同一个IP多次访问http://192.168.0.81/test/ director会把连接会话调度到同一个服务器上去处理,从而实现会话的保持绑定。

    session sticky结果演示

    三、Session Cluster配置示例

    Session Sticky固然可以实现会话的保持绑定,但是当容易导致后端服务器负载不均衡的情况出现。此时在服务器规模不大的情况下,可以使用Session Cluster来实现会话的保持。在Session Sticky配置的拓扑环境下,我们来配置实现Session Cluster。

    1、修改Nginx 调度器

    #注释掉ip_hash算法,使用默认的轮询算法进行负载均衡
    [root@director ~]# vim /etc/nginx/nginx.conf
            upstream tomcatsrvs {
                    server 192.168.0.83:8080;
                    server 192.168.0.84:8080;
            #       ip_hash;
            }
    
    #重载nginx服务
    [root@director ~]# nginx -t
    nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
    nginx: configuration file /etc/nginx/nginx.conf test is successful
    [root@director ~]# nginx -s reload
    

    2、修改Tomcat A配置

    #在server.xml的<Host> 到</Host>之间添加下述配置
    [root@tomcatA src]# vim /usr/local/tomcat/conf/server.xml 
    
            <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
                     channelSendOptions="8">
    
              <Manager className="org.apache.catalina.ha.session.DeltaManager"
                       expireSessionsOnShutdown="false"
                       notifyListenersOnReplication="true"/>
    
              <Channel className="org.apache.catalina.tribes.group.GroupChannel">
                <Membership className="org.apache.catalina.tribes.membership.McastService"
                            address="228.10.0.4"    #此处配置为集群的同步广播地址,集群内的主机需一致
                            port="45564"
                            frequency="500"
                            dropTime="3000"/>
                <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                          address="auto"    #注意此选项默认是auto,可配置为每个节点自己的ip地址,用于接收session心跳信息。
                          port="4000"
                          autoBind="100"
                          selectorTimeout="5000"
                          maxThreads="6"/>
    
                <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
                  <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
                </Sender>
                <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
                <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
              </Channel>
    
              <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
                     filter=""/>
              <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
    
              <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
                        tempDir="/tmp/war-temp/"
                        deployDir="/tmp/war-deploy/"
                        watchDir="/tmp/war-listen/"
                        watchEnabled="false"/>
    
              <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
              <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
            </Cluster>
    
    #配置test页面的web.xml
    [root@tomcatA src]# cp /usr/local/tomcat/webapps/ROOT/WEB-INF/web.xml /usr/local/tomcat/webapps/test/WEB-INF/web.xml
    [root@tomcatA src]# vim /usr/local/tomcat/webapps/test/WEB-INF/web.xml 
    # 在 <web-app> 中添加
     <distributable/>
    
    #重启tomcat服务
    [root@tomcatA src]# catalina.sh  stop
    [root@tomcatA src]# catalina.sh  start
    
    

    按照同样的步骤配置TomcatB服务器。

    3、配置结果

    配置重启后,在/usr/local/tomcat/logs/目录中相应的catalina日志中可看到下述的同步心跳信息的日志。


    心跳同步日志

    此时使用同一个IP多次访问http://192.168.0.81/test/ 其sessionid均不会改变,因此后端的tomcat服务器会通过session cluster 同步相应的session,以确保不管前端调度器把会话调度到哪个后端服务器,均能匹配到同一个session会话。

    session cluster测试访问1
    session cluster测试访问2

    四、Session Server配置示例

    使用Session Server memcached来使得tomcat保持会话需要借助tomcat的msm模块,并下载相应的jar包(javolution、memcached-session-manager-tc7、spymemcached、memcached-session-manager、msm-javolution-serializer,注意相关包需要与tomcat版本相一致),然后放置在/usr/local/tomcat/lib目录下,以支持msm功能,相关的包均可以百度谷歌下载到。

    在之前的拓扑的基础上,增加两个memcached服务器作为Session Server。


    部署拓扑图

    1、配置memcached服务器

    #分别在两个memcached服务器上安装memcached服务
    [root@memcachedA ~]# yum install -y memcached
    #启动memcached服务
    [root@memcachedA ~]# systemctl start memcached
    #观察看到11211端口启用的话,说明memcached服务启动正常
    [root@memcachedA ~]# ss -tnl
    State       Recv-Q Send-Q                               Local Address:Port                                              Peer Address:Port              
    LISTEN      0      128                                              *:11211                                                        *:*                  
    LISTEN      0      128                                              *:22                                                           *:*                  
    LISTEN      0      100                                      127.0.0.1:25                                                           *:*                  
    LISTEN      0      128                                             :::11211                                                       :::*                  
    LISTEN      0      128                                             :::22                                                          :::*                  
    LISTEN      0      100                                            ::1:25                                                          :::*               
    

    2、修改配置tomcatA

    #确保下载了指定的jar包
    [root@tomcatA ~]# cd /usr/local/tomcat/lib/
    [root@tomcatA lib]# ll
    total 8116
    .....
    -rw-r--r--. 1 root root  395195 Jun 18 21:30 javolution-5.5.1.jar
    .....
    -rw-r--r--. 1 root root  167266 Jun 18 21:30 memcached-session-manager-2.3.0.jar
    -rw-r--r--. 1 root root   11704 Jun 18 21:30 memcached-session-manager-tc7-2.3.0.
    -rw-r--r--. 1 root root   70012 Jun 18 21:30 msm-javolution-serializer-2.1.1.jar
    ....
    -rw-r--r--. 1 root root  407912 Jun 18 21:30 spymemcached-2.7.3.jar
    ....
    
    
    #把此前在 /usr/local/tomcat/conf/server.xml 的<Host> </Host>中添加的内容修改为下述内容
    
    [root@tomcatA ~]# vim /usr/local/tomcat/conf/server.xml
               <Context path="/test" docBase="/usr/local/tomcat/webapps/test" reloadable="true">
                  <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
                    memcachedNodes="n1:192.168.0.87:11211,n2:192.168.0.89:11211"    #指定session server
                    failoverNodes="n2"    #把n2作为failover节点,优先使用n1作为session server
                    requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
                    transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory"
                  />
                 </Context>
    
    #重启tomcat服务
    [root@tomcatA ~]# catalina.sh stop
    [root@tomcatA ~]# catalina.sh start
    
    

    3、修改配置tomcatB

    #确保下载了指定的jar包
    [root@tomcatB ~]# cd /usr/local/tomcat/lib/
    [root@tomcatB lib]# ll
    total 8116
    .....
    -rw-r--r--. 1 root root  395195 Jun 18 21:30 javolution-5.5.1.jar
    .....
    -rw-r--r--. 1 root root  167266 Jun 18 21:30 memcached-session-manager-2.3.0.jar
    -rw-r--r--. 1 root root   11704 Jun 18 21:30 memcached-session-manager-tc7-2.3.0.
    -rw-r--r--. 1 root root   70012 Jun 18 21:30 msm-javolution-serializer-2.1.1.jar
    ....
    -rw-r--r--. 1 root root  407912 Jun 18 21:30 spymemcached-2.7.3.jar
    ....
    
    #把此前在 /usr/local/tomcat/conf/server.xml 的<Host> </Host>中添加的内容修改为下述内容
    [root@tomcatB ~]# vim /usr/local/tomcat/conf/server.xml 
               <Context path="/test" docBase="/usr/local/tomcat/webapps/test" reloadable="true">
                  <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
                    memcachedNodes="n1:192.168.0.87:11211,n2:192.168.0.89:11211"    #指定session server
                    failoverNodes="n1"  #把n1作为failover节点,优先使用n2作为session server
                    requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
                    transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory"
                  />
                 </Context>
    
    #重启tomcat服务
    [root@tomcatB ~]# catalina.sh stop
    [root@tomcatB ~]# catalina.sh start
    

    4、配置结果

    配置完成后,此时同一个Ip多次访问http://192.168.0.81/test 会能正常轮询到后端两个服务器,并且其sessionid不变。这是因为tomcat server把session保存至了memcached服务器中,并从中读取相关的记录来匹配会话。

    配置结果1
    配置结果2

    https://github.com/magro/memcached-session-manager

    相关文章

      网友评论

          本文标题:tomcat集群的会话保持及相关示例

          本文链接:https://www.haomeiwen.com/subject/smhmeftx.html