Cachés compartidas con clústeres de caché de NGINX Plus, parte 1

NGINX | 24 de enero de 2017

Nota del editor: Esta es la primera parte de una serie sobre almacenamiento en caché de alta capacidad y alta disponibilidad:

Esta entrada se ha actualizado para hacer referencia a la API de NGINX Plus, que sustituye y deja obsoleto el módulo independiente de estado ampliado que se trataba originalmente aquí.

¿Cómo se puede crear un clúster de caché de gran capacidad y alta disponibilidad con NGINX o NGINX Plus? Esta es la primera entrega de una serie de dos partes en la que se presentan enfoques alternativos para alcanzar este objetivo. Puede acceder a la segunda parte mediante el enlace anterior. (Salvo que se indique lo contrario, los enfoques se aplican por igual a NGINX Open Source y NGINX Plus, pero, para abreviar, nos referiremos únicamente a NGINX Plus).

Descripción general del almacenamiento en caché de NGINX Plus

NGINX Plus puede funcionar como servidor de caché proxy, situado entre el servidor de origen y los clientes remotos. NGINX Plus gestiona el tráfico dirigido al servidor de origen y almacena en caché recursos comunes que no cambian. Esto permite que NGINX Plus responda directamente a los clientes cuando solicitan estos recursos, reduciendo así la carga del servidor de origen. La caché proxy de NGINX Plus suele implementarse en un centro de datos próximo al servidor de origen, aunque también puede desplegarse de forma similar a una CDN en puntos de presencia (PoP) distribuidos por todo el mundo.

El almacenamiento en caché de contenido es un tema sorprendentemente complejo. Conviene familiarizarse con algunas técnicas básicas de almacenamiento en caché antes de continuar con este artículo:

¿Por qué NGINX Plus no utiliza un disco compartido para el almacenamiento en caché?

Cada servidor NGINX Plus funciona como un servidor de caché web independiente. No existe ningún medio técnico para compartir una caché basada en disco entre varios servidores NGINX Plus; se trata de una decisión de diseño deliberada.

Almacenar una caché en un sistema de archivos compartido de alta latencia y potencialmente poco fiable no es una buena decisión de diseño. NGINX Plus es sensible a la latencia del disco y, aunque la funcionalidad de grupos de subprocesos descarga del subproceso principal las operaciones read() y write(), si el sistema de archivos es lento y la E/S de la caché es elevada, NGINX Plus puede verse desbordado por un gran volumen de subprocesos. Mantener una caché compartida y coherente entre las instancias de NGINX Plus también requeriría bloqueos en todo el clúster para sincronizar operaciones de caché simultáneas, como el llenado, la lectura y la eliminación. Por último, los sistemas de archivos compartidos introducen una fuente de falta de fiabilidad y rendimiento impredecible en la caché, donde la fiabilidad y un rendimiento constante son primordiales.

¿Por qué compartir una caché entre varios servidores NGINX Plus?

Aunque compartir un sistema de archivos no es un buen enfoque para el almacenamiento en caché, sigue habiendo buenas razones para almacenar contenido en caché en varios servidores NGINX Plus, cada una con su técnica correspondiente:

  • Si su objetivo principal es crear una caché de muy alta capacidad, fragmente (particione) la caché entre varios servidores. En este artículo explicaremos esta técnica.
  • Si su objetivo principal es lograr una alta disponibilidad y, al mismo tiempo, minimizar la carga de los servidores de origen, utilice una caché compartida de alta disponibilidad. Para obtener más información sobre esta técnica, consulte el artículo complementario (próximamente).

Distribuir la caché web entre varios servidores maximiza su capacidad, mientras que compartir una caché web de alta disponibilidad minimiza la carga de los servidores de origen

Fragmentación de la caché

La fragmentación de una caché es el proceso de distribuir las entradas de caché entre varios servidores de caché web. La fragmentación de caché de NGINX Plus utiliza un algoritmo de hash coherente para seleccionar un único servidor de caché para cada entrada. Las figuras muestran qué sucede con una caché fragmentada entre tres servidores (figura de la izquierda) cuando uno de ellos deja de funcionar (figura central) o se añade otro servidor (figura de la derecha).

