Closed cuducos closed 2 years ago
Como vc gera o arquivo de dump? Pelo que eu entendi do código do comando de download, ele só baixa os arquivos.
Update: é com o comando transform?
Exato, você está correto!
Comando | Descrição | Origem dos dados | Destino dos dados |
---|---|---|---|
download |
Baixa os arquivos CSV com os dados | Página da Receita Federal | Diretório local |
transform |
Transforma os CSV em JSON | Diretório local | PostgreSQL |
O dump tenho gerado com pg_dump
na mão mesmo.
Não sei exatamente como ficaria a performance (a latencia da query, especificamente, provavelmente vai sofrer), mas dado que o grosso do seu uso é leitura somente, consideraria utilizar um banco de dados otimizado para leitura?
A aws oferece o redshift spectrum we vc paga somente pelo armazenamento (pra 100gb daria uns $2 por mes) e pelo uso ($5 por TB lido; se as tabelas estiverem indexadas ele le somente as particões relevantes). Se for o caso, a transformação do arquivo geraria um arquivo fixo, por exemplo um parquet, que seria adicionado ao S3 e depois seria executado um novo mapeamento do redshift pra considerar aquele arquivo. O redshift é um postgres modificado, é provavel que sua aplicação consiga ler diretamente dele sem modificação nenhuma.
@edinhodiluviano, eu nunca havia pensando nisso. Desconhecia DBaaS apenas para leitura, e não sabia que eles eram tão mais baratos! Vou estudar… muito obrigado 💜
Tentei importar um dump com o formato binário/customizado do Postgres pela interface web do GCP, e falhou. Pelo o que entendi, essa funcionalidade só funciona com texto puro. Então, alguns números para comparação:
Formato | Tamanho |
---|---|
custom |
11 Gb |
plain |
91 Gb |
plain com GZip (maior nível de compactação) |
11 Gb |
Dei uma olhada em algumas alternativas de storage que pudessem simplificar o processo, mas infelizmente não achei nada que batesse o seu setup atual:
O que sobra é tentar automatizar o processo de restore do dump, e pra isso tenho algumas idéias:
Sensacional, @tonnydourado! Muito obrigado por me ajudar com essa análise, compartilhando detalhes e opções.
Acho que vou começar criando um Dockerfile
que tenha o que preciso. Vou ver se no final de semana consigo algo.
Ok, algum progresso, talvez… #133
Pelo que entendi, o banco de dados está sendo recriado a cada nova atualização da receita, não seria mais viável adicionar um processo que busca apenas pelas novas empresas abertas ( baseando-se no campo data de abertura) e atualizar o banco de dados com apenas esses novos registros ?.
Como a frequência em que uma empresa atualiza seus dados na receita é muito baixo, eu imagino que seria mais viável deixar essa tarefa de atualizar os dados de uma empresa como um processo separado.
não seria mais viável adicionar um processo que busca apenas pelas novas empresas abertas
Não, isso deixaria de atualizar as empresas existentes. Por exemplo, se a Empresa A mudou de MEI para limitada entre um lote de dados e outros, essa estratégia deixaria o banco de dados inconsistente.
Fechando por inatividade. Mas podem reabrir se tiverem mais ideias 💜
Resolvi atualizar essa issue, mas talvez seja melhor abrir outra já que o contexto mudou muito em um ano.
TLDR Saíram Heroku e ElephantSQL, entrou um VPS rodando Dokku para o projeto.
Com isso, a rotina agora é, em teoria:
minha-receita download
dokku postgres:create minhareceitaYYYYMM
dokku postgres:expose minhareceitaYYYYMM
DATABASE_URL
minha-receita transform
dokku postgres:unexpose minhareceitaYYYYMM
dokku postgres:link minhareceitaYYYYMM minhareceita
e dokku config:set minhareceita DATABASE_URL=…
dokku postgres:destroy minhareceitaYYYYMM
Na prática quase que sempre a etapa do ETL falha ou por falta de memória ou por falta de espaço em disco, aí tenho que intervir manualmente fazendo alguma manutenção básica no servidor e, muitas vezes, o jeito mais rápido acaba sendo não rodar o ETL online — acabo rodando localmente, fazendo um scp
para copiar o dump do novo banco de dados em SQL e:
dokku postgres:create minhareceitaYYYYMM
dokku postgres:expose minhareceitaYYYYMM
psql -f …
dokku postgres:unexpose minhareceitaYYYYMM
dokku postgres:link minhareceitaYYYYMM minhareceita
e dokku config:set minhareceita DATABASE_URL=…
dokku postgres:destroy minhareceitaYYYYMM
ATUALIZAÇÃO Nova forma de atualização (manual) descrita num comentário um ano mais recente.
O processo de atualização do servidor minhareceita.org é basicamente composto por três etapas com diferentes gargalos. Essa issue tem como objetivo discutir a automatização do terceiro desses passos:
./minha-receita download
e./minha-receita -x check
até tudo estar OKpg_restore
não é resiliente e o processo, por ser demorado, sempre acaba interrompido por erro de conexão (levando a #131)pg_restore
na sessão, monitoro e, ao final, excluo a VMClaro que os passos 1 e 2 podem ser automatizados, mas vamos começar focando no calo que dói mais agora.
Contexto
Atualmente o projeto roda com o plano Happy Hippo do ElephantSQL que oferece 50% de desconto pela natureza do projeto (tecnologia cívica, código aberto, dados abertos). Em suma, isso quer dizer que:
O banco atual tem 4Gb de RAM, mas isso não parece ser um gargalo (dados dos últimos 14 dias mostram que raramente chega a 1Gb de uso — mas isso não leva em conta o restante do sistema operacional pelo o que entendi).
Um custo não facilmente mensurável é a facilidade de criar uma nova instância em poucos cliques — isso facilita e viabiliza consideravelemente a manutenção do projeto (pois meu tempo para mantê-lo é limitado)
O processo de atualização
Dado que a cada novo lote de dados disponibilizados pela Receita Federal:
É mais fácil subir os dados em um novo banco de dados — atualmente crio uma nova instância pois o DBaaS em uso não permite mais de uma database na mesma instância do PostgreSQL, mas nada impede de usarmos um
CREATE DATABASE minhareceita_2022_06
na mesma instância, por exemplo.Possível automatização
Explorei a GCP, mas creio que esse processo pode ser replicdo em outras plataformas. O gargalo do ElephantSQL é que eles não tem uma solução para importar um arquivo da nuvem.
Configuração inicial
Isso precisa ser feito apenas uma vez, sem necessidade de automatização:
Automatizar
Esse processo seria executado a cada novo dump gerado:
(provavelmente via CLI do Heroku, mas pode ser manual num primeiro momento)
Dúvidas & comentários
.gzip
)? Isso impacta o tamanho do arquivo, logo, o tempo necessário (e janela de falha por erros de conexão) para o passo 1.