La cuestión
Estoy usando haproxy para cargar servidores web de equilibrio. Utilizo la persistencia de sesión con cookies adicionales ya que algunas aplicaciones usan archivos de sesión y estos no están sincronizados entre servidores.
Quiero deshabilitar un servidor para mantenimiento, pero sin interrumpir las sesiones. Por lo tanto, me gustaría permitir que los clientes existentes continúen su sesión de aplicación, pero no aceptar nuevos clientes.
comportamiento haproxy
- Configuré un servidor para "ir a mantenimiento"
- si un cliente tiene el conjunto de cookies, use el servidor incluso si está marcado como "en mantenimiento"
- Si llega un nuevo cliente (sin cookie), se dirige a otro servidor
- después de que todos los clientes finalicen sus sesiones de aplicación, ningún cliente tendrá la cookie configurada para este servidor en particular, y sería bueno cerrarla sin la interrupción del usuario.
¿Crees que esto se puede lograr con alguna configuración de haproxy? ¿O hay una manera inteligente de hacerlo?
Otras maneras
Lista no exhaustiva de otras formas de lograr esta necesidad:
- sincronizar archivos de sesión entre servidores (necesita una forma de sincronizar archivos entre varios servidores o un punto de montaje único común)
- usar la base de datos para almacenar información de sesión (necesita cambiar el comportamiento de la aplicación)
Más detalles
Yo uso este tipo de configuración:
frontend https-in
bind xxx.xxx.xxx.xxx:443 ssl crt /etc/haproxy/ssl/_default.pem crt /etc/haproxy/ssl
reqadd X-Forwarded-Proto:\ https
acl APP1 hdr(host) -i APP1.atac.local
use_backend APP1 if APP1
default_backend _default
backend APP1
redirect scheme https if !{ ssl_fc }
mode http
balance roundrobin
cookie HAPROXY_SESSION insert indirect
option httpchk HEAD /haproxy_test_page.php HTTP/1.0\nUser-Agent:\ HAProxy
server SRV1 SRV1_IP:PORT cookie SRV1 check
server SRV2 SRV2_IP:PORT cookie SRV2 check
Si solo deshabilito SRV1 (con el comando haproxy cli), creo que todas las sesiones de aplicación abiertas en SRV1 se interrumpirán después del final de la "sesión" HTTP actual. ¿Está bien?
fuente
Respuestas:
Ponga el servidor en modo de drenaje utilizando la interfaz de administración web. Eso proporciona la funcionalidad exacta que estás buscando.
fuente
stick-table
con vencimiento para proporcionar persistencia.Si usa socat para comunicarse con sus configuraciones de haproxy, puede poner un servidor en estado de drenaje de la siguiente manera:
echo "set server backend/serv state drain" | sudo socat stdio /etc/haproxy/haproxysock
Más comandos aquí ! Para instalar socat en Ubuntu ve a esta respuesta
Lo pruebo con la versión 1.6.3 de haproxy :)
fuente
Si sus servidores de back-end usan PHP para las aplicaciones, puede usar Memcache para sincronizar las sesiones entre ellos.
También Couchbase-Server puede hacer la replicación de memcache de forma inmediata.
Por supuesto, es un poco excesivo usar el servidor de base de datos solo para la replicación de sesiones :)
fuente