No olvide aumentar la posibilidad de una respuesta al cliente utilizando una solicitud repetida en el equilibrio L7

Al usar nginx para equilibrar el tr谩fico HTTP en el nivel L7, es posible enviar una solicitud de cliente al siguiente servidor de aplicaciones si el destino no devuelve una respuesta positiva. Una prueba del mecanismo de verificaci贸n pasiva del estado de salud del servidor de aplicaciones mostr贸 la ambig眉edad de la documentaci贸n y la especificidad de los algoritmos para excluir al servidor del grupo de servidores de producci贸n.

Resumen del equilibrio del tr谩fico HTTP


Hay varias formas de equilibrar el tr谩fico HTTP. Seg煤n los niveles del modelo OSI, existen tecnolog铆as de equilibrio en los niveles de red, transporte y aplicaci贸n. Se pueden usar combinaciones dependiendo del tama帽o de la aplicaci贸n.

La tecnolog铆a de equilibrio de tr谩fico produce efectos positivos en la aplicaci贸n y su mantenimiento. Estas son algunas de ellas. Escalado horizontal de la aplicaci贸n, en el que la carga se distribuye entre varios nodos . Desmantelamiento planificado del servidor de aplicaciones eliminando el flujo de solicitudes del cliente. Implementaci贸n de la estrategia de prueba A / B para la funcionalidad modificada de la aplicaci贸n. Mejora de la tolerancia a fallas de la aplicaci贸n enviando solicitudes a servidores de aplicaciones que funcionan bien .

La 煤ltima funci贸n se implementa en dos modos. En modo pasivo, el equilibrador en el tr谩fico del cliente eval煤a las respuestas del servidor de aplicaciones de destino y, bajo ciertas condiciones, lo excluye del grupo de servidores de producci贸n. En modo activo, el equilibrador env铆a peri贸dicamente solicitudes de forma independiente al servidor de aplicaciones en el URI especificado, y para ciertos signos de respuesta decide excluirlo del grupo de servidores de producci贸n. Posteriormente, el equilibrador, bajo ciertas condiciones, devuelve el servidor de aplicaciones al grupo de servidores de producci贸n.

Verificaci贸n pasiva del servidor de aplicaciones y su exclusi贸n del grupo de servidores de producci贸n.


Echemos un vistazo m谩s de cerca a la verificaci贸n pasiva del servidor de aplicaciones en la edici贸n gratuita de nginx / 1.17.0. Los servidores de aplicaciones son seleccionados a su vez por el algoritmo Round Robin, sus pesos son los mismos.

El diagrama de tres pasos muestra una secci贸n de tiempo que comienza con el env铆o de una solicitud de cliente al servidor de aplicaciones No. 2. Un indicador brillante caracteriza las solicitudes / respuestas entre el cliente y el equilibrador. Indicador oscuro: solicitudes / respuestas entre nginx y servidores de aplicaciones.



El tercer paso del diagrama muestra c贸mo el equilibrador redirige la solicitud del cliente al siguiente servidor de aplicaciones, en caso de que el servidor de destino haya dado una respuesta de error o no haya respondido en absoluto.

La lista de errores HTTP y TCP en los que el servidor usa el siguiente servidor se especifica en la directiva proxy_next_upstream .

Por defecto, nginx redirige solo las solicitudes con m茅todos HTTP idempotentes al siguiente servidor de aplicaciones.

驴Qu茅 obtiene el cliente? Por un lado, la capacidad de redirigir una solicitud al siguiente servidor de aplicaciones aumenta las posibilidades de proporcionar una respuesta satisfactoria al cliente cuando falla el servidor de destino. Por otro lado, es obvio que una llamada secuencial primero al servidor de destino y luego al siguiente aumenta el tiempo de respuesta total al cliente.

Al final, la respuesta del servidor de aplicaciones se devuelve al cliente , donde termina el contador de intentos permitidos proxy_next_upstream_tries .

Al usar la funci贸n de redireccionamiento al siguiente servidor de trabajo, debe armonizar adicionalmente los tiempos de espera en el equilibrador y los servidores de aplicaciones. El l铆mite superior del tiempo para una solicitud de "viaje" entre los servidores de aplicaciones y el equilibrador es el tiempo de espera del cliente o el tiempo de espera especificado por la empresa. Al calcular los tiempos de espera, tambi茅n es necesario tener en cuenta el margen para eventos de red (retrasos / p茅rdidas durante la entrega de paquetes). Si el cliente finaliza cada vez la sesi贸n por tiempo de espera mientras el equilibrador obtiene una respuesta garantizada, la buena intenci贸n de hacer que la aplicaci贸n sea confiable ser谩 in煤til.



