Introducción
- En 2017, Discord compartió cómo migró su base de datos de MongoDB a Cassandra para almacenar mensajes
- Cassandra ofrece escalabilidad, tolerancia a fallos y facilidad de mantenimiento, pero con el tiempo aumentaron los problemas de rendimiento y la carga de mantenimiento
- En 2022, Discord volvió a migrar su base de datos, esta vez a ScyllaDB
Problemas con Cassandra
- Estructura de almacenamiento de mensajes: los mensajes se almacenaban particionados por
channel_id y bucket
- Problema de particiones calientes: cuando el tráfico se concentraba en ciertos canales, aumentaba la latencia de toda la base de datos
- Problemas de mantenimiento: el rendimiento se degradaba por las tareas de compactación de SSTable y los problemas de recolección de basura de la JVM
Cambios de arquitectura
- Adopción de ScyllaDB: una base de datos compatible con Cassandra escrita en C++ que resolvió los problemas de recolección de basura
- Servicio de datos: se colocó un servicio intermedio entre la API y la base de datos para regular el tráfico y mejorar el rendimiento
- Uso de Rust: se utilizó Rust para escribir código concurrente seguro y rápido
Servicio de datos
- Fusión de solicitudes: cuando varios usuarios pedían los mismos datos, se hacía una sola consulta a la base de datos y el resultado se compartía
- Enrutamiento basado en hashing consistente: las solicitudes del mismo canal se dirigían a la misma instancia del servicio para reducir la carga sobre la base de datos
Migración a gran escala
- Construcción del clúster de ScyllaDB: se configuró un almacenamiento rápido y duradero usando SSD locales y RAID
- Migración de datos: los datos se trasladaron rápidamente usando un migrador de datos escrito en Rust
- Validación automática de datos: se enviaron pequeñas cantidades de solicitudes de lectura a ambas bases de datos y se compararon los resultados para verificar la integridad de los datos
Unos meses después
- Mejora de rendimiento: ofrecía mejor rendimiento que Cassandra con menos nodos
- Reducción de latencia: el rendimiento de consulta e inserción de mensajes mejoró considerablemente
- Nuevos casos de uso de producto: gracias a la mejora de rendimiento, fue posible implementar nuevas funciones
# Resumen de GN⁺
- Discord migró su base de datos a ScyllaDB para resolver los problemas de rendimiento de Cassandra
- Con un servicio de datos escrito en Rust y ScyllaDB, logró gestionar el tráfico de forma eficiente y mejorar el rendimiento
- Durante la migración de datos, utilizó métodos rápidos y eficientes para completar el traslado sin tiempo de inactividad
- Este artículo aborda los desafíos y las soluciones de una migración de base de datos a gran escala, por lo que resulta útil para quienes se interesan en la operación de sistemas a gran escala
1 comentarios
Comentarios en Hacker News
La entrada del blog critica al GC, pero en realidad el problema está en cómo usaban Cassandra o en cómo Cassandra maneja las eliminaciones masivas
Si hubieran usado un protocolo de chat distribuido, este problema no habría existido
Comentario adicional del cofundador de ScyllaDB
tombstone_gc=repairLa capa de servicio recuerda a Varnish Cache
Eliminar mensajes antiguos es casi imposible
Es un artículo muy bien escrito
La cantidad de nodos de almacenamiento de mensajes de Discord es menor de lo esperado
Almacenar datos y hacer data mining son problemas distintos
El equipo de ScyllaDB priorizó las mejoras de rendimiento e implementó consultas inversas
Discusión sobre "How Discord Stores Trillions of Messages"