balanceo de carga y sesión de tomcat

equilibrio de carga de tomcat

nginx

1) Cree dos contenedores tomcat en Docker

[root@ydong ~]# docker run --name tomcat -d --hostname ydong.com -v /data/ydong:/usr/local/ydong tomcat:9.0.37-jdk8-openjdk-slim-buster 

[root@ydong ~]# docker run --name tomcat2 -d --hostname ydong.com -v /data/ydong2:/usr/local/ydong tomcat:9.0.37-jdk8-openjdk-slim-buster

2) Preparar páginas web para dos contenedores

[root@ydong data]# ls ydong/ROOT/
class  index.jsp  lib  WEB-INF、

[root@ydong data]# ls ydong2/ROOT/
class  index.jsp  lib  WEB-INF


# 两个是同样的目录,但是index.jsp不一样

3) Copie los archivos en el volumen de almacenamiento directamente al directorio de aplicaciones web

[root@ydong data]# docker exec -it tomcat /bin/bash
root@ydong:/usr/local/tomcat# cp -r ../ydong/ROOT webapps

[root@ydong data]# docker exec -it tomcat2 /bin/bash
root@ydong:/usr/local/tomcat# cp -r ../ydong/ROOT webapps

4) Pruebe la interfaz de acceso
Inserte la descripción de la imagen aquí

Inserte la descripción de la imagen aquí

5) Use nginx para revertir la generación, nginx y docker están en el mismo host

upstream tcservs {
    
    
         server 172.17.0.2:8080;
         server 172.17.0.3:8080;
      }

location / {
    
    
             proxy_pass http://tcservs;
          }

#添加上以上规则,由于是测试,所以没设置权重和关闭了长连接以及它的proxy_cache相关选项

Primera visita
Inserte la descripción de la imagen aquí
visita de actualización

Inserte la descripción de la imagen aquí

httpd

httpd usa sus módulos proxy en su lugar.
Ejemplo:

vim /etc/httpd/conf.d/tomcat.conf
<proxy balancer://tcsrvs>
                    BalancerMember http://172.17.0.2:8080 loadfactor=1   
                    # loadfactor 权重
                    BalancerMember http://172.17.0.3:8080 loadfactor=1
                    ProxySet lbmethod=byrequests
                    #lbmethod:访问方式,byrequests 加权轮询
               </Proxy>

               <VirtualHost *:80>
                    ServerName www.ydong.com
                    ProxyVia On
                    ProxyRequests Off
                    ProxyPreserveHost On
  		            keepalive off
                    <Proxy *>
                         Require all granted
                    </Proxy>
                    ProxyPass / balancer://tcsrvs/
                    ProxyPassReverse / balancer://tcsrvs/
                    <Location />
                         Require all granted
                    </Location>
               </VirtualHost>    

Retención de sesiones

Pegajosidad de la sesión

nginx

Hay varias formas de pegar la sesión de nginx

  • ip_hash
  • clave hash

Nginx se modifica directamente en nginx.conf

Ejemplo simple:

 upstream tcservs{
    
    
        ip_hash;
        server 172.17.0.2:8080;
        server 172.17.0.3:8080;
    }


        location / {
    
    
          proxy_pass http://tcservs;
        }

Según el hash de la dirección de origen, siempre que se acceda a la dirección de origen, se envían al mismo servidor back-end.

Ejemplo de hash consistente:

 upstream tcservs{
    
    
        hash $request_uri consistent;
        server 172.17.0.2:8080;
        server 172.17.0.3:8080;
    }

 location / {
    
    
          proxy_pass http://tcservs;
        } 

El URI de la solicitud de enlace se envía al mismo servidor en el backend siempre que se acceda al mismo uri.

httpd

Si httpd implementa la sesión permanente, se necesitan cookies

Ejemplo:

Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED

<proxy balancer://tcsrvs>
                    BalancerMember http://172.17.0.2:8080  route=TomcatA  loadfactor=1
                    BalancerMember http://172.17.0.3:8080  route=TomcatB  loadfactor=1
                    ProxySet lbmethod=byrequests
		    ProxySet stickysession=ROUTEID	               
</Proxy>

               <VirtualHost *:80>
                    ServerName www.ydong.com
                    ProxyVia On
                    ProxyRequests Off
                    ProxyPreserveHost On
		    keepalive off
                    <Proxy *>
                         Require all granted
                    </Proxy>
                    ProxyPass / balancer://tcsrvs/
                    ProxyPassReverse / balancer://tcsrvs/
                    <Location />
                         Require all granted
                    </Location>
               </VirtualHost>    

Primera visita
Inserte la descripción de la imagen aquí
Segunda visita
Inserte la descripción de la imagen aquí

Al mantener la sesión, el archivo tomcat server.xml necesita agregar una opción JVMRoute. La función de esta opción es principalmente

El principio de jvm_route (del autor Weibin Yao):

  1. Al principio, si llega la solicitud, sin información de sesión, jvm_route se enviará a un tomcat de acuerdo con el método de round robin.
  2. Tomcat agrega la información de la sesión y la devuelve al cliente.
  3. Cuando el usuario vuelve a realizar esta solicitud, jvm_route ve el nombre del servidor back-end en la sesión y reenvía la solicitud al servidor correspondiente.

Por el momento, el módulo jvm_route no admite el modo justo predeterminado. El modo de trabajo de jvm_route entra en conflicto con fair. Para un usuario específico, cuando el gato que le ha estado sirviendo deja de funcionar, de forma predeterminada volverá a intentar el número de max_fails. Si aún falla, volverá a habilitar el
método round robin. En este caso, la sesión del usuario es perdió.

En general, jvm_route usa session_cookie para lograr la adherencia de la sesión, adjuntando una sesión específica a un gato específico, resolviendo así el problema de la sincronización asíncrona de la sesión, pero no puede resolver el problema de la transferencia de la sesión después del tiempo de inactividad.
Publicado desde: http://blog.163.com/momoliu88@126/blog/static/139208463201231104120587/

En httpd se puede ver que el encabezado del mensaje de solicitud tiene TomcatB. Cuando el servidor back-end ve TomcatB, el clúster en Tomcat responderá de acuerdo con la JVMRoute correspondiente.

clúster de replicación de sesión de tomcat

Tomcat tiene la función de replicación de sesiones, en el clúster de tomcat, la sesión de cada nodo se sincronizará con el servidor de cada nodo del clúster. Esta función es implementada por DeltaManager (administrador de sesión incremental de clúster) en tomcat.

Ejemplo Lo
siguiente debe escribirse en el motor o en el host en server.xml. Motor significa todos los hosts, host significa host designado.

<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="192.168.192.131"   #此处是绑定地址,最高绑定在服务的ip地址上
                      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>

Una vez completado lo anterior, debe agregar <distributable/>elementos en web.xml . Y web.xml se copia en WEB-INF.

No hay diferencia entre la anti-generación anterior y la anterior, nginx y httpd, HAproxy puede ser.

prueba
Inserte la descripción de la imagen aquí

Inserte la descripción de la imagen aquí

Como ves, el contenido es diferente, pero la conversación siempre existe.

Supongo que te gusta

Origin blog.csdn.net/qq_44564366/article/details/107946536
Recomendado
Clasificación