Caché Nginx compartido entre múltiples servidores

9

Tenemos 8 servidores API REST-ish con Nginx que usan FastCGI con PHP-FPM para manejar solicitudes. Actualmente estamos utilizando el almacenamiento en caché FastCGI de Nginx (como directivas fastcgi_cache_path). Esto significa que las respuestas de la API se almacenan en caché, pero hay una caché separada para cada servidor.

¿Hay una buena manera de compartir el almacenamiento en caché entre los ocho servidores?

Hemos considerado usar Redis como almacenamiento compartido, pero los módulos disponibles parecen requerir cambios en la aplicación. En algunos casos, es posible que deseemos almacenar en caché las respuestas fuera de nuestro control (sobre HTTP a API externas). Idealmente, un reemplazo directo para el almacenamiento en caché integrado de Nginx de FastCGI y respuestas HTTP estaría disponible.

Puntilla
fuente
¿Por qué no realiza el almacenamiento en caché no en la capa de interfaz (Nginx), sino en la capa de fondo (aplicación PHP)?
Max Kochubey
@hangover No veo ninguna razón para reinventar la rueda. El caché Nginx funciona bien y rápido. Si podemos evitar la sobrecarga de ejecutar solicitudes a través de la aplicación, podemos mantener las cosas agradables y rápidas. Nginx responde a solicitudes en caché para nosotros en menos de 5 milisegundos. El lanzamiento de nuestra aplicación PHP, incluso para que proporcione una respuesta en caché, probablemente sea 10 veces más lento que eso. El almacenamiento en caché de Nginx funciona bien para nosotros ahora, solo necesitamos distribuir ese caché entre muchos servidores.
Brad
1
ok, entonces puede intentar usar el módulo Nginx SRCache de terceros para almacenar contenido en caché en Memcached od Redis dedicado.
Max Kochubey
1
@Brad Esto es hacky, así que no lo pondré como respuesta: actualmente tenemos un script de ejecución nocturna que usa rsync entre los directorios de caché nginx en nuestros servidores para mantener cada uno actualizado con los últimos archivos de caché de todos los demás. El script finaliza con un reinicio elegante de nginx y una comprobación de éxito Como dije, es hacky, pero funciona para nosotros en un sistema de alto rendimiento.
mVChr
@mVChr Interesante. ¿Has intentado ejecutar rsync o similar continuamente? Al final para mi uso, eventualmente conseguí que Redis funcionara, pero esto no permite un caché muy grande ya que toda la colección de Redis debe estar en la memoria. 16 GB se llena rápidamente en mi aplicación.
Brad

Respuestas:

1

Parece que hay una publicación de blog bastante nueva en https://www.nginx.com/blog/shared-caches-nginx-plus-cache-clusters-part-1/ sobre este tema. Este primer ejemplo podría ser útil si ejecuta más de dos servidores de caché nginx.

Especialmente la segunda parte de la publicación suena interesante para mi caso de uso actual, donde quiero volver a rastrear automáticamente los elementos modificados en mis cachés.

También debería funcionar con la versión de código abierto de NGINX. Básicamente funciona mediante la representación proxy de la solicitud en cascada a través de cada servidor NGINX (Nginx-Cache1-> NGinx-Cache2-> Origin-Server) cada servidor almacena en caché desde el flujo ascendente relevante y, si lo desea, también es posible crear un clúster HA. https://www.nginx.com/blog/shared-caches-nginx-plus-cache-clusters-part-2/

Macbert
fuente