Con el almacenamiento en caché coherente habilitado para una caché fragmentada entre tres servidores de caché web, los datos almacenados en el servidor que deja de funcionar se distribuyen entre los servidores restantes, y un servidor recién añadido asume parte de los datos de cada servidor existente

La capacidad total de la caché es la suma de la capacidad de caché de cada servidor. Se minimizan las solicitudes al servidor de origen porque solo un servidor intenta almacenar en caché cada recurso (no hay varias copias independientes del mismo recurso).

La fragmentación de la caché entre los servidores de caché web crea una configuración tolerante a fallos en la que cada recurso se almacena en caché en un único servidor

Este patrón es tolerante a fallos en el sentido de que, si tiene N servidores de caché y uno falla, solo pierde 1/N de la caché. Esta «parte perdida» se distribuye uniformemente mediante el hash consistente entre los N –1 servidores restantes. En cambio, los métodos de hash más sencillos redistribuyen toda la caché entre los servidores restantes, por lo que se pierde casi toda la caché durante la redistribución.

Cuando utilice el equilibrio de carga mediante hash coherente, use la clave de caché (o un subconjunto de los campos utilizados para crearla) como clave del hash coherente:

upstream cache_servers {    hash $scheme$proxy_host$request_uri consistent;

    server red.cache.example.com;
    server green.cache.example.com;
    server blue.cache.example.com;
}

Puede distribuir el tráfico entrante entre los servidores de la capa de balanceadores de carga (LB) mediante la solución de alta disponibilidad activo-pasivo de NGINX Plus, DNS de turno rotatorio o una solución de alta disponibilidad como keepalived.

Optimización de la configuración de la caché fragmentada

Puede elegir una de las dos optimizaciones disponibles para la configuración de particionamiento de la caché.

Combinación de los niveles de balanceo de carga y caché

Puede combinar los niveles de balanceo de carga y caché. En esta configuración, se ejecutan dos servidores virtuales en cada instancia de NGINX Plus. El servidor virtual de balanceo de carga («LB VS» en la figura) acepta solicitudes de clientes externos y utiliza un hash coherente para distribuirlas entre todas las instancias de NGINX Plus del clúster, que están conectadas mediante una red interna. El servidor virtual de caché («Cache VS») de cada instancia de NGINX Plus escucha en su dirección IP interna las solicitudes que le corresponden, las reenvía al servidor de origen y almacena en caché las respuestas. Esto permite que todas las instancias de NGINX Plus actúen como servidores de caché, lo que maximiza la capacidad de la caché.

Ejecutar tanto un servidor virtual de equilibrio de carga como un servidor virtual de caché en cada instancia de NGINX Plus maximiza la capacidad de la caché web

Configuración de una caché «caliente» de primer nivel

Como alternativa, puede configurar una caché de primer nivel en la capa de balanceo de carga del frontend para el contenido con una demanda muy alta y utilizar la caché compartida de gran tamaño como caché de segundo nivel. Esto puede mejorar el rendimiento y reducir el impacto en el servidor de origen si falla una capa de caché de segundo nivel, ya que el contenido solo tendrá que actualizarse a medida que caduque gradualmente el contenido de la caché de primer nivel.

Configurar una caché de primer nivel en la capa de balanceo de carga reduce el impacto en el servidor de origen si falla el servidor de caché web de segundo nivel

Si el clúster de caché gestiona un volumen muy elevado de contenido muy solicitado, es posible que la tasa de renovación de la caché de primer nivel, de menor tamaño, sea muy alta. En otras palabras, la demanda del espacio limitado de la caché es tan elevada que el contenido se expulsa de ella (para dejar espacio al contenido solicitado más recientemente) antes de que pueda utilizarse para atender siquiera una solicitud posterior.

Un indicador de esta situación es una proporción baja entre el contenido servido y el contenido escrito, dos métricas incluidas en las estadísticas ampliadas que proporciona el módulo de API de NGINX Plus. Aparecen en los campos Servido y Escrito de la pestaña Cachés del panel de supervisión de la actividad en tiempo real integrado. (Tenga en cuenta que el módulo de API de NGINX Plus y el panel de supervisión de la actividad en tiempo real no están disponibles en NGINX Open Source.)

