Executando verificação de segurança...
24

Reduzi um DB de 52gb para 4.5gb! PostgreSQL -> Clickhouse

Opa, saudações a todos.
Passando pra compartilhar minha experiência com o banco de dados Clickhouse.

Como o título do post diz, consegui reduzir em mais de 90% o tamanho dos dados simplesmente trocando de banco de dados.

sou adepto do PostgreSQL a anos e sempre gostei dele pra desempenho e consultas rápidas.

Porém ultimamente estou a frente de uma serie de otimizações e migrações de dados na empresa em que trabalho, e o PostgreSQL começou a ficar lento diante do volume de dados e das consultas simultâneas.

Diante disso, procurei diversas soluções pra continuar usando PostgreSQL e manter o bom desempenho, mas não existe mágica nisso.

Tentei particionar as tabelas, criar indices, views materializadas, Timescale DB e tudo mais focando em desempenho.
até tentei a boa e velha força bruta baseada em gastar dinheiro em servidores grandes pra segurar a carga.

Segurou, mas sempre com alguns poréns e instabilidades momentâneas.

e esse tipo de "solução" não é o ideal.

Os DBs que estou trabalhando são de histórico de dados (cliques, acessos, log de registros, etc), e todas as queries sempre são focadas em contagem e agregações desses dados, nunca é uma busca 1:1.

pensando nisso, decidi sair da bolha do PostgreSQL e tentar outros DBs.

Até que um amigo me deu a dica de um post no blog do PostHog (plataforma de monitoramento e observabilidade) e como eles solucionaram o problema de desempenho em grandes volumes de dados migrando pra clickhouse.

Foi a fórmula mágica caindo no meu colo!

A simples migração dos dados de um dos DBs pra clickhouse já demonstrou um avanço incrível!

redução de 52gb pra míseros 4.5gb!

mais de 90% de redução!

tempo medio de consultas abaixo dos 90ms, em comparação com +200ms no PostgreSQL.

uso de recursos muito menor: DB em PostgreSQL tem 8 vcpu e 32gb de RAM contra míseros 4vcpu e 8gb de RAM no clickhouse.

Ainda estou em testes preliminares em relação ao clickhouse, mas estou me surpreendendo bastante com o desempenho e compressão dos dados. Parece até mágica kkkkkk.

pontos a levar em consideração:

clickhouse não é útil em todos os cenários.
ele brilha em situações como a que descrevi acima: armazenamento de dados de históricos pra uma busca agregada com base em alguma coluna.

  • ex: buscar a contagem de cliques em determinado link no dia XYZ.
    • nisso o clickhouse desempenha absurdamente bem.

Outras vantagens do clickhouse

  • controle de validade dos dados de uma tabela

    • Ao criar uma tabela, é possível definir um TTL (time to live) e assim os dados são apagados automaticamente pelo próprio DB sem precisar de tarefas cron e queries de delete em massa.
    • isso é uma maravilha nesse tipo de armazenamento de dados, pois conforme o tempo passa, o volume de dados aumenta, o banco cresce e depois se torna uma dor de cabeça controlar o consumo de disco.
  • Conexão com o banco muito mais simples, sem necessidade de Pools ou gerenciamento de sessões.

    • Quem ja trabalhou com PostgreSQL em produção sabe que o banco simplesmente morre se você abrir sessões demais, e é sempre necessário equilibrar o tamanho dos pools de sessões pra evitar derrubar o banco em momentos de pico. Pra isso, acaba sendo obrigatório usar pgbouncer ou algum pooler externo pra lidar melhor com os acessos ao DB, e isso gera mais complexidade na Stack.
    • Com o clickhouse não tem isso, as sessões são muito otimizadas e simplificadas, tudo via HTTP padrão, oque reduz complexidade de conexão.
  • Replicação e sharding nativo

    • PostgreSQL também tem replicação, mas sharding é um terror de fazer com citus, além de ser um plugin pro DB, oque gera incertezas.
    • No clickhouse isso é nativo e aparenta ser bem simplificado, tornando esse tipo de crescimento horizontal menos penoso pra quem gerencia (eu no caso kkkkk)
  • Tem várias outras vantagens mas por enquanto essas que me atraíram mais e são as que mais vou utilizar...

Próximo passo

agora a próxima migração vai ser de um DB massivo de 7tb de tamanho e 50 bilhões de linhas que segue a mesma lógica: dados de histórico.

