Construyendo un servicio web de alta disponibilidad sin base de datos
Exploración
- En el caso de una startup nueva, normalmente se eligen frameworks web como Rails, Django o Node, y bases de datos como MySQL, PostgreSQL o MongoDB
- Pero, ¿qué pasaría si se pudiera combinar el servicio web y la instancia de base de datos en una sola cosa? Es posible abordar esto almacenando todos los datos en RAM
- Si se usa la RAM como base de datos, ya no hace falta serializar los datos mediante consultas SQL
- Los índices pueden implementarse usando tablas hash en memoria
- Las tareas en segundo plano pueden manejarse como hilos dentro de un proceso grande
- Si el proceso falla, es posible recuperarlo tomando snapshots periódicos de la RAM y registrando los cambios en disco
Escalado
- Cuando aparecen clientes que requieren alta disponibilidad, los servidores se replican usando el algoritmo de consenso Raft
- Si el servidor líder se cae, se elige un nuevo líder para procesar las solicitudes
- Con este método, es posible hacer despliegues rolling sin reiniciar los servidores
Extracción
- Cuando aumenta la cantidad de clientes grandes, el servicio web puede dividirse mediante sharding
- Se proporciona un clúster dedicado a cada cliente enterprise
- El principal cuello de botella puede ser el rendimiento del hilo de commit
Nuestro stack
- Uso de Common Lisp: ofrece un excelente soporte para multihilo y es adecuado para hot reloading de código
- Uso de bknr.datastore y bknr.cluster: se usa la librería Braft de Baidu para implementar Raft
- Uso de EFS para almacenar archivos de imagen: facilita más el manejo de errores y las pruebas que S3
Resumen
- Esta arquitectura es adecuada para startups nuevas, y con Common Lisp muchas herramientas ya están listas
- Agradecimientos a las contribuciones de bknr.datastore, Braft y Raft
Resumen de GN⁺
- Este artículo presenta una nueva arquitectura para construir un servicio web de alta disponibilidad sin base de datos
- Usa RAM como base de datos y garantiza alta disponibilidad mediante el algoritmo de consenso Raft
- Usa Common Lisp para soportar multihilo y hot reloading de código
- Esta arquitectura es adecuada para startups nuevas y permite desarrollo y depuración rápidos
- Proyectos con funciones similares incluyen Redis y Memcached
1 comentarios
Opiniones de Hacker News
Es raro crear tu propio registro de transacciones en lugar de usar SQLite
ramdisky replicar al almacenamiento persistente con herramientas estándar es más simpleCrear tu propia base de datos en memoria sin usar MySQL, Postgres, Redis o MongoDB es complejo
No querer aprender los aspectos básicos de MySQL o Postgres es una pérdida de tiempo
Es una arquitectura similar a la de HashiCorp con Nomad, Consul y Vault
Existe el malentendido de que la RAM es muy barata
He visto proyectos que usan directorios del sistema de archivos como tablas y archivos JSON como filas
Usar una base de datos relacional es más estable
Implementaron su propia capa de consenso Raft para evitar cosas complejas
Las apps modernas de escritorio y móviles suelen usar bases de datos como SQLite
Construir tu propia base de datos en memoria no es más simple que instalar Postgres o SQLite