- 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
Comentários do Hacker News
Fico muito feliz sempre que descubro que um código meu está ajudando outras pessoas
psanford/sqlite3vfs
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
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';brew install sqlite3,é preciso especificar manualmente o nome da função init, como em
.load litestream sqlite3_litestreamvfs_initBasta configurar
"LITESTREAM_REPLICA_URL"e as variáveis de ambiente das chaves AWSDepois de carregar a extensão com
temp.loadExtension("/path/to/litestream.dylib", "sqlite3_litestreamvfs_init"),é só abrir com
file:my.db?vfs=litestreame usar na hora.dylibMeu 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
Também funciona normalmente no SQLite CLI sem código Python adicional
Ele usa apenas S3 como dependência externa e combina bem com SQLite
Veja o desempenho do ZeroFS com SQLite
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.load litestream.so, pensei imediatamente em ncruces/go-sqlite3Fiquei curioso se foi difícil fazer isso funcionar também em ambiente wasm
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
Notas de release da v0.5.3
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
Acho que só testando para saber mesmo