12 puntos por GN⁺ 2025-12-13 | 1 comentarios | Compartir por WhatsApp
  • 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

 
GN⁺ 2025-12-13
Comentarios de Hacker News
  • Oh, esto usa el módulo sqlite vfs para Go que hice yo
    Siempre me da mucha alegría enterarme de que el código que hice le sirve a otras personas
    psanford/sqlite3vfs
    • Funcionó bien. Gracias por eso
    • Al final, esto es el tipo de momento que uno quiere en la vida
  • Esto está realmente genial. Litestream VFS captura perfectamente la filosofía Unix
    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
  • El diseño de la interfaz está muy limpio
    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';
    • En macOS, después de brew install sqlite3,
      hay que especificar directamente el nombre de la función init como .load litestream sqlite3_litestreamvfs_init
  • También lo hice funcionar correctamente con bun:sqlite
    Solo hay que configurar "LITESTREAM_REPLICA_URL" y las variables de entorno de las claves de AWS
    Despué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
    • Me pregunto si esto está pensado sobre todo para usarse en entornos de servidor JavaScript (bun)
    • Qué bueno que funcionó. Pero me da curiosidad cómo encontraste la ruta del archivo .dylib
    • Como referencia, en este ejemplo la parte de configurar variables de entorno no funciona con dotenv. Hay que definirlas directamente al ejecutar
  • Es una función realmente genial.
    Mi 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
    • Soy el autor. Litestream VFS hace polling automáticamente de los datos respaldados cada segundo para mantenerse actualizado
      También funciona tal cual desde el CLI de SQLite, sin código adicional en Python
    • Para un uso parecido también recomiendo ZeroFS
      Usa solo S3 como dependencia externa y también encaja muy bien con SQLite
      Referencia de rendimiento de ZeroFS con SQLite
  • Ya lo implementé también en un driver de SQLite para Go
    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_time se aplica a nivel de conexión, así que hay que tener cuidado si se usa un pool de conexiones
    • Al ver .load litestream.so pensé de inmediato en ncruces/go-sqlite3
      Me pregunto si fue difícil hacerlo funcionar también en entornos wasm
  • Últimamente he estado aprendiendo DuckDB y notando las diferencias con SQLite
    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
  • Como amante de los sándwiches, tengo mucha curiosidad por esos datos de calificaciones de sándwiches
  • Suena interesante, pero me confunde exactamente qué software fue anunciado. ¿Es una nueva versión de Litestream?
    • Soy el autor. Sí, se lanzó recientemente Litestream v0.5.3, y se agregó una opción de VFS de solo lectura
      Notas de la versión v0.5.3
    • Esta versión también incluye soporte para replicación de directorios para BD multi-tenant. Es una excelente adición
  • Me pregunto si también funciona junto con extensiones de sqlite
    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
    • Yo también tengo curiosidad. Probablemente, si las consultas se ejecutan localmente y la estructura trae desde S3 por páginas según se necesite, entonces simplemente debería funcionar
      Parece que no queda otra que probarlo directamente
    • Sí se puede (eso es todo)