Las aplicaciones y los sistemas informáticos distribuidos fiables se han convertido en la piedra angular de las empresas destacadas, especialmente en la automatización y gestión de procesos empresariales de misión crítica y la prestación de servicios a los clientes. Como desarrolladores y administradores de sistemas de estos sistemas y aplicaciones, se espera que proporcione todo tipo de soluciones de tecnología de la información (TI) que garantizarán que tenga los sistemas más eficientes disponibles.
Esto incluye tareas como diseñar, probar e implementar estrategias para el rendimiento, confiabilidad, disponibilidad y escalabilidad del sistema / aplicación, para brindar a los usuarios finales un nivel de servicio satisfactorio. El almacenamiento en caché es una de las muchas técnicas de entrega de aplicaciones básicas pero efectivas en las que puede confiar. Antes de continuar, veamos brevemente qué es el almacenamiento en caché, dónde y / o cómo se puede aplicar, y sus beneficios.
¿Qué es el almacenamiento en caché o el almacenamiento en caché de contenido?
El almacenamiento en caché (o almacenamiento en caché de contenido ) es una técnica ampliamente utilizada para almacenar copias de datos en una ubicación de almacenamiento temporal (también conocida como caché ) para que se pueda acceder a los datos fácil y rápidamente, que cuando se recuperan del almacenamiento original. Los datos almacenados en una caché pueden incluir archivos o fragmentos de archivos (como archivos HTML, scripts, imágenes, documentos, etc.), operaciones o registros de bases de datos, llamadas a API, registros DNS, etc., según el tipo y propósito del almacenamiento en caché.
Un caché puede tener la forma de hardware o software. La caché basada en software (que es el tema central de este artículo) se puede implementar en diferentes capas de una pila de aplicaciones.
El almacenamiento en caché se puede aplicar en el lado del cliente (o en la capa de presentación de la aplicación), por ejemplo, el almacenamiento en caché del navegador o el almacenamiento en caché de la aplicación (o en modo fuera de línea). La mayoría, si no todos los navegadores modernos, se envían con una implementación de una caché HTTP. Es posible que haya oído hablar de la frase popular ” borre su caché ” al acceder a una aplicación web para que pueda ver los datos o el contenido más recientes en un sitio web o aplicación, en lugar de que el navegador utilice una copia antigua del contenido almacenado localmente.
Otro ejemplo de almacenamiento en caché del lado del cliente es el almacenamiento en caché de DNS, que ocurre a nivel del sistema operativo (SO). Es un almacenamiento temporal de información sobre búsquedas anteriores de DNS realizadas por el sistema operativo o el navegador web.
El almacenamiento en caché también se puede implementar a nivel de red, ya sea en una LAN o WAN a través de proxies. Un ejemplo común de este tipo de almacenamiento en caché son las CDN ( redes de entrega de contenido ), que son una red distribuida globalmente de servidores proxy web.
En tercer lugar, también puede implementar el almacenamiento en caché en el (los) servidor (es) de origen o backend. Existen diferentes formas de almacenamiento en caché a nivel de servidor, que incluyen:
- Almacenamiento en caché del servidor web (para el almacenamiento en caché de imágenes, documentos, scripts, etc.).
- almacenamiento en caché o memorización de <strong>aplicaciones</strong> (se utiliza para leer archivos del disco, datos de otros servicios o procesos o solicitar datos de una API, etc.).
- almacenamiento en caché de la base de datos (para proporcionar acceso en memoria a datos de uso frecuente, como filas de base de datos solicitadas, resultados de consultas y otras operaciones).
Tenga en cuenta que los datos de la caché se pueden almacenar en cualquier sistema de almacenamiento, incluida una base de datos, un archivo, la memoria del sistema, etc., pero debe ser un medio más rápido que la fuente principal. En este sentido, el almacenamiento en caché en memoria es la forma de almacenamiento en caché más eficaz y más utilizada.
¿Por qué utilizar el almacenamiento en caché?
El almacenamiento en caché ofrece numerosos beneficios, incluidos los siguientes:
- A nivel de la base de datos, mejora el rendimiento de lectura a microsegundos para los datos almacenados en caché. También puede utilizar la caché de escritura diferida para mejorar el rendimiento de la escritura, donde los datos se escriben en la memoria y luego se escriben en el disco o en el almacenamiento principal a intervalos específicos. Pero el aspecto de la integridad de los datos puede tener implicaciones potencialmente desastrosas. Por ejemplo, cuando el sistema falla justo antes de que los datos se envíen al almacenamiento principal.
- En el nivel de la aplicación, una memoria caché puede almacenar datos leídos con frecuencia dentro del proceso de la aplicación, lo que reduce los tiempos de búsqueda de datos de segundos a microsegundos, especialmente en la red.
- Teniendo en cuenta el rendimiento general de la aplicación y el servidor, el almacenamiento en caché ayuda a reducir la carga del servidor, la latencia y el ancho de banda de la red a medida que los datos almacenados en caché se entregan a los clientes, mejorando así el tiempo de respuesta y las velocidades de entrega a los clientes.
- El almacenamiento en caché también permite la disponibilidad de contenido, especialmente a través de CDN, y muchos otros beneficios.
En este artículo, revisaremos algunas de las principales herramientas de código abierto ( almacenamiento en caché de <strong>aplicaciones / bases de datos</strong> y <strong>servidores proxy de almacenamiento en caché</strong> ) para implementar el almacenamiento en caché del lado del servidor en Linux.
1. Redis
Redis ( REmote DIctionary Server en su totalidad) es un sistema informático distribuido en memoria flexible, rápido, de alto rendimiento y gratuito que se puede utilizar desde la mayoría, si no todos, los lenguajes de programación.
Es un almacén de estructura de datos en memoria que funciona como motor de almacenamiento en caché, base de datos en disco persistente en memoria y agente de mensajes. Aunque está desarrollado y probado en Linux (la plataforma recomendada para la implementación) y OS X, Redis también funciona en otros sistemas POSIX como * BSD, sin dependencias externas.
Redis admite numerosas estructuras de datos como cadenas, hashes, listas, conjuntos, conjuntos ordenados, mapas de bits, flujos y más. Esto permite a los programadores utilizar una estructura de datos específica para resolver un problema específico. Admite operaciones automáticas en su estructura de datos, como agregar a una cadena, empujar elementos a una lista, incrementar el valor de un hash, calcular la intersección del conjunto y más.
Sus características clave incluyen la replicación maestro-esclavo de Redis (que es asíncrona de manera predeterminada), alta disponibilidad y conmutación por error automática que se ofrece con Redis Sentinel, el clúster de Redis (puede escalar horizontalmente agregando más nodos de clúster) y la partición de datos (distribuyendo datos entre múltiples instancias de Redis). ). También cuenta con soporte para transacciones, secuencias de comandos Lua, una variedad de opciones de persistencia y cifrado de la comunicación cliente-servidor.
Al ser una base de datos en memoria pero persistente en disco, Redis ofrece el mejor rendimiento cuando funciona mejor con un conjunto de datos en memoria. Sin embargo, puede usarlo con una base de datos en disco como MySQL, PostgreSQL y muchas más. Por ejemplo, puede tomar datos pequeños con mucha escritura en Redis y dejar otros fragmentos de datos en una base de datos en el disco.
Redis admite la seguridad de muchas formas: una mediante el uso de una función de ” modo protegido ” para proteger las instancias de Redis y evitar que se acceda a ellas desde redes externas. También admite la autenticación cliente-servidor (donde se configura una contraseña en el servidor y se proporciona en el cliente) y TLS en todos los canales de comunicación, como conexiones de cliente, enlaces de replicación y el protocolo de bus de Redis Cluster, y más.
Redis tiene muchos casos de uso que incluyen almacenamiento en caché de base de datos, almacenamiento en caché de página completa, administración de datos de sesión de usuario, almacenamiento de respuestas de API, sistema de mensajería de publicación / suscripción, cola de mensajes y más. Estos se pueden aplicar en juegos, aplicaciones de redes sociales, fuentes RSS, análisis de datos en tiempo real, recomendaciones de usuarios, etc.
2. Memcached
Memcached es un sistema de almacenamiento en caché de objetos de memoria distribuida, simple pero potente, gratuito y de código abierto. Es un almacén de clave-valor en memoria para pequeños fragmentos de datos, como resultados de llamadas a bases de datos, llamadas a API o representación de páginas. Se ejecuta en sistemas operativos similares a Unix, incluidos Linux y OS X, y también en Microsoft Windows.
Al ser una herramienta de desarrollo, está diseñada para aumentar la velocidad de las aplicaciones web dinámicas al almacenar en caché el contenido (de forma predeterminada, una caché de uso menos reciente ( LRU )), lo que reduce la carga de la base de datos en el disco actúa como una memoria a corto plazo para aplicaciones. Ofrece una API para los lenguajes de programación más populares.
Memcached admite cadenas como único tipo de datos. Tiene una arquitectura cliente-servidor, donde la mitad de la lógica ocurre en el lado del cliente y la otra mitad en el lado del servidor. Es importante destacar que los clientes entienden cómo elegir en qué servidor escribir o leer para un artículo. Además, un cliente sabe muy bien qué hacer en caso de que no pueda conectarse a un servidor.
Aunque es un sistema de almacenamiento en caché distribuido, por lo que admite la agrupación en clústeres, los servidores Memcached están desconectados entre sí (es decir, no se conocen entre sí). Esto significa que no hay soporte de replicación como en Redis. También entienden cómo almacenar y buscar artículos, administrar cuándo desalojar o reutilizar la memoria. Puede aumentar la memoria disponible agregando más servidores.
Admite autenticación y cifrado a través de TLS a partir de Memcached 1.5.13, pero esta función aún se encuentra en la fase experimental.
3. Apache Ignite
Apache Ignite , también un sistema de almacenamiento de clave-valor distribuido en memoria, caché y sistema de base de datos de múltiples modelos, gratuito y de código abierto, escalable horizontalmente, que proporciona potentes API de procesamiento para la computación en datos distribuidos. También es una cuadrícula de datos en memoria que se puede usar en memoria o con persistencia nativa de Ignite. Se ejecuta en sistemas similares a UNIX como Linux y también Windows .
Cuenta con almacenamiento de varios niveles, compatibilidad completa con SQL y transacciones ACID (atomicidad, consistencia, aislamiento, durabilidad) (admitidas solo a nivel de API de valor clave) en varios nodos de clúster, procesamiento de ubicación conjunta y aprendizaje automático. Admite la integración automática con cualquier base de datos de terceros, incluido cualquier RDBMS (como MySQL, PostgreSQL, Oracle Database, etc.) o tiendas NoSQL.
Es importante tener en cuenta que, aunque Ignite funciona como un almacén de datos SQL, no es completamente una base de datos SQL. Maneja claramente las restricciones y los índices en comparación con las bases de datos tradicionales admite índices primarios y secundarios, pero solo se utilizan los índices primarios para imponer la unicidad. Además, no tiene soporte para restricciones de clave externa.
Ignite también es compatible con la seguridad al permitirle habilitar la autenticación en el servidor y proporcionar credenciales de usuario en los clientes. También es compatible con la comunicación de socket SSL para proporcionar una conexión segura entre todos los nodos Ignite.
Ignite tiene muchos casos de uso que incluyen sistema de almacenamiento en caché, aceleración de la carga de trabajo del sistema, procesamiento de datos en tiempo real y análisis. También se puede utilizar como una plataforma centrada en gráficos.
4. Couchbase Server
Couchbase Server es también una base de datos de participación orientada a documentos NoSQL, distribuida y de código abierto que almacena datos como elementos en un formato de valor clave. Funciona en Linux y otros sistemas operativos como Windows y Mac OS X. Utiliza un lenguaje de consulta orientado a documentos y rico en funciones llamado N1QL que proporciona poderosos servicios de consulta e indexación para soportar operaciones de menos de milisegundos en datos.
Sus características notables son un almacén rápido de valor clave con caché administrada, indexadores especialmente diseñados, un potente motor de consultas, arquitectura de escalamiento horizontal (escalamiento multidimensional), integración de big data y SQL, seguridad de pila completa y alta disponibilidad. .
Couchbase Server viene con soporte nativo de clústeres de múltiples instancias, donde una herramienta de administración de clústeres coordina todas las actividades de los nodos y proporciona simplemente una interfaz de todo el clúster para los clientes. Es importante destacar que puede agregar, eliminar o reemplazar nodos según sea necesario, sin tiempo de inactividad. También admite la replicación de datos en los nodos de un clúster, la replicación de datos selectiva en los centros de datos.
Implementa seguridad a través de TLS usando puertos de servidor Couchbase dedicados, diferentes mecanismos de autenticación (usando credenciales o certificados), control de acceso basado en roles (para verificar a cada usuario autenticado para los roles definidos por el sistema que se le asignan), auditoría, registros y sesiones .
Sus casos de uso incluyen interfaz de programación unificada, búsqueda de texto completo, procesamiento de consultas en paralelo, administración de documentos e indexación y mucho más. Está diseñado específicamente para brindar administración de datos de baja latencia para aplicaciones web, móviles e IoT interactivas a gran escala.
5. Hazelcast IMDG
Hazelcast IMDG (cuadrícula de datos en memoria) es un middleware de cuadrícula de datos en memoria de código abierto, liviano, rápido y ampliable, que proporciona computación en memoria distribuida elásticamente escalable. Hazelcast IMDG también se ejecuta en Linux, Windows y Mac OS X y cualquier otra plataforma con Java instalado. Admite una amplia variedad de estructuras de datos flexibles y nativas del idioma, como Map, Set, List, MultiMap, RingBuffer e HyperLogLog.
Hazelcast es peer-to-peer y admite escalabilidad simple, configuración de clústeres (con opciones para recopilar estadísticas, monitorear a través del protocolo JMX y administrar el clúster con utilidades útiles), estructuras y eventos de datos distribuidos, porciones de datos y transacciones. También es redundante, ya que mantiene la copia de seguridad de cada entrada de datos en varios miembros. Para escalar su clúster, simplemente inicie otra instancia, los datos y las copias de seguridad se equilibran de manera automática y uniforme.
Proporciona una colección de API útiles para acceder a las CPU de su clúster para obtener la máxima velocidad de procesamiento. También ofrece implementaciones distribuidas de una gran cantidad de interfaces fáciles de desarrollar de Java, como Map, Queue, ExecutorService, Lock y JCache.
Sus características de seguridad incluyen miembros del clúster y verificación de control de acceso y autenticación del cliente en las operaciones del cliente a través de las características de seguridad basadas en JAAS. También permite interceptar conexiones de socket y operaciones remotas ejecutadas por los clientes, cifrar la comunicación a nivel de socket entre los miembros del clúster y habilitar la comunicación de socket SSL / TLS. Pero según la documentación oficial, la mayoría de estas funciones de seguridad se ofrecen en la versión Enterprise.
Su caso de uso más popular es el almacenamiento de datos y almacenamiento en memoria caché distribuidos. Pero también se puede implementar para la agrupación de sesiones web, reemplazo de NoSQL, procesamiento paralelo, mensajería sencilla y mucho más.
6. Mcrouter
Mcrouter es un enrutador de protocolo Memcached gratuito y de código abierto para escalar implementaciones de Memcached, desarrollado y mantenido por Facebook . Cuenta con protocolo Memcached ASCII, enrutamiento flexible, compatibilidad con múltiples clústeres, cachés de múltiples niveles, agrupación de conexiones, múltiples esquemas de hash, enrutamiento de prefijo, grupos replicados, remedo de tráfico de producción, reconfiguración en línea y monitoreo de estado de destino / conmutación por error automática.
Además, admite el calentamiento de caché en frío, estadísticas enriquecidas y comandos de depuración, calidad de servicio de flujo de eliminación confiable, valores grandes, operaciones de transmisión y viene con compatibilidad con IPv6 y SSL.
Se está utilizando en Facebook e Instagram como un componente central de la infraestructura de caché, para manejar casi 5 mil millones de solicitudes por segundo en el pico.
7. Caché de barniz
Varnish Cache es un acelerador de aplicaciones web de código abierto flexible, moderno y multipropósito que se encuentra entre los clientes web y un servidor de origen. Se ejecuta en todas las plataformas modernas de Linux, FreeBSD y Solaris (solo x86). Es un excelente motor de almacenamiento en caché y acelerador de contenido que puede implementar frente a un servidor web como NGINX, Apache y muchos otros, para escuchar en el puerto HTTP predeterminado para recibir y reenviar solicitudes de clientes al servidor web y entregar la web. respuesta de los servidores al cliente.
Mientras actúa como intermediario entre los clientes y los servidores de origen, Varnish Cache ofrece varios beneficios, siendo el elemento fundamental el almacenamiento en caché del contenido web en la memoria para aliviar la carga de su servidor web y mejorar las velocidades de entrega a los clientes.
Después de recibir una solicitud HTTP de un cliente, la reenvía al servidor web backend. Una vez que el servidor web responde, Varnish almacena el contenido en la memoria caché y entrega la respuesta al cliente. Cuando el cliente solicita el mismo contenido, Varnish lo servirá desde la respuesta de la aplicación de refuerzo de caché. Si no puede entregar contenido desde la caché, la solicitud se reenvía al backend y la respuesta se almacena en caché y se entrega al cliente.
Varnish presenta VCL ( Varnish Configuration Language , un <strong>lenguaje</strong> flexible específico de dominio) que se utiliza para configurar cómo se manejan las solicitudes y más, Varnish Modules ( VMODS ), que son extensiones de Varnish Cache.
En cuanto a seguridad, Varnish Cache admite el registro, la inspección de solicitudes y la limitación, la autenticación y la autorización a través de VMODS , pero carece de soporte nativo para SSL / TLS. Puede habilitar HTTPS para Varnish Cache utilizando un proxy SSL / TLS como Hitch o NGINX.
También puede usar Varnish Cache como firewall de aplicaciones web, defensor de ataques DDoS, protector de enlaces directos, equilibrador de carga, punto de integración, puerta de enlace de inicio de sesión único, mecanismo de política de autenticación y autorización, solución rápida para backends inestables y enrutador de solicitud HTTP.
8. Proxy de almacenamiento en caché de Squid
Otra solución de almacenamiento en caché y proxy gratuito y de código abierto, excelente y ampliamente utilizada para Linux es Squid . Es un software de servidor de caché proxy web rico en funciones que proporciona servicios de caché y proxy para protocolos de red populares, incluidos HTTP, HTTPS y FTP. También se ejecuta en otras plataformas UNIX y Windows.
Al igual que Varnish Cache , recibe solicitudes de clientes y las pasa a servidores backend específicos. Cuando el servidor backend responde, almacena una copia del contenido en un caché y se lo pasa al cliente. Las solicitudes futuras para el mismo contenido se atenderán desde la caché, lo que dará como resultado una entrega de contenido más rápida al cliente. Por lo tanto, optimiza el flujo de datos entre el cliente y el servidor para mejorar el rendimiento y almacena en caché el contenido de uso frecuente para reducir el tráfico de red y ahorrar ancho de banda.
Squid viene con características tales como distribuir la carga entre jerarquías intercomunicadas de servidores proxy, producir datos sobre patrones de uso de la web (por ejemplo, estadísticas sobre los sitios más visitados), le permite analizar, capturar, bloquear, reemplazar o modificar los mensajes que se están enviando.
También admite funciones de seguridad como control de acceso enriquecido, autorización y autenticación, compatibilidad con SSL / TLS y registro de actividades.
9. NGINX
NGINX (pronunciado como Engine-X ) es una solución consolidada de código abierto, alto rendimiento, con todas las funciones y muy popular para configurar la infraestructura web. Es un servidor HTTP, un servidor proxy inverso, un servidor proxy de correo y un servidor proxy TCP / UDP genérico.
NGINX ofrece capacidades básicas de almacenamiento en caché donde el contenido almacenado en caché se almacena en una caché persistente en el disco. La parte fascinante del almacenamiento en caché de contenido en NGINX es que se puede configurar para entregar contenido obsoleto desde su caché cuando no puede obtener contenido nuevo de los servidores de origen.
NGINX ofrece una multitud de funciones de seguridad para proteger sus sistemas web, que incluyen terminación SSL, restricción de acceso con autenticación básica HTTP, autenticación basada en el resultado de la sub-solicitud, autenticación JWT, restricción de acceso a recursos HTTP proxiados, restricción de acceso por ubicación geográfica, y mucho más.
Por lo general, se implementa como proxy inverso, equilibrador de carga, terminador SSL / puerta de enlace de seguridad, acelerador de aplicaciones / caché de contenido y puerta de enlace API en una pila de aplicaciones. También se utiliza para la transmisión de medios.
10. Servidor de tráfico Apache
Por último, pero no menos importante, tenemos Apache Traffic Server , un servidor proxy de almacenamiento en caché de código abierto, rápido, escalable y extensible con soporte para HTTP / 1.1 y HTTP / 2.0. Está diseñado para mejorar la eficiencia y el rendimiento de la red almacenando en caché el contenido al que se accede con frecuencia en el borde de una red, para empresas, ISP (proveedores de servidores de Internet), proveedores de red troncal y más.
Es compatible con el proxy inverso y reenvío del tráfico HTTP / HTTPS. También puede configurarse para ejecutarse en uno o ambos modos simultáneamente. Cuenta con almacenamiento en caché persistente, API de complementos soporte para ICP (Protocolo de caché de Internet), ESI (Edge Side Incluye) Keep-ALive y más.
En términos de seguridad, Traffic Server admite el control del acceso de los clientes permitiéndole configurar clientes que pueden usar la caché del proxy, terminación SSL para ambas conexiones entre los clientes y él mismo, y entre él mismo y el servidor de origen. También admite autenticación y autorización básica a través de un complemento, registro (de cada solicitud que recibe y cada error que detecta) y monitoreo.
Traffic Server se puede utilizar como caché de proxy web, proxy de reenvío, proxy inverso, proxy transparente, equilibrador de carga o en una jerarquía de caché.
Observaciones finales
El almacenamiento en caché es una de las tecnologías de entrega de contenido web más beneficiosas y establecidas desde hace mucho tiempo, que está diseñada principalmente para aumentar la velocidad de los sitios web o aplicaciones. Ayuda a reducir la carga del servidor, la latencia y el ancho de banda de la red porque los datos almacenados en caché se entregan a los clientes, lo que mejora el tiempo de respuesta de las aplicaciones y las velocidades de entrega a los clientes.
En este artículo, revisamos las principales herramientas de almacenamiento en caché de código abierto para usar en sistemas Linux. Si conoce otras herramientas de almacenamiento en caché de código abierto que no figuran aquí, compártalas con nosotros a través del formulario de comentarios a continuación. También puede compartir sus pensamientos sobre este artículo con nosotros.
Código abierto , herramientas principales