haproxy: ¿cómo preparar el mantenimiento de un servidor sin iniciar sesiones de aplicaciones?

13

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?

Christophe Drevet-Droguet
fuente
¿Su servidor se ejecuta en modo HTTP o modo TCP?
austinian
1
@austinian; Probable modo http, ya que está hablando de equilibrio y persistencia en función de las cookies (el modo TCP no ofrece tales funciones).
GregL
@Christophe, ¿ha intentado realmente la configuración descrita en su sección 'comportamiento de haproxy', porque debería funcionar?
GregL
@GregL, cierto, eso es lo que estoy pensando también. Si está usando el modo HTTP y simplemente configura el servidor en modo de mantenimiento, dejará de aceptar nuevas sesiones pero mantendrá las sesiones válidas activas hasta que caduquen. Todavía puede tener cookies, etc. en modo TCP, pero no significará nada para HAProxy.
austinian
@Christophe, ¿estás tratando de usar "una forma más inteligente" para acortar el tiempo de mantenimiento, o simplemente estás buscando una manera de finalizar las sesiones con gracia mientras esperas para hacer el mantenimiento?
austinian

Respuestas:

6

Ponga el servidor en modo de drenaje utilizando la interfaz de administración web. Eso proporciona la funcionalidad exacta que estás buscando.

austinian
fuente
3
Si lo establece en Mant, que va a dejar de enviar cualquier tráfico a la misma, tal como se describe aquí . Por el contrario, querría ponerlo en modo de drenaje y usar un stick-tablecon vencimiento para proporcionar persistencia.
GregL
@GregL, oops, arreglando ahora
austinian
Gracias por su respuesta, austinian y @GredL. Lo intentaré La parte difícil será con la mesa de palo, creo. Tendré que encontrar una manera de almacenar cada cliente con la cookie configurada en el servidor de modo de drenaje en esta tabla fija.
Christophe Drevet-Droguet
Bueno, parece que el modo de drenaje es suficiente en mi caso, las sesiones que ya tienen el conjunto de cookies todavía usa el servidor drenado, y las nuevas sesiones se dirigen a otros servidores.
Christophe Drevet-Droguet
1
¿Cómo se cambian los modos en la interfaz web? Parece ser solo informativo.
kagronick
9

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 :)

Jhonatan Alarcon
fuente
1

Otras maneras

sincronizar archivos de sesión entre servidores (necesita una forma de sincronizar archivos entre varios servidores o un punto de montaje único común)

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 :)

Cha0s
fuente
Si bien sería una mejor manera, creo que necesita cambios de código, creo. Así que usaré austinian y GregL para responder a nuestras aplicaciones actuales que no sincronizan sesiones.
Christophe Drevet-Droguet
Si su código no establece un controlador de sesión personalizado, entonces no necesita cambiar ningún código para que PHP use memcache para las sesiones. Todo está configurado en php.ini, no en código.
Cha0s
OK, Cha0s, lo miraré.
Christophe Drevet-Droguet