esse é o verdadeiro alvo da minha experiência com clickhouse, porém preferi testar primeiro em um DB menor pra não perder tempo. Se desse errado nesse teste, seria menos esforço jogado fora kkkkk

ps: Não sou mestre em banco de dados, mas sei me virar. Tudo descrito aqui foi com base em experiência própria

Carregando publicação patrocinada...
4

Fiquei curioso sobre os detalhes da quest de tentar "fazer acontecer no PostgreSQL", recentemente no meu trampo atual saimos de Mongo para TimescaleDB com ~4TB de dados, e com queries "OLAP like" com tempo de resposta na casa dos 10/50ms (não vou mentir mas temos spikes de 200/500ms kkk), nessa quest além do que você já comentou fomos fundo nas configurações do postgres, que são bem conservadoras por default, work_mem, checkpoint_timeout, max_wal_size, fora o que ainda não descobrimos e a lista vai longe... Dependendo do padrão de write/read do seu workload, tunar essas configs faz uma diferença enorme.

Boa sorte na proxima quest com o banco de 7tb, não deixe de postar aqui o resultado xD. E Não conhecia o ClickHouse, sua experiência me chamou a atenção vou dar uma estudada!

ps: Tbm não sou expert mas minha calvice já acentuou uns 2cm trabalhando com PostgreSQL ao longo desses anos.

2

opa. obrigado pelo comentario.
sobre o postgres. a empresa ate contratou consultoria sobre isso. inclusive foi a forma de otimizar o DB pra suprir as necessidades atuais. mas como a demanda é crescente, o DB esta dando sinais de sobrecarga.
mexemos em tudo. otimizando o postgres.conf. particionando as tabelas com base nos dados, e isso é oque está segurando por enquanto (até bem aliás).
mas tem momentos que o DB sobrecarrega, coisa de alguns segundos mas deixa todos os acessos lentos, e isso que quero resolver. Fora tambem esse volume crescente de disco que ta complicado de lidar.
a naturesa das consultas é sempre analitica, agregações, contagens e geração de relatorios com base nos dados (milhoes em cada consulta), então procurei uma alternativa boa pra isso e achei o clickhouse.
Espero que essa migração dê frutos pra eu voltar aqui no tabnews pra expor hahaha.

1
2

Cara, é isso. Tem sempre que achar outras soluções em DB. Peço até perdão aos que gostam, mas eu particularmente não sou fã do Postgres. 🥲

2

gosto do PostgreSQL mas não tenho apego não kkkk é só costume mesmo.

agora um DB que tenho um apreço é o SQLite kkkk muito prático de usar em projetos rápidos.
inclusive uso em um sistema meu como DB online. kkkk
mas gosto de conhecer soluções novas, sempre tem novas formas de fazer a mesma coisa.

2

Sou fã de carteirinha do SQLite, mas infelizmente pro meu projeto não funcionaria da forma que eu preciso (eu acho). Full-text + graphql + AI, tipo um MindsDB. Aí já deixa de ser lite e vira SQMonster 🥲

1

Dúvida: Estão fazendo análise de dados nos dados histórico? Geralmente dado histórico, é armazenado para auditoria, mas se estão fazendo queries frequentes, talvez se enquadre como análise de dados e deveriam democratizar e etc. Desculpe se entendi errado.
Digo isso pois as vezes estamos combatendo o problema errado, e acho que essa plataforma que está usando é preparada pra lidar com alto volume de dados por ser uma plataforma de observabilidade.
Infelizmente não atuo com análise de dados, senão eu te orientava pra você descobrir e quem sabe estruturar melhor essa area na empresa.

1

opa, obrigado pelo comentário.

estou fazendo testes no clickhouse, mas não na versão cloud, estou usando a versão opensource em um servidor próprio.

sobre os dados, são dados de métricas pros clientes.
temos algumas dashboards no sistema que são usadas pelos clientes pra verificar o desempenho deles (marketing digital e afins)
boa parte sao gráficos com base nos dados, por isso precisamos de algo performático pra lidar com esses dados volumosos.

1

Muito boa a analise, parabéns!

