一、session黏性

Nginx的ip_hash方式进行负载均衡。

如果用户的IP地址不发生变化,将每次都访问同一台服务器。

upstream tomcat{
    ip_hash;
    server 192.168.1.1:8080 ;
    server 192.168.1.2:8080 ;
}
#nginx配置文件

使用session粘性,使客户端在一端时间内访问同一台tomcat,从而避免切换后导致的session丢失。但是如果tomcat节点挂掉,session依然会丢失。

二、Tomcat Session集群

Tomcat官方文档,默认集群配置:

<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.0.0.4"
                port="45564"
                frequency="500"
                dropTime="3000"/>
    <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
              address="auto"
              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.MessageDispatchInterceptor"/>
  </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.ClusterSessionListener"/>
</Cluster>

此配置可以放在Engine和Host内,配置的影响范围不同。

复制web.xml到项目的WEB-INF目录内,并且在 web.xml 中的倒数第二行加入 <distributable/> 选项。

最后重启Tomcat服务。

官方文档地址:https://tomcat.apache.org/tomcat-9.0-doc/cluster-howto.html

三、seesion共享服务器

3.1 memcached-session-manager

下载memcached-session-manager,将以下2个jar包,放置在CATALINA_HOME/lib/下。

memcached-session-manager-${version}.jar

memcached-session-manager-tc8-${version}.jar
#tomcat8则使用tc8

3.2 数据库驱动

下载memcached驱动,将驱动jar包,放置在CATALINA_HOME/lib/下。

spymemcached-${version}.jar
#若使用redis则为jedis-3.0.0.jar

3.3序列化

官方推荐方式

3.4 sticky模式

3.4.1 将配置内容放到$CATALINA_HOME/conf/context.xml中。

<Context>
  ...
  <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
    memcachedNodes="n1:host1.yourdomain.com:11211,n2:host2.yourdomain.com:11211"
    #默认使用的节点,这里的n1、n2为别名。
    failoverNodes="n1"
    #发生故障时,使用的节点
    requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
    transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
    />
</Context>

以tomcat的内存为主,以memcached n2为备。若默认的memcached不可用,则使用切换节点n1作为备。

3.4.2 原理

当请求结束时Tomcat的session会送给memcached备份。即Tomcat session主session,memcached session 为备session,使用memcached相当于备份了一份seesion。

查询session时Tomcat会优先从自己内存的session,Tomcat通过jvmRoute发现不是自己的session,便从memcached中找到该session,更新本机session,请求完成后更新memcached。

3.4.3 部署

<t1>   <t2>
  . \ / .
  .  X  .
  . / \ .
<m1>   <m2>

3.5 non-sticky模式

3.5.1 原理

从msm 1.4.0之后开始支持non-sticky模式。

Tomcat session为中转session,如果n1为主session,n2为备session。产生新的session会发送给主、备memcached,并清除本地session。

n1下线,n2转正,n1再次上线,n2依然是主session存储节点。

3.5.2 配置

将配置内容放到$CATALINA_HOME/conf/context.xml中。

<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.6 non-sticky模式下使用redis配置

下载jedis.jar,放到CATALINA_HOME/lib/下。

#yum install redis

#vim /etc/redis.conf
bind 0.0.0.0

#systemctl restart redis

将配置内容放到$CATALINA_HOME/conf/context.xml中。

<Context>
  ...
  <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
    memcachedNodes="redis://redis.example.com"
    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.7 memcached-session-manager的GitHub文档页面:

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

标签: none

添加新评论