12 pontos por GN⁺ 2025-12-13 | 1 comentários | Compartilhar no WhatsApp
  • Litestream VFS é uma extensão em forma de plugin que permite ler e consultar diretamente bancos de dados SQLite a partir de armazenamento de objetos (como S3)
  • Permite fazer consultas imediatas em arquivos de backup remotos e recuperação em um ponto no tempo (Point-in-Time Recovery, PITR) sem baixar o banco de dados inteiro
  • Internamente, usa o formato LTX para gerenciar com eficiência conjuntos de páginas alteradas, e melhora a velocidade de recuperação com compaction, que ignora páginas duplicadas
  • Aproveita a interface VFS do SQLite para interceptar apenas operações de leitura, enquanto as gravações continuam sendo tratadas pelo processo Litestream existente
  • Fornece réplicas quase em tempo real por meio de backups e atualização de índice em intervalos de segundos, permitindo consultas rápidas em ambientes de nuvem

Visão geral do Litestream VFS

  • Litestream VFS é um recurso que permite ao SQLite usar diretamente uma URL de armazenamento de objetos como fonte de dados
    • Pode ser ativado no shell do SQLite com os comandos .load litestream.so e .open file:///my.db?vfs=litestream
    • Depois disso, é possível executar consultas com base em arquivos de backup armazenados no S3
  • Permite consultar diretamente backups remotos sem baixar o banco de dados inteiro
    • No exemplo, a consulta SELECT * FROM sandwich_ratings recupera imediatamente parte dos dados armazenados no S3

Recurso de recuperação em um ponto no tempo (PITR)

  • Com o comando PRAGMA litestream_time = '5 minutes ago';, é possível consultar o estado dos dados em um momento específico
    • É possível especificar tempo relativo (5 minutes ago) ou absoluto (2000-01-01T00:00:00Z)
  • Isso permite realizar recuperação imediata em um ponto no tempo (Point-in-Time Recovery) no nível de SQL
    • No exemplo, após executar um UPDATE incorreto, o estado de 5 minutos antes é restaurado para verificar os dados corretos

Formato LTX e compactação de dados

  • O Litestream v0.5 integrou o formato LTX (Litestream Transaction eXchange)
    • Versões anteriores transmitiam páginas inteiras do SQLite, mas o LTX transmite apenas conjuntos ordenados de páginas
  • O ponto central do LTX é o recurso de “compaction”, que seleciona apenas a versão mais recente de cada página durante a recuperação
    • Exemplo: em 1 2 3 5 3 5 4 5 5, são usados apenas os valores mais à direita de 5, 4, 3, 2 e 1
  • O LTX pode ser compactado não só para o banco de dados inteiro, mas também entre conjuntos de arquivos LTX, o que torna possível a recuperação PITR
  • O trailer dos arquivos LTX inclui um índice de deslocamentos de cada página, de modo que
    • é possível ler apenas as páginas necessárias via requisições Range do S3 sem baixar o arquivo inteiro

Como o VFS é implementado

  • O Litestream VFS é implementado usando a interface VFS (Virtual File System) do SQLite
    • O VFS é uma estrutura de plugin que abstrai a camada de acesso ao sistema operacional do SQLite
  • O Litestream VFS trata apenas operações de leitura (Read), enquanto a gravação (Write) continua sob responsabilidade do processo Litestream existente
  • Quando o SQLite lê uma página, o VFS faz um mapeamento baseado em índice de páginas, em vez de usar diretamente o deslocamento em bytes solicitado
    • Ele consulta no índice o nome do arquivo, o deslocamento real e o tamanho da página, e então baixa apenas esse bloco usando o cabeçalho Range da API do S3
  • Um cache LRU mantém em memória as “hot pages” acessadas com frequência, minimizando o número de chamadas ao S3

Replicação em tempo real e desempenho

  • O Litestream executa backup de nível L0 uma vez por segundo
    • O VFS faz polling periódico do caminho no S3 para atualizar o índice de forma incremental
    • Como resultado, cria-se uma réplica quase em tempo real (near-realtime replica)
  • Pode ser usado imediatamente sem necessidade de fazer streaming do banco de dados inteiro
  • Essa estrutura garante inicialização rápida e tempo de recuperação curto

Uso e importância

  • O Litestream mantém backup de todos os estados do banco de dados com resolução em segundos
    • Em caso de erro com DELETE ou UPDATE, é possível restaurar imediatamente para o momento desejado
  • Como consulta diretamente no armazenamento de objetos, funciona rapidamente mesmo em ambientes de servidores efêmeros
  • Sem mecanismos complexos, aproveita os recursos nativos do SQLite para oferecer um sistema de backup e recuperação simples e poderoso
  • Também é usado na API interna da Fly.io, e pode operar de forma estável em produção

