• tomcat负载均衡集群


    tomcat集群内置session复制

    应用程序服务会产生session;通过多播通讯的信道传递给同一个集群中的其余tomcat节点,这样用户的状态信息在当前集群中的所有tomcat上都是存在的,从而追踪到用户的活动;
    
    缺点:当用户访问量较大时,则多播信道很快就会出现大量的多播信息,会造成拥堵,大量延迟;并且每个session数据都会存储在集群内的每个tomcat节点上,则会消耗每个节点的大量内存空间;
    
    调度器向后端发送请求时,每个请求都可以模拟为一个单独的线程发送请求,早期时候想要追踪session,要么基于cookie绑定,要么基于客户端源ip绑定;
    
    session是在服务器内存中被程序使用的,java是纯面向对象的编程语言,所以session对象数据都是放置在java程序运行的内存空间中被程序使用的;但是如果tomcat宕机,则所有session将会全部丢失,所以为了使session能够持久化保存,tomcat默认通过会话管理器组件,自动每隔一段时间将session同步到磁盘,一但tomcat宕机,会在tomcat重新启动后把session载入进来,避免session丢失;
    
    delta manager会话管理组件,是用于tomcat会话集群中的解决方案;会把集群内的tomcat节点上的新session同步到集群内的其余tomcat节点,其余节点的delta manager接收到新的session后,会把新session合并到自己所管理的会话中。delta manager是一个跨节点的会话同步工具,实现了每个tomcat节点都可以写和读;
    
    tomcat集群通过多播方式进行通讯,默认监听地址为228.0.0.4,端口为45564;由于每一个节点都要接收其他节点发送来的会话,因此每一个节点都应该监听在一个套接字上,通过一个TCP套接字接收对方传来的数据,同时本身应该有一个发送器,把自己本身的session内容基于多播信道发送给集群内其余节点;为了避免传输过程中发生错误,需要校验信息的完整性,有探测TCP传输中错误和验证整个报文完整性的各种组件;
    

    实现架构

    tomcat集群配置

    http://tomcat.apache.org/tomcat-8.5-doc/cluster-howto.html #tomcat集群配置官方文档

    集群内每个tomcat节点都需要进行配置;
    
    1、catalina.sh stop     #修改配置文件前,需要先停止tomcat进程,否则修改完后退出tomcat会报错
    
    2、vim /usr/local/tomcat/conf/server.xml     #tomcat集群配置
    <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcatA">       #每个tomcat节点都需要指定不同的jvmRoute值
            <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"  
                     channelSendOptions="8">
    
              <Manager className="org.apache.catalina.ha.session.DeltaManager"#指定使用的会话管理组件为delta manager
                       expireSessionsOnShutdown="false"                       #指定当节关闭后会话是不会超时的
                       notifyListenersOnReplication="true"/>                  #主要监听资源变动;当session变化时通知监听器
    
              <Channel className="org.apache.catalina.tribes.group.GroupChannel">           #Channel组件定义多播会话通讯信道
                <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"  #接收器;接收session
                          address="192.168.39.101"  #指定接收器地址;不指定则默认自动绑定一个本机可用地址
                          port="4000"               #接收端口
                          autoBind="100"            #自动绑定间隔时间,单位毫秒
                          selectorTimeout="5000"    #对应地址的超时时间
                          maxThreads="6"/>          #接收session的最大线程数;取决于集群规模
    
                <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">  #Sender发送器;把自己的会话发送给其余节点;PooledParallelSender轮询并发发送器,获取成员列表,把session轮询逐一发送给成员
                  <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"             #阀门;过滤出和session复制相关的报文
                     filter=""/>
              <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>    #JVM路由绑定器;判断出集群内jvm进程数量(tomcat实例),和engine上jvmRoute标识相关;jvmRoute用于识别出集群中不同的engine
              <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"/>   #侦听器;侦听集群中资源内容变化;整个集群内任何一个节点的session发生变化时,侦听器能够侦听资源变动          
            </Cluster>
            
            <Host name="localhost"  appBase="webapps"
                unpackWARs="true" autoDeploy="true">
            <Context path="myapp" docBase="/webapps/myapp" reloadable=""/>     #给默认虚拟主机做一个location别名,指定资源真实路径;此处可有可无,根据自己意愿进行配置
    ###注意:
    (1)虽然配置了tomcat集群session复制,但是前端调度器最好还是基于cookie做会话绑定;同步session是有延迟的,如果是轮询,则有可能调度的节点session还未进行同步;如果做了cookie绑定,则一个节点故障,则重新调度时,其余节点还会有session;
    (2)将cluster组建放置在engine或host组建中即可;放在engine中对所有host生效,放在一个host中,只对当前host生效;
    
    3、mkdir /webapps/myapp/WEB-INF -pv
    
    4、cp /usr/local/tomcat/conf/web.xml /webapps/myapp/WEB-INF/   #web.xml复制到当前应用的WEB-INF目录下,则只对此应用生效,如果修改默认的web.xml则对所有应用生效
    
    5、chown tomcat.tomcat /webapps -R
    
    6、vim /webapps/myapp/WEB-INF/web.xml
    <web-app
    	<distributable/>       #集群内每个tomcat节点都需要配置此项;此项配置在web-app下,不要配置在web-app下其他组件内
    	
    7、catalina.sh start
    

    nginx配置

    1、vim /etc/nginx/nginx.conf
    http {
    	
    	upstream tomcatservers {        #配置反向代理
            server 192.168.39.101:8080;
            server 192.168.39.102:8080;
        }
    	
        server {
        	...
        	location / {
               proxy_pass http://tomcatservers;   #nginx会重新构建请求报文,访问tomcat默认虚拟主机的指定应用程序
            }	
    
    2、systemctl restart nginx
    
    3、浏览器访问:http://192.168.39.100/myapp
    
  • 相关阅读:
    ssh整合
    自定义Java集合
    java图形界面写个小桌面,内置简单小软件
    java简单日历
    javaSwing
    javaScript封装
    java解析xml文件
    缺省适配器
    适配器模式
    自定义SWT控件一之自定义单选下拉框
  • 原文地址:https://www.cnblogs.com/dongzhanyi123/p/13299232.html
Copyright © 2020-2023  润新知