La verificaci贸n pasiva del estado de los servidores de aplicaciones est谩 controlada por directivas, por ejemplo, con las siguientes opciones para sus valores:

upstream backend { server app01:80 weight=1 max_fails=5 fail_timeout=100s; server app02:80 weight=1 max_fails=5 fail_timeout=100s; } server { location / { proxy_pass http://backend; proxy_next_upstream timeout http_500; proxy_next_upstream_tries 1; ... } ... } 

A partir del 2 de julio de 2019 , la documentaci贸n estableci贸 que el par谩metro max_fails establece el n煤mero de intentos fallidos de trabajar con el servidor que deber铆an ocurrir dentro del tiempo especificado por el par谩metro fail_timeout .

El par谩metro fail_timeout establece el tiempo durante el cual el n煤mero especificado de intentos fallidos de trabajar con el servidor debe ocurrir para que el servidor se considere no disponible; y el tiempo durante el cual el servidor se considerar谩 no disponible.

En el ejemplo dado, parte del archivo de configuraci贸n, el equilibrador est谩 configurado para capturar 5 llamadas fallidas en 100 segundos.

Devolver el servidor de aplicaciones al grupo de servidores de producci贸n


Como se deduce de la documentaci贸n, el equilibrador despu茅s de fail_timeout no puede considerar que el servidor no est茅 operativo. Pero, desafortunadamente, la documentaci贸n no establece expl铆citamente c贸mo se eval煤a el rendimiento del servidor.

Sin un experimento, uno solo puede suponer que el mecanismo para verificar el estado es similar al descrito anteriormente.

Expectativas y realidad


En la configuraci贸n presentada, se espera el siguiente comportamiento del equilibrador:

  1. Hasta que el equilibrador excluya el servidor de aplicaciones n. 掳 2 del grupo de servidores de producci贸n, se le enviar谩n solicitudes de clientes.
  2. Las solicitudes devueltas con un error 500 del servidor de aplicaciones n. 掳 2 se enviar谩n al siguiente servidor de aplicaciones y el cliente recibir谩 respuestas positivas.
  3. Tan pronto como el equilibrador reciba 5 respuestas con el c贸digo 500 en 100 segundos, excluir谩 el servidor de aplicaciones No. 2 del grupo de servidores de producci贸n. Todas las solicitudes despu茅s de una ventana de 100 segundos se enviar谩n inmediatamente a los servidores de aplicaciones de trabajo restantes sin tiempo adicional.
  4. Despu茅s de 100 segundos, de alguna manera, el equilibrador debe evaluar el rendimiento del servidor de aplicaciones y devolverlo al grupo de servidores de producci贸n.

Despu茅s de realizar pruebas en especie, seg煤n las revistas del equilibrador, se estableci贸 que la declaraci贸n No. 3 no funciona. El equilibrador excluye un servidor inactivo tan pronto como se cumpla la condici贸n en el par谩metro max_fails . Por lo tanto, un servidor fallido se excluye del servicio sin esperar el lapso de 100 segundos. El par谩metro fail_timeout juega el papel de solo el l铆mite superior del tiempo de acumulaci贸n de errores.

Como parte de la afirmaci贸n No. 4, resulta que nginx verifica la funcionalidad de una aplicaci贸n que anteriormente estaba excluida del mantenimiento del servidor con solo una solicitud. Y si el servidor a煤n responde con un error, la siguiente comprobaci贸n fallar谩 despu茅s de fail_timeout .

Lo que falta


  1. Es posible que el algoritmo implementado en nginx / 1.17.0 no sea la forma m谩s justa de verificar el rendimiento del servidor antes de devolverlo al grupo de servidores en funcionamiento. Al menos, de acuerdo con la documentaci贸n actual, no se espera 1 solicitud, sino la cantidad especificada en max_fails .
  2. El algoritmo de verificaci贸n de estado no tiene en cuenta la velocidad de las solicitudes. Cuanto m谩s grande es, m谩s fuerte se desplaza el espectro con intentos fallidos hacia la izquierda, y el servidor de aplicaciones abandona el grupo de servidores de trabajo demasiado r谩pido. Supongo que esto puede afectar negativamente a las aplicaciones que se permiten producir errores "co谩gulos cortos de tiempo". Por ejemplo, al recoger basura.



Quer铆a preguntarle si hay alg煤n beneficio pr谩ctico del algoritmo de comprobaci贸n del estado del servidor, que mide la velocidad de los intentos fallidos.

Source: https://habr.com/ru/post/458594/


All Articles