1 comentários

 
GN⁺ 2025-12-13
Comentários do Hacker News
  • Ah, isso está usando o módulo sqlite vfs para Go que eu fiz
    Fico muito feliz sempre que descubro que um código meu está ajudando outras pessoas
    psanford/sqlite3vfs
    • Funcionou bem. Obrigado por isso
    • No fim das contas, é por momentos assim que a gente quer viver
  • Isso é realmente muito legal. O Litestream VFS incorpora perfeitamente a filosofia Unix
    O SQLite funciona como sempre, e o Litestream opera de forma transparente por cima
    Ou seja, dá para implementar recuperação pontual no tempo (PITR) só com SQL e pragmas do SQLite.
    Também é possível consultar rapidamente dados do passado sem mexer diretamente no dataset de produção
  • O design da interface é muito elegante
    Você define o bucket S3 com variáveis de ambiente e, no SQLite, depois de .load litestream.so,
    pode consultar dados de um ponto no passado imediatamente com PRAGMA litestream_time = '5 minutes ago';
    • No macOS, depois de brew install sqlite3,
      é preciso especificar manualmente o nome da função init, como em .load litestream sqlite3_litestreamvfs_init
  • Também consegui fazer funcionar com bun:sqlite
    Basta configurar "LITESTREAM_REPLICA_URL" e as variáveis de ambiente das chaves AWS
    Depois de carregar a extensão com temp.loadExtension("/path/to/litestream.dylib", "sqlite3_litestreamvfs_init"),
    é só abrir com file:my.db?vfs=litestream e usar na hora
    • Fico curioso se isso é usado principalmente em ambientes de servidor JavaScript (bun)
    • Que legal saber que funcionou. Mas fiquei curioso sobre como você encontrou o caminho do arquivo .dylib
    • Só como referência: neste exemplo, a parte de configuração das variáveis de ambiente não funciona com dotenv. É preciso defini-las diretamente na execução
  • É uma funcionalidade realmente ótima.
    Meu caso de uso é usar diretamente em um site um SQLite DB somente leitura armazenado no S3
    O DB é atualizado por tarefas cron e similares, e o site apenas lê os dados mais recentes via Litestream VFS
    Queria saber se esse tipo de uso é aceitável e se existe algum módulo de integração para Python
    Atualmente, um app Flask pega dados do Google Spreadsheet, converte para SQLite e atualiza diariamente
    Veja o código do meu app
    • Autor aqui. O Litestream VFS faz polling automático dos dados de backup a cada 1 segundo para se manter atualizado
      Também funciona normalmente no SQLite CLI sem código Python adicional
    • Para um uso parecido, também recomendo o ZeroFS
      Ele usa apenas S3 como dependência externa e combina bem com SQLite
      Veja o desempenho do ZeroFS com SQLite
  • Já implementei isso também no driver SQLite para Go
    Código de exemplo do ncruces/go-sqlite3
    Dá para controlar por código do programa, sem variáveis de ambiente, e lidar com vários DBs ao mesmo tempo
    Só que PRAGMA litestream_time é aplicado por conexão, então é preciso tomar cuidado ao usar pool de conexões
    • Ao ver .load litestream.so, pensei imediatamente em ncruces/go-sqlite3
      Fiquei curioso se foi difícil fazer isso funcionar também em ambiente wasm
  • Recentemente venho aprendendo DuckDB e percebendo as diferenças em relação ao SQLite
    A extensão “DuckLake” do DuckDB cria snapshots a cada transação e oferece uma funcionalidade de “viagem no tempo”
    Isso é semelhante ao PITR do Litestream VFS
    Em OLTP, isso é chamado de funcionalidade de recuperação; em OLAP, de “Time Travel”
    O DuckLake coordena o acesso por múltiplos processos usando um banco de catálogo externo (PostgreSQL/MySQL/SQLite)
    Já o Litestream permite que vários leitores acessem ao mesmo tempo por meio de arquivos LTX imutáveis no S3
    Nos dois mundos, tudo parece estar convergindo para uma estrutura de “armazenamento compartilhado + metadados + compactação”
    Seria ótimo ver mais colaboração cruzada entre projetos assim
  • Como amante de sanduíches, fiquei realmente curioso sobre aqueles dados de avaliação de sanduíches
  • É interessante, mas fiquei confuso sobre qual software exatamente foi anunciado. É uma nova versão do Litestream?
    • Autor aqui. Sim, a v0.5.3 do Litestream foi lançada agora e adiciona a opção de VFS somente leitura
      Notas de release da v0.5.3
    • Esta versão também inclui suporte à replicação de diretórios para DBs multi-tenant. Uma excelente adição
  • Fiquei curioso se isso também funciona junto com extensões do sqlite
    Por exemplo, ao usar extensões de busca vetorial como sqlite-vec ou vss,
    queria saber se dá para fazer backup em tempo real para o S3 com Litestream e consultar remotamente com Litestream VFS
    • Também estou curioso. Talvez funcione normalmente se as consultas forem executadas localmente e os dados necessários forem buscados do S3 por página
      Acho que só testando para saber mesmo
    • Funciona (só isso)