- Litestream VFS es una extensión tipo plugin que permite leer y consultar directamente bases de datos SQLite desde almacenamiento de objetos (como S3)
- Permite hacer consultas inmediatas desde archivos de respaldo remotos y recuperación a un punto en el tiempo (Point-in-Time Recovery, PITR) sin descargar toda la base de datos
- Internamente usa el formato LTX para gestionar eficientemente conjuntos de páginas modificadas, y mejora la velocidad de recuperación con compactación (compaction) que omite páginas duplicadas
- Aprovecha la interfaz VFS de SQLite para interceptar solo las operaciones de lectura, mientras que el proceso de escritura queda a cargo del proceso existente de Litestream
- Con respaldos por segundo y actualización de índices, ofrece una réplica casi en tiempo real, lo que permite ejecutar consultas rápidamente en entornos cloud
Resumen de Litestream VFS
- Litestream VFS es una función que permite que SQLite use directamente una URL de almacenamiento de objetos como fuente de datos
- Se activa en el shell de SQLite con los comandos
.load litestream.so y .open file:///my.db?vfs=litestream
- Después de eso, es posible ejecutar consultas basadas en archivos de respaldo almacenados en S3
- Permite consultar directamente desde respaldos remotos sin descargar toda la base de datos
- En el ejemplo, se consulta inmediatamente una parte de los datos almacenados en S3 mediante
SELECT * FROM sandwich_ratings
Función de recuperación a un punto en el tiempo (PITR)
- Con el comando
PRAGMA litestream_time = '5 minutes ago'; se puede consultar el estado de los datos en un momento específico
- Se puede indicar tiempo relativo (
5 minutes ago) o tiempo absoluto (2000-01-01T00:00:00Z)
- Esto permite realizar recuperación inmediata a un punto en el tiempo (Point-in-Time Recovery) a nivel SQL
- En el ejemplo, después de ejecutar un
UPDATE erróneo, se vuelve al estado de hace 5 minutos para verificar los datos correctos
Formato LTX y compresión de datos
- Litestream v0.5 integra el formato LTX (Litestream Transaction eXchange)
- Las versiones anteriores transferían páginas completas de SQLite, pero LTX solo transfiere conjuntos ordenados de páginas
- El núcleo de LTX es la función “compaction”, que durante la recuperación selecciona solo la versión más reciente de cada página
- Ejemplo: de
1 2 3 5 3 5 4 5 5 solo se usan los valores más a la derecha: 5, 4, 3, 2 y 1
- LTX puede compactar no solo toda la base de datos, sino también entre conjuntos de archivos LTX, lo que hace posible la recuperación PITR
- El trailer de los archivos LTX incluye un índice de offsets de cada página, por lo que
- se pueden leer solo las páginas necesarias mediante solicitudes Range de S3 sin descargar el archivo completo
Forma de implementación del VFS
- Litestream VFS está implementado usando la interfaz VFS (Virtual File System) de SQLite
- El VFS es una estructura de plugin que abstrae la capa de acceso al sistema operativo en SQLite
- Litestream VFS maneja solo las operaciones de lectura (Read), mientras que las de escritura (Write) siguen a cargo del proceso existente de Litestream
- Cuando SQLite lee una página, el VFS realiza un mapeo basado en índice de páginas en lugar de usar directamente el offset de bytes solicitado
- Busca en el índice el nombre del archivo, el offset real y el tamaño de página, y descarga solo ese bloque mediante el encabezado Range de la API de S3
- Implementa una caché LRU para mantener en memoria las “hot pages” accedidas con frecuencia y minimizar la cantidad de llamadas a S3
Replicación en tiempo real y rendimiento
- Litestream realiza un respaldo de nivel L0 una vez por segundo
- El VFS hace polling periódico de la ruta en S3 para actualizar gradualmente el índice
- Como resultado, genera una réplica casi en tiempo real (near-realtime replica)
- Puede usarse de inmediato sin necesidad de transmitir toda la base de datos
- Gracias a esta estructura, se obtiene inicio rápido y tiempos de recuperación cortos
Uso e importancia
- Litestream conserva respaldos de todos los estados de la base de datos con resolución de segundos
- Ante errores de
DELETE o UPDATE, es posible restaurar inmediatamente al momento deseado
- Al consultar directamente desde almacenamiento de objetos, funciona rápidamente incluso en entornos de servidores efímeros
- Aprovecha funciones nativas de SQLite para ofrecer un esquema de respaldo y recuperación simple pero potente sin mecanismos complejos
- También se usa en la API interna de Fly.io y puede operar de forma estable en producción
1 comentarios
Comentarios de Hacker News
Siempre me da mucha alegría enterarme de que el código que hice le sirve a otras personas
psanford/sqlite3vfs
SQLite funciona como siempre, y Litestream opera de forma transparente por encima
O sea, se puede implementar recuperación a un punto en el tiempo (PITR) solo con SQL y pragmas de SQLite.
Se pueden consultar rápidamente datos pasados sin tocar directamente el dataset de producción
Puedes indicar un bucket de S3 con una variable de entorno y, en SQLite, después de
.load litestream.so,consultar datos de un momento pasado inmediatamente con
PRAGMA litestream_time = '5 minutes ago';brew install sqlite3,hay que especificar directamente el nombre de la función init como
.load litestream sqlite3_litestreamvfs_initSolo hay que configurar
"LITESTREAM_REPLICA_URL"y las variables de entorno de las claves de AWSDespués de cargar la extensión con
temp.loadExtension("/path/to/litestream.dylib", "sqlite3_litestreamvfs_init"),se puede usar de inmediato abriendo
file:my.db?vfs=litestream.dylibMi caso de uso es usar directamente en un sitio web una base de datos SQLite de solo lectura almacenada en S3
La BD se actualiza con tareas cron y similares, y el sitio web solo lee los datos más recientes mediante Litestream VFS
Quisiera saber si está bien usarlo así y si también existe un módulo de integración para Python
Actualmente, una app de Flask toma datos de Google Spreadsheet, los convierte a SQLite y los actualiza cada día
Referencia al código de mi app
También funciona tal cual desde el CLI de SQLite, sin código adicional en Python
Usa solo S3 como dependencia externa y también encaja muy bien con SQLite
Referencia de rendimiento de ZeroFS con SQLite
Código de ejemplo de ncruces/go-sqlite3
Se puede controlar desde el código del programa sin variables de entorno y manejar varias BD al mismo tiempo
Eso sí,
PRAGMA litestream_timese aplica a nivel de conexión, así que hay que tener cuidado si se usa un pool de conexiones.load litestream.sopensé de inmediato en ncruces/go-sqlite3Me pregunto si fue difícil hacerlo funcionar también en entornos wasm
La extensión “DuckLake” de DuckDB crea snapshots por transacción y ofrece una función de “viaje en el tiempo”
Eso es parecido al PITR de Litestream VFS
En OLTP, a esto se le llama una función de recuperación, y en OLAP se le dice “Time Travel”
DuckLake coordina el acceso multiproceso usando una BD de catálogo externa (PostgreSQL/MySQL/SQLite)
En cambio, Litestream permite que varios lectores accedan al mismo tiempo mediante archivos LTX inmutables en S3
En ambos mundos, todo parece estar convergiendo hacia una estructura de “almacenamiento compartido + metadatos + compactación”
Ojalá hubiera más colaboración cruzada entre proyectos como estos
Notas de la versión v0.5.3
Por ejemplo, si se están usando extensiones de búsqueda vectorial como sqlite-vec o vss,
quiero saber si se puede hacer respaldo en tiempo real a S3 con Litestream y consulta remota con Litestream VFS
Parece que no queda otra que probarlo directamente