- Litestream respalda de forma segura en almacenamiento de objetos aplicaciones full-stack basadas en SQLite, y esta vez recibió su cambio de funcionalidad más grande
- Ahora permite una recuperación puntual rápida y eficiente al aplicar un formato de archivo LTX y técnicas de compactación más eficientes que la estructura anterior
- Simplifica la implementación del singleton de lectura y de las funciones de read replica con un nuevo enfoque que aprovecha conditional write
- Pronto ofrecerá una capa de read-replica basada en VFS, lo que permitirá escalar fácilmente en diversos entornos
- Gracias a una estructura ampliamente mejorada, ahora es posible sincronizar múltiples bases de datos al mismo tiempo, aumentando la escalabilidad
Introducción e importancia de Litestream
- Litestream es una herramienta de código abierto que ofrece la capacidad de respaldar de forma segura en almacenamiento de objetos diversas aplicaciones full-stack basadas en SQLite
- Resuelve el problema de que los datos queden atados a un solo servidor debido a la naturaleza embebida de SQLite, y facilita la recuperación de datos incluso en caso de falla del servidor
Evolución de Litestream
- Litestream apareció en 2020 para facilitar el uso de SQLite
- Litestream se ejecuta como un proceso separado de la aplicación SQLite y reemplaza el proceso de checkpointing de WAL, transmitiendo en tiempo real los cambios de datos a almacenamiento de objetos como S3
- Incluso si se pierde el servidor, la base de datos puede restaurarse eficientemente a su estado más reciente desde el almacenamiento de objetos
- Después se desarrolló además un proyecto llamado LiteFS, que agregó soporte para read replicas y failover primario básico, permitiendo usar SQLite con una arquitectura de despliegue moderna similar a la de Postgres
- Tanto LiteFS como Litestream tienen ventajas, pero Litestream es más fácil de desplegar y usar, al grado de haberse adoptado más ampliamente
Recuperación puntual eficiente (Point-in-time Restore)
- El diseño anterior de Litestream registraba continuamente todos los cambios y los enviaba a S3, pero eso resultaba ineficiente al restaurar cuando los datos cambiaban con frecuencia
- En LiteFS se introdujo un enfoque basado en conciencia de transacciones, usando el formato de archivo LTX, que registra de forma ordenada los rangos de páginas modificadas
- Al fusionar fácilmente varios archivos LTX mediante compactación, se conservan solo las versiones más recientes, mejorando drásticamente la velocidad y eficiencia de la recuperación de datos
- Esta estructura es similar a un árbol LSM
- El nuevo Litestream también adopta archivos LTX y compactación, permitiendo una recuperación puntual precisa sin mucho almacenamiento redundante
CASAAS: Compare-and-Swap as a Service
- Litestream debe funcionar aunque la aplicación SQLite no sea consciente del sistema de respaldo, y si el proceso se detiene por una falla u otro problema, pueden perderse cambios de datos
- Para resolver esto, se introdujo el concepto de generation para identificar de manera única cada sesión de respaldo y su flujo de logs correspondiente
- En LiteFS se usaba Consul para garantizar un único líder, pero debido a la necesidad de dependencias externas, Litestream implementa de forma sencilla una ruta única de replicación (singleton) mediante la función de conditional write de almacenes de objetos como S3
- Gracias a esto, puede operar de forma estable y sin confusiones incluso en entornos con nodos efímeros
Función ligera de read replica
- LiteFS usa el sistema de archivos FUSE para tener conciencia de transacciones, pero esto implica complejidad y una mayor barrera de adopción
- Para aliviar esto, se diseñó un módulo de extensión SQLite Virtual Filesystem (VFS) llamado LiteVFS, que permite operar en diversos entornos sin FUSE
- En el futuro, Litestream también aplicará la misma capa basada en VFS para ofrecer una capa de read replica que obtenga y almacene en caché páginas directamente desde almacenes de objetos como S3
- No será tan rápido como SQLite local, pero se espera que mediante estrategias de caché y prefetching pueda ofrecer un rendimiento satisfactorio en muchos casos de uso
Código abierto y utilidad
- Litestream es completamente de código abierto y puede usarse en cualquier lugar, sin depender de Fly.io
- Se agregó la capacidad de sincronizar una gran cantidad de bases de datos desde un solo proceso, lo que permite respaldar o replicar eficientemente cientos o miles de bases de datos
Crecimiento continuo junto con SQLite
- SQLite es una base de datos robusta que sigue generando nuevos casos de uso de forma constante incluso en medio de los cambios de la industria
- En áreas recientes como los agentes de generación de código basados en LLM, donde el rollback y el branching de datos en tiempo real se vuelven importantes, la capacidad mejorada de recuperación puntual de Litestream puede convertirse en una base clave
- En el futuro, esta arquitectura mejorada también contribuirá a funciones ampliadas como rollback, fork y respuesta para agentes automatizados
- El nuevo Litestream es superior al diseño anterior y refuerza tanto la escalabilidad como la facilidad de uso
2 comentarios
Litestream - herramienta de replicación en streaming para SQLite
Estoy apostando todo por SQLite del lado del servidor
Comentarios en Hacker News
Comparte su experiencia al encontrar la ubicación del repositorio de código; hace 2 años tuvo incomodidades al usar litestream y litefs, pero esta vez siente que la mayoría de los problemas ya se resolvieron. Desde su perspectiva, ahora puede aplicar litestream a la base de datos con más libertad y preocuparse menos por los problemas de múltiples writers. También espera con interés las ventajas de la capa FUSE de read replica, y menciona en un pull request relacionado el enfoque de adquisición de lease (si ya existe un lease, el nuevo proceso reintenta cada segundo para permitir rolling restarts rápidos), lo que le parece un enfoque práctico.
Siente que en el nuevo Litestream por fin se implementó todo lo que quería, y transmite expectativa y emoción.
Ve de forma positiva que es una solución muy inteligente y que simplifica mucho el despliegue. Cuenta que, en una situación donde necesitaba respaldar miles de bases de datos SQLite, hasta ahora había armado una solución temporal con fanotify y la Backup API de SQLite. Espera poder migrar a Litestream si la wildcard replication soporta muchos archivos.
Destaca que, tras el cambio a LTX, ahora es posible replicar
/data/*.dbincluso si en un directorio hay cientos o miles de bases de datos. Señala que antes esto era un bloqueo decisivo, y ahora ve con optimismo que en entornos multi-tenant será posible hacer recuperación a un punto en el tiempo, descarga de datos y migración por base de datos de cada usuario.Agradece a ben y comparte su experiencia real de uso: lleva más de un año usando litestream en producción para un caso interno con mucha escritura (unos 12 GB comprimidos), y comenta que el costo mensual es mínimo (en Azure, apenas unos centavos de dólar). Espera con interés aplicar los nuevos cambios.
Le gustaría que la experiencia de desarrollo con SQLite en Fly estuviera un poco más pulida. Como punto débil actual, dice que faltan una UI y un CLI propios, y que configurar la base de datos inicial en un Fly Machine termina siendo más trabajo del esperado. Señala que
fly consoleno se integra bien con SQLite y se ejecuta en una máquina aparte, por lo que no puede acceder al volumen donde están los datos; al final, hay que entrar directamente a esa máquina confly ssh console —pty, lo que resulta incómodo. Añade que las webapps basadas en SQLite suelen ser pequeñas, así que para que sean rentables hay que operar muchas.Comparte que justo estaba investigando Litestream cuando se topó con el artículo en el momento ideal. Usa Sqlite en un VPS y está considerando adoptar Litestream. Pregunta si es posible restaurar la base de datos a un punto específico mientras el proceso de Litestream sigue en ejecución, y expresa dudas sobre una franja de tiempo no recuperable debido a que el auto-checkpointing consume el WAL cuando el proceso está caído (ejemplo: si el proceso se detiene por una falla de 2:00 a 3:00, se podría restaurar a las 1:55 o a las 3:05, pero la información para restaurar entre 2:00 y 3:00 desaparecería).
Se explica que Litestream guarda segmentos de WAL por unidades de tiempo específicas y, por defecto, envía los cambios del WAL cada segundo, así que es posible hacer recuperación puntual con resolución de segundos dentro del período de retención configurado.
Pregunta por el manejo de DST (horario de verano), específicamente qué pasa en Europa cuando el 30 de marzo la hora salta de las 2:00 a las 3:00.
Comparte que en el pasado creó un sqlite vfs llamado DonutDB sobre dynamodb. Con la incorporación de CAS (Content Addressable Storage) a S3, pensaba renovar DonutDB con soporte para S3, pero ahora le alegra que lightstream ya soporte eso y así no tenga que desarrollarlo por su cuenta. Muestra entusiasmo por usar la nueva herramienta.
Recuerda que al desplegar una app, en el enfoque anterior se levantaba una nueva instancia de servidor, se esperaba a que pasara el health check, se conmutaba el tráfico y luego se apagaba el servidor viejo; durante esa transición había pérdida de cambios en la base de datos. Pregunta si este problema queda resuelto con los cambios recientes.
Opina que el servidor no debe verse como una instancia efímera de web server, sino desde la perspectiva de una base de datos de producción. Al desplegar una webapp con python/sqlite, usa un método donde no reemplaza toda la máquina, sino que actualiza paquetes y reinicia el servicio de systemd. Para reducir el downtime, se puede pensar en una transición con
SO_REUSEPORT, y en ese caso un proceso nuevo y uno viejo podrían usar la base de datos al mismo tiempo; aun así, si hay cambios de esquema en la DB, considera inevitable cierto downtime. Cree que esto también puede pasar con otras bases de datos.Considera que no es un problema fácil de resolver, porque sigue existiendo la restricción de que solo un writer puede tomar el lease. Aunque el nuevo servicio arranque, no podrá obtener el lease hasta que el writer anterior se detenga. Se ofrecen herramientas para facilitar el cambio de writer, pero explica que igual habrá que aceptar espera de solicitudes o un downtime breve.
Pregunta cómo agregar dinámicamente nuevas bases de datos en tiempo de ejecución si se quiere replicar con litestream una gran cantidad de bases de datos por usuario (el caso de uso principal que trata la documentación). Comenta que el archivo de configuración actual es estático y no encontró una API en tiempo real.