Cuando nos embarcamos en la reconstrucción del motor que da vida a nuestro servicio gestionado de Apache Kafka, sabíamos que debíamos abordar varios requisitos únicos que caracterizan a las plataformas exitosas nativas en la nube.
Estos sistemas deben ser multi-tenant desde su base, escalar fácilmente para servir a miles de clientes y ser gestionados principalmente por software basado en datos en lugar de operadores humanos.
Además, deben ofrecer aislamiento y seguridad robusta entre clientes con cargas de trabajo impredecibles, todo esto mientras se permite la rápida innovación por parte de los ingenieros.
Este rediseño de Kafka, denominado Kora, ha sido concebido para ser una plataforma de transmisión de eventos que opera en más de 70 regiones en AWS, Google Cloud y Azure y se ejecuta en decenas de miles de clusters.
Si bien es posible que no estés operando a esta escala desde el principio, muchas de las técnicas que aplicamos serán útiles para otros proyectos similares.
Cinco Innovaciones Clave en el Rediseño de Kora
A continuación, presentamos cinco innovaciones clave que implementamos en el diseño de Kora para mejorar la performance, disponibilidad y eficiencia en costos del motor en el corazón de nuestro servicio gestionado de Apache Kafka.
1. Uso de ‘Celdas’ Lógicas para Escalabilidad y Aislamiento
Para crear sistemas altamente disponibles y escalables de manera horizontal, necesitábamos una arquitectura basada en bloques modulares que puedan crecer linealmente con el aumento en el tamaño del sistema.
La arquitectura original de Kafka no cumplía con este criterio, ya que muchos aspectos de la carga aumentan de manera no lineal con el tamaño del sistema.
Por ejemplo, a medida que aumenta el tamaño del clúster, también lo hacen de manera cuadrática el número de conexiones y el sobrecosto de replicación, lo que genera un aumento desproporcionado del overhead en relación con el poder de cómputo/almacenamiento adicional que se introduce.
Para resolver este desafío, creamos una celda lógica que divide el clúster en una serie de celdas que atraviesan las zonas de disponibilidad.
Los tenants (clientes) se aíslan dentro de una celda, de manera que las réplicas de las particiones que pertenecen a ese tenant se asignan a los brokers dentro de esa celda, lo que reduce el overhead al no requerir replicación fuera de la celda.
Los resultados de nuestras pruebas experimentales mostraron una reducción del 20% en la carga cuando implementamos celdas, comparado con el sistema anterior.
2. Balanceo de Tipos de Almacenamiento para Optimizar Datos Fríos y Cálidos
Una de las principales ventajas de la nube es la diversidad de tipos de almacenamiento disponibles, cada uno con diferentes características de costos y rendimiento.
Aprovechamos esta variedad para optimizar nuestra arquitectura, ofreciendo un balance costo-rendimiento que maximiza la eficiencia.
En lugar de utilizar almacenamiento de bloques costoso para datos fríos, usamos servicios de almacenamiento de objetos como Amazon S3 y Google GCS que tienen costos bajos y son altamente escalables, pero con una latencia mayor.
Para los datos cálidos, que se acceden con frecuencia, utilizamos almacenamiento de bloques, lo que mejora tanto el rendimiento como la durabilidad.
Este enfoque multicapa nos permitió mejorar la elasticidad, ya que solo los datos cálidos deben ser reasignados cuando hay cambios en las particiones, lo que reduce los costos y mejora la eficiencia operativa.
3. Uso de Abstracciones para Unificar la Experiencia Multinube ️
Operar en múltiples nubes presenta desafíos significativos, ya que cada proveedor de nube tiene variaciones sutiles pero impactantes en la configuración y rendimiento de sus servicios.
Para superar esto, implementamos tres abstracciones clave que unifican la experiencia del usuario y simplifican la administración en entornos multinube.
- Clúster Lógico de Kafka: Unidad principal para el control de acceso y seguridad.
- Unidades de Kafka de Confluent (CKU): Unidades de capacidad que definen métricas visibles para el cliente como el rendimiento de ingreso y egreso.
- Carga del Clúster: Una métrica unificada para ayudar a los clientes a decidir cuándo escalar su clúster.
Estas abstracciones simplifican la experiencia del cliente al abstraer las diferencias de implementación y mejorar la optimización del rendimiento y los costos bajo el capó.
4. Automatización de los Ciclos de Mitigación para Combatir la Degradación ️
Las fallas en la infraestructura son inevitables, incluso en la nube, ya sea debido a problemas de proveedores, errores de software o fallos en el hardware.
Para abordar esto, implementamos un sistema de bucles de retroalimentación automatizados que detectan y mitigan las fallas rápidamente.
Estos bucles se encargan de detectar degradaciones en componentes específicos, como discos locales, conectividad externa y degradación de brokers.
El sistema puede reaccionar de forma automática y remediar miles de fallas parciales cada mes sin necesidad de intervención manual, lo que optimiza el tiempo operativo y minimiza el impacto en los clientes.
5. Balanceo de Servicios con Estado para Rendimiento y Eficiencia ⚖️
El balanceo de carga en servicios con estado es un desafío directo para el rendimiento del servicio. En Kafka, el balanceo de particiones entre brokers debe hacerse cuidadosamente para evitar sobrecargar servidores individuales, lo que puede afectar negativamente el rendimiento.
Implementamos un servicio de balanceo que realiza un seguimiento de las métricas de múltiples brokers y ajusta las particiones en consecuencia.
Al hacerlo, logramos un aumento de hasta el 25% en la eficiencia de la carga para algunos clientes, reduciendo la latencia y mejorando la distribución general de recursos.
Beneficios de una Plataforma Nativa en la Nube Bien Diseñada
Las innovaciones implementadas en Kora demuestran cómo una arquitectura nativa en la nube bien diseñada puede mejorar significativamente la elasticidad, disponibilidad y eficiencia en costos.
Después de comparar el rendimiento de Kora con Kafka de código abierto en hardware idéntico, descubrimos que Kora ofrece una escalabilidad 30 veces más rápida, una disponibilidad más de 10 veces superior y una latencia significativamente más baja.
Conclusión
Si estás construyendo infraestructura en la nube o usando tecnologías como Kafka, esperamos que las lecciones aprendidas con Kora te ayuden a alcanzar tus objetivos de rendimiento, disponibilidad y eficiencia.
Con una arquitectura nativa en la nube bien diseñada, las posibilidades de éxito en los proyectos de infraestructura moderna son infinitas. ¡Esperamos que tus esfuerzos también sigan este camino hacia el éxito!