Esta captura de pantalla muestra una situación en la que NGINX Plus escribe más contenido en la caché del que sirve desde ella:

La pestaña Cachés del panel de supervisión de la actividad en tiempo real de NGINX Plus muestra la situación no deseada en la que se escriben más datos en la caché de los que se leen

En este caso, puede ajustar la caché para almacenar únicamente el contenido solicitado con mayor frecuencia. La directiva «proxy_cache_min_uses» puede ayudarle a identificar este contenido.

Resumen

Distribuir una caché entre varios servidores de caché web NGINX o NGINX Plus es una forma eficaz de crear una caché escalable y de muy alta capacidad. El hash coherente proporciona un buen nivel de alta disponibilidad, ya que garantiza que, si una caché falla, solo se invalide la parte del contenido almacenado en caché que le corresponde.

La segunda parte de esta publicación describe un patrón alternativo de caché compartida que replica la caché en un par de servidores de caché NGINX o NGINX Plus. La capacidad total está limitada a la capacidad de un servidor individual, pero la configuración es totalmente tolerante a fallos y no se pierde ningún contenido almacenado en caché si uno de los servidores de caché deja de estar disponible.

Pruebe la fragmentación de la caché en sus propios servidores: inicie hoy mismo su prueba gratuita de 30 días o póngase en contacto con nosotros para hablar sobre sus casos de uso.


Compartir

Sobre el autor

Owen Garrett
Owen GarrettDirector sénior de Gestión de Producto

Más artículos de Owen Garrett

Artículos relacionados del blog

Únete a F5 NGINX en AppWorld 2024
NGINX | 04/01/2024

Únete a F5 NGINX en AppWorld 2024

Descubre las numerosas razones para asistir al evento insignia de F5, que incluirá un emocionante anuncio sobre la cartera de productos NGINX.

Rotación de certificados SSL/TLS sin reinicios en NGINX Open Source
NGINX | 26/09/2023

Rotación de certificados SSL/TLS sin reinicios en NGINX Open Source

La función de diccionario compartido permite configurar NGINX sin necesidad de reiniciarlo al renovar los certificados SSL/TLS.

Exposición de APIs en Kubernetes
NGINX | 10/03/2022

Exposición de APIs en Kubernetes

La unidad 2 de Microservices March 2022 se centra en cómo exponer tus API en Kubernetes. Aquí tienes enlaces a los recursos que necesitas: la retransmisión en directo del 14 de marzo, artículos de blog y otros recursos de preparación, y el laboratorio práctico «Protege las API de Kubernetes mediante la limitación de solicitudes».

NGINX Sprint 2.0: visión clara, código renovado y nuevos compromisos con el código abierto
NGINX | 23/08/2021

NGINX Sprint 2.0: visión clara, código renovado y nuevos compromisos con el código abierto

Hoy, en NGINX Sprint 2.0, anunciamos cómo respaldaremos nuestra visión del futuro de las aplicaciones modernas con una mayor presencia en la comunidad de código abierto, incluida la participación en el proyecto comunitario Kubernetes, nuevos proyectos de software de código abierto y la arquitectura de referencia para aplicaciones modernas.

Presentamos NGINX Plus R22
NGINX | 09/06/2020

Presentamos NGINX Plus R22

NGINX Plus R22 incorpora nuevas funcionalidades, como la compatibilidad con OCSP para verificar la revocación de certificados en TLS mutuo, el uso de varios proveedores de identidad OIDC en una configuración, el seguimiento en tiempo real de la limitación de solicitudes y conexiones en el panel de NGINX Plus y mejoras en NGINX JavaScript.

Presentamos NGINX Plus R17
NGINX | 11/12/2018

Presentamos NGINX Plus R17

NGINX Plus R17 incorpora compatibilidad con la limitación de velocidad en dos fases y con TLS 1.3, la versión más reciente del protocolo Transport Layer Security. La configuración de OpenID Connect es más sencilla y NGINX ModSecurity WAF es el doble de rápido que antes. También se ha actualizado el módulo JavaScript de NGINX.