Introducción

Garnet es solución de almacenamiento de caché remoto proveniente de Microsoft Research. Esta diseñada para ofrecer una gran velocidad, capacidad de extensión y baja latencia. Este sistema es escalable a nivel de hilos dentro de un solo nodo y también admite la ejecución en clústeres fragmentados, con replicación, puntos de control, recuperación ante fallos y transacciones. Garnet puede funcionar tanto en memoria principal como en almacenamiento jerarquizado (como SSD y Azure Storage), y ofrece una API, además de un modelo de extensibilidad.

Garnet adopta el protocolo RESP de Redis para su comunicación, permitiendo el uso de clientes Redis standar (sin personalización) disponibles en la mayoría de los lenguajes de programación, como StackExchange.Redis en C#.

Garnet promete, en comparación con otras soluciones de almacenamiento de caché de código abierto, proporcionar un rendimiento, latencia, extensibilidad y características de durabilidad superiores.

Ten en cuenta que Garnet es un proyecto de investigación de Microsoft Research y debe considerarse como tal, aunque ya tenga la suficiente calidad.

Las ventajas clave de Garnet:

  • Un rendimiento del servidor órdenes de magnitud superior (operaciones por segundo) con pequeños lotes y muchas sesiones de cliente, en comparación con otras soluciones de caché de código abierto.
  • Latencia extremadamente baja en operaciones individuales (a menudo menos de 300 microsegundos en el percentil 99,9) en máquinas en la nube (Azure) con TCP acelerado, tanto en Windows como en Linux.
  • Mejor escalabilidad al aumentar el número de clientes, con o sin agrupación por parte del cliente.
  • La capacidad de utilizar todos los recursos de CPU/memoria de una máquina servidor con una sola instancia de servidor de memoria compartida (sin necesidad de clúster intra-nodo).
  • Soporte para conjuntos de datos más grandes que la memoria, desbordando a dispositivos de almacenamiento locales y en la nube.
  • Características de bases de datos como puntos de control y recuperación rápidos, y publicación/suscripción.
  • Soporte para particionamiento hash fragmentado en múltiples nodos (modo «clúster» de Redis), migración de estado y replicación.
  • Bien probado con un conjunto de pruebas exhaustivo (miles de pruebas unitarias en Garnet y su capa de almacenamiento Tsavorite).
  • Un código base en C# fácil de evolucionar y extender.
API

Actualmetne incluye:

  • Operaciones con cadenas de texto como GET, SET, MGET, MSET, GETSET, SETEX, DEL, EXISTS, RENAME, EXPIRE, variantes de SET (establecer si existe, establecer si no existe).
  • Operaciones numéricas como INCR, INCRBY, DECR, DECRBY.
  • Operaciones de punto de control/recuperación como SAVE, LASTSAVE, BGSAVE.
  • Operaciones básicas de administración como PING, QUIT, CONFIG, RESET, TIME.
  • Estructuras de datos avanzadas como List, Hash, Set, Sorted Set y Geo.
  • APIs de análisis como Hyperloglog y Bitmap.
  • Publicar/suscribir.
  • Transacciones.

La lista esta creciendo gracias a la demanda de los usuarios. Si ves que algo te falta, entra en el proyecto de GitHub e interactua con el equipo de desarrollo.

 

Plataforma

El servidor Garnet se basa en la tecnología .NET de alto rendimiento, desarrollada desde cero con el rendimiento en mente. Garnet ha sido probado exhaustivamente y funciona con la misma eficiencia en Linux y en Windows, en hardware Azure estándar y también en dispositivos edge.

Garnet también puede considerarse como un servidor de estructuras de datos .NET remoto que se puede extender aprovechando el ecosistema de C#, lo que nos permitirá expandir la API.

La capa de almacenamiento de Garnet se llama Tsavorite, que admite varios dispositivos de almacenamiento de respaldo como unidades SSD locales rápidas y Azure Storage, optimizados tanto para Windows como para Linux.

Garnet soporta TLS para conexiones seguras.

Benchmark

Aquí es donde las mediciones reales confirman lo previamente mencionado en la introducción. Por ejemplo:

Get

En Throughput Get, podeis ver una comparativa entre: Garnet, Redis 7.2, KeyDB 6.3.4 y Dragonfly 6.2.11, los pesos pesados en la industria de la cache.

Si analizamos las gráficas, observamos que el rendimiento de GET es superior en todos los tamaños de datos solicitados. Aunque su ventaja es ligeramente menor en términos de latencia, aún así, es inferior a la de los demás en la mayoría de las pruebas. La combinación de ambas métricas, rendimiento y latencia, hace que Garnet sea incomparable con sus competidores, demostrando de manera concluyente que es superior sin lugar a dudas.

Estructuras de datos complejas

Esta prueba es la evidencia definitiva de que Garnet va por buen camino y va a ser muy difícil para sus competidores alcanzar los niveles que está ofreciendo este nuevo sistema de caché.

Mi conclusión

El objetivo de este artículo era introduciros esta nueva tecnología de caché y expresar mi gratitud a mi amigo Javier por poner en el punto de mira Garnet.

Me espera un volumen considerable de trabajo con proyectos como ASPIRE, REDIOUS y GARNET. Aún no tengo claro cómo voy a gestionar mi tiempo, pero estoy decidido a realizar mis propias pruebas de rendimiento. Tengo la costumbre de no aceptar afirmaciones hasta verificarlas personalmente. Además, este procedimiento me proporcionará la oportunidad de aprender a manejar y configurar estos sistemas, lo que representa un beneficio adicional para mi desarrollo profesional.