Aqui na empresa utilizamos postgres para salvar todas as partidas recentes dos players que estão na nossa plataforma, a tabela que salva essas partidas já está com mais de 500gb e conforme a plataform atraí mais usuários mais rápido ela vem crescendo.
Começamos a escrever uma PoC para utilizar um TimescaleDB, mas por falta de tempo ainda não chegamos muito a fundo nos testes.

Uma dúvida, você chegou a olhar o custo de utilizar o ClickHouse?

2

opa, obrigado pelo comentário.
sobre o timescale, começamos a usar ele aqui na empresa em tabelas menores.
pra tabelas com menos de 1bi de dados ele se sai incrivelmente bem.

sobre os custos com clickhouse, estou usando a versão opensource instalada em um servidor de testes.
se todas as analises que estou fazendo se concretizarem, vai dar pra reduzir em pelo menos 50% os custos com hardware (cpu e memória). ja com disco vai ser uma economia próxima dos 90%

ate pensei em usar a versão em cloud do clickhouse, mas gosto de ter os serviços "nas minhas mãos" pra poder entender melhor hahaha.

1

Estranho esse comportamento no postgresql, chegou a rodar alguma query para ver o tamanho físico de dados ocupados por tabelas e por índices?

Eu falo isso pois algumas vezes criamos diversos índices sem uma análise correta, e ao fazer uma consulta o banco acaba nem usando o índice.

Por exemplo: se eu criar um índice em cima da data de criação e um índices em cima de categoria, e fizer uma consulta onde eu busco um range de data de criação e filtro por uma categoria específica, o postgresql usaria apenas um índice nessa busca.

Dados agregados é pior ainda, existem soluções O(log n) envolvendo segtree em banco de dados que podem reduzir mais ainda o tempo de consulta.

Eu digo isso pois o postgresql é uma ferramenta muito customizavel (já vi gente fazendo cache usando postgresql mais performatico que o redis kkk) só que é necessário muito conhecimento e prática para conseguir ajustar ele pro teu caso. O modo default do postgresql que se usa tudo padrao SQL é no modo "pau pra toda obra", mas para casos mais específicos é necessário estudos mais aprofundados.

1

opa, obrigado pelo comentário.
sobre a sua pergunta do tamanho da tabela com os índices, fiz uma analise de tamanho usando o PG hero, ele mostra os tamanhos das tabelas de dados e dos índices de forma separada, então esse tamanho é so dos dados.

nao duvido que o PostgreSQL seja muito performático, tanto que usamos timescale DB em outros DBs e ele é muito performático.

o problema em específico nesse cenario que estou testando é por conta do alto volume de dados.
fiz esse teste em um DB pequeno mas o foco é no DB grande (7tb)
comecei os testes nele hoje, o foco principal é reduzir tamanho mesmo, nisso acho o PostgreSQL meio deficitário, acaba ocupando muito espaço com dados vazios (claro, parte da culpa disso é da modelagem dos dados também).

mas ja foi investido muito tempo e dinheiro nesse DB, que no fim das contas não conseguiu entregar nem metade do desempenho e economia que estou percebendo nesse novo DB clickhouse.

mas pra dados com muitas alterações, ainda vamos usar o PostgreSQL, por se encaixar melhor nisso.

1

Os ganhos que você mostrou são muito bons, realmente um case bem bacana. A migração para um banco colunar faz todo sentido nesse cenário, mas acho que a análise da causa do problema poderia ir um pouco além.

O ponto não era só volume ou concorrência no PostgreSQL, mas sim estar usando um banco OLTP para um workload totalmente OLAP. As consultas de agregação em massa sempre vão sofrer em uma arquitetura orientada a linhas.

É verdade que o PostgreSQL é super configurável, e soluções como o TimescaleDB mostram isso com hypertables, compressão e agregações incrementais para séries temporais. Mas no fim das contas, ele continua sendo orientado a linhas, e em workloads puramente analíticos vai sempre carregar mais dados do que o necessário.

Mais do que “trocar de DB”, o grande aprendizado é entender qual categoria de banco resolve melhor cada problema, relacional, não relacional, colunar, chave-valor, grafo etc. Esse alinhamento é o que realmente traz eficiência.

A redução de armazenamento também não é mágica: bancos colunares conseguem comprimir muito melhor porque armazenam valores contíguos por coluna, o que permite técnicas como run-length encoding, dicionários e compressão delta. Já em um OLTP, tentar simular isso com índices só infla o disco e acaba virando um “colunar improvisado”.