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
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
visita de actualización
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
Segunda visita
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):
- 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.
- Tomcat agrega la información de la sesión y la devuelve al cliente.
- 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
Como ves, el contenido es diferente, pero la conversación siempre existe.