A veces, los servidores y las aplicaciones fallan, más pronto que tarde.

Esto es porque parte de nuestro trabajo es diseñar y planificar continuamente una arquitectura robusta y altamente fiable para nuestra aplicación para así asegurar su disponibilidad la mayor parte del tiempo.

Dependiendo de la aplicación, el software utilizado, la arquitectura y el entorno, existen retos y estrategias diferentes. De modo que dependemos de factores múltiples, pero en esta entrada me centraré en una pieza de arquitectura en concreto que utiliza servidores web con Varnish que, con un par de ajustes, nos puede ayudar a mejorar un poco la disponibilidad.

Varnish es un acelerador HTTP usado para almacenar contenido dinámico de servidores web, actuando como un proxy entre el cliente y el servidor web original. No obstante, el objetivo de este Labs no es centrarse en la funcionalidad y la configuración de Varnish; si lo necesitas, puedes encontrar buena documentación al respecto en esta web.

Una de las funcionalidades de Varnish es el soporte de Saint y Grace Mode.
Ambos nos permitirán tratar problemas con nuestros servidores web y mantener el servicio en funcionamiento, aunque caigan nuestros servidores de backend. Si bien esto es parcialmente cierto, obviamente no podemos garantizar que el servicio entero continúe funcionando solamente con Varnish… A menos que podamos mantener parte de nuestra aplicación en funcionamiento.

Imagina un sitio web o un servicio API con miles de solicitudes por segundo, como por ejemplo POST, DELETE o PUT para realizar modificaciones en la aplicación (ese tipo de solicitudes no se pueden gestionar en situaciones en las que los servidores backend dejan de funcionar). Pero en el caso de solicitudes GET, en las que el cliente quiere obtener información del servicio y Varnish tiene ese contenido concreto en su caché de memoria, se puede gestionar perfectamente ya que devuelve el contenido al cliente incluso si el backend no funciona.

Por supuesto, hay un par de cosas a tener en cuenta: esta solicitud debe estar almacenada en Varnish con anterioridad y habrá respuestas obsoletas para los clientes – ¡pero mejor eso que una respuesta con una página de error!
Como siempre, este comportamiento es útil dependiendo de los requisitos y del tipo de aplicación. Pero la mayoría de las veces nos puede ahorrar solicitudes y mantener parte del servicio en funcionamiento en caso de fallo. Así que en mi opinión, te recomiendo encarecidamente que lo uses.

Empecemos con la configuración de Varnish:

Edita el archivo de definición de VCL, que normalmente se encuentra en /etc/varnish/default.vcl y edita las siguientes directivas:

sub vcl_recv {
…

if (req.backend.healthy) {
set req.grace = 30s;
} else {
set req.grace = 6h;
}

…
}

Veamos en más detalle lo que hace esta configuración. El “vcl_recv” se llama cuando una solicitud proviene de un cliente. El objetivo de este método es decidir qué hacer con tal solicitud. En esta configuración, estamos diciendo que si los servidores backend están vivos mantendremos el contenido 30 segundos más pasado su tiempo de vida “set req.grace = 30s;”. En caso de que el backend deje de estar disponible, mantendremos el contenido durante 6 horas para que sirva a los clientes “req.grace = 6h;”.

sub vcl_fetch {
…

if (beresp.status == 500 || beresp.status == 502 ||
beresp.status == 503) {
set beresp.saintmode = 10s;

if (req.request != "POST") {
return(restart);
}
}
set beresp.grace = 6h;

…
}

Se llama a “vcl_fetch” cuando un documento se ha recuperado del backend. En caso de que el servidor del backend devuelva un código de error HTTP como 500, 502 o 503, Varnish no solicitará este backend de nuevo para este objeto durante 10 segundos “set beresp.saintmode = 10s;” “return(restart);” y reiniciará la solicitud HTTP. Esto pasará de manera automática en el siguiente servidor disponible, excepto en las solicitudes POST, para así evitar envíos de formulario duplicados, etc. El parámetro max_restarts define el número máximo de reinicios que se pueden emitir en VCL antes de que se active un error, evitando de esta manera un bucle infinito.

set beresp.grace = 6h;” mantiene todos los objetos en la caché durante 6 horas más de lo que especifique en su tiempo de vida -de esta manera, aunque los objetos HTTP estén caducados (porque ya han excedido su tiempo de vida), podemos seguir usándolos en caso de que caigan todos los servidores backend.

Referencias:
Varnish – Cache Community
Varnish – Saving a Request

Entrada original escrita por Iván Mora (SysOps Engineer @ CAPSiDE) en opentodo.net.

TAGS: Aplicaciones, cache, grace mode, how-to, http, saint mode, software, ttl, Varnish, vcl, web

speech-bubble-13-icon Created with Sketch.
Comentarios

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*
*