Nginx+Tomcat负载均衡——Tomcat集群 Session复制

Tomcat集群搭建

  • Tomcat集群搭建
    • 一成果
    • 二参考地址
    • 三搭建场景
    • 四遇到的坑
      • 坑1tomcat版本导致的配置不同
      • 坑2阿里云VPC下的linux ECS默认不支持组播


一、成果

  1. windows很顺利的实现成功
  2. 阿里云linux服务器有组播问题
  3. 配置好的Server.xml如下:
<Server port="8005" shutdown="SHUTDOWN">
  <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
  
  
  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
  
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />

  
  <GlobalNamingResources>
    
    <Resource name="UserDatabase" auth="Container"
              type="org.apache.catalina.UserDatabase"
              description="User database that can be updated and saved"
              factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
              pathname="conf/tomcat-users.xml" />
  GlobalNamingResources>

  
  <Service name="Catalina">

    
    


    
    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    
    
    
    

    
    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />


    

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

      
      
      <Realm className="org.apache.catalina.realm.LockOutRealm">
        
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
               resourceName="UserDatabase"/>
      Realm>

      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">

        
        

        
    <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.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.ClusterSessionListener"/>
    Cluster>        

        
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log" suffix=".txt"
               pattern="%h %l %u %t "%r" %s %b" />

      Host>
    Engine>
  Service>
Server>

具体需要了解每一个节点的含义,可以去官网 看看。

二、参考地址

Tomcat集群—Cluster节点配置 :配置的含义可以参考他的,挺详细的。
Tomcat集群配置学习篇—–分布式应用:过程可以参考他的。
多个tomcat之间的session复制

三、搭建场景

项目原本是单点部署的系统,由于考虑到后期压力的问题,需要把架构改成Nginx+tomcat负载均衡,但是项目存在Session无法保持的问题。

Nginx配置的是权重,不是IP_HASH,因为我们的数据来源很多都是同一个IP,用IPHASH就无法负载了。

四、遇到的坑

坑1:tomcat版本导致的配置不同

tomcat7->8在配置上有一些变化,“JvmRouteSessionIDBinderListener”监听器不需要添加,大部分网上的教程都没有提到这一点,所以在找教程的时候需要参考官网。引用官方原话如下:

Clustering

The addition of the HttpServletRequest.changeSessionId() method in Servlet 3.1 made the org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener unnecessary so it has been removed. It must be removed from cluster configurations when upgrading to Tomcat 8.

坑2:阿里云VPC下的linux ECS默认不支持组播

这个坑踩的比较痛,windows上测试成功后,放到阿里云就是不行。

VPC目前不支持二层组播功能,您可以通过阿里云提供的组播代理工具对组播应用进行代理。组播工具按操作系统分为Linux和Windows组播工具,配置详情参考Linux内核态组播工具使用说明和Windows组播代理工具使用说明。
单击这里获取工具源码,您可以直接使用已经打包好的代理工具,也可以根据需要重新打包代理工具。
组播代理分为服务端和客户端。服务端安装在需要发出组播数据包的一端ECS上(该ECS一般是组播源),对组播报文进行代理,如果只是多台服务器之间的报文组播通信,安装服务端就能满足需求,不需要客户端。
如果是在专有网络内的服务器之间的报文组播通信,如下图所示ECS1向ECS2、ECS3、ECS4进行数据组播,只需在ECS1上安装组播代理服务即可。

阿里云的组播教程有需要的可以去看看,目前由于服务器的内核版本的问题,阿里云上目前问题阻塞,准备通过调整部分架构来实现功能。
官方回复是:

目前组播工具开源了,需要您手动编译了
查看您服务器是Centos 7.3的系统,内核版本较高。
您尝试给服务器,更换为Centos6.x的系统,使用2.6.x 版本内核的系统,进行安装试下。
高版本的内核不保证都支持使用,建议是使用2.6.x 版本的内核。

·

参考资料:
1. 多个tomcat之间的session复制
2. Tomcat集群—Cluster节点配置

你可能感兴趣的:(架构设计)