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

Reduzi um DB de 8TB para 218 GB! como? ClickHouse!

Saudações novamente a todos!

Continuando com a saga que iniciei há 3 dias aqui: Reduzi um DB de 52GB para 4.5GB!...

Estou estudando o DB ClickHouse (versão self-hosted open source) e estou IMPRESSIONADO com a capacidade de compressão desse DB!

Dessa vez, fiz um teste no maior DB que tenho disponível em produção:
DB PostgreSQL, com um total de 8,12 TB de tamanho e 44,9 bilhões de linhas!
49k partições.

Esse mesmo DB, migrado para ClickHouse, resultou em 218 GB!
Uma redução de aproximadamente 38 vezes! (Muito acima dos 10x prometidos pelo ClickHouse Cloud).
Cada linha ocupa apenas 5,1 Bytes!
uma linha com 5 colunas, sendo 1 ID string, 1 id int, 1 valor referência int, 1 ENUM pra status e a ultima de timestamp DateTime.

tudo isso ocupando 5,1 bytes, em comparação, a palavra "bytes" ocupa 5 bytes no padrão ASCII

Explicando melhor a natureza desses dados e o propósito deles

Na empresa em que trabalho atualmente, temos um sistema de métricas e histórico de eventos. Essas métricas são exibidas em dashboards e geram relatórios para os clientes.

Com o aumento constante de clientes, o volume de dados começou a subir exponencialmente, e tudo vai para esse DB PostgreSQL.
Em minhas estimativas, estamos lidando com uma média de 500-700 milhões/dia de dados sendo gerados e salvos no DB.
Com isso, o desempenho das consultas vem se degradando e o DB começa a se tornar um mamute enorme!
Detalhe: armazenamos esses dados por apenas 90 dias!

Mas por que migrar para ClickHouse?

  • Capacidade de TTL nas tabelas (o próprio DB controla a validade dos dados e os deleta no fim do prazo). Isso estava se tornando um problema crescente no atual DB postgreSQL, pois mesmo com um script deletando os dados antigos 24h por dia, o DB não para de crescer, apenas retardou um pouco a velocidade do crescimento (mesmo fazendo vacuum)
  • Redução absurda no tamanho do DB (38x menor!), maior beneficio a meu ver.
  • Consultas analíticas são incrivelmente rápidas (relatório que levava 1 min agora leva, em média, 200 ms)
  • Esse DB consegue aproveitar melhor o hardware do servidor (um servidor de 8 vCPUs e 12 GB de RAM entrega desempenho similar ao servidor PostgreSQL, que tem 16 vCPUs e 90 GB de RAM)
  • Facilidade de gerar dados analíticos sobre o DB, como contagem total de linhas, disco usado por cada coluna, quais clientes têm mais dados, entre outras tantas possibilidades de análise técnica
  • Possibilidade de criar replicas de escrita, assim podendo escalonar horizontalmente o DB.

Próximo passo: testar em uso real para mensurar melhor o desempenho desse DB em produção.

Não consigo compartilhar mais dados a respeito dessa migração por motivos óbvios (dados sigilosos e regras de negócio), mas estou realmente empolgado depois de descobrir esse DB mágico kkkkk

Irei postar novidades caso eu encontre dificuldades ou problemas durante esse processo.

Carregando publicação patrocinada...
6

Já trabalho com o ClickHouse em aulas há mais de dois anos e continuo impressionado com o quanto ele entrega em cenários de alta volumetria. Uma das coisas que sempre destaco é que o ClickHouse não é “um único motor de armazenamento”, mas sim um conjunto de engines, cada uma adequada a um caso de uso diferente. Saber escolher a engine certa é o que garante eficiência e economia.

Alguns exemplos:

MergeTree e variações (ReplacingMergeTree, SummingMergeTree, AggregatingMergeTree, etc.)
Base para a maioria das tabelas. São otimizadas para grandes volumes, permitem compressão, partição e TTL. Cada variação resolve um problema específico, como deduplicar linhas, somar valores já no armazenamento ou manter agregados.

Log e TinyLog
Simples, rápidas para inserções, mas sem suporte a índices ou partições. Úteis em testes ou tabelas temporárias.

Memory
Mantém todos os dados em RAM. Ideal para cálculos transitórios, benchmarks ou tabelas de sessão.

Distributed
Permite criar uma visão única sobre dados espalhados em múltiplos shards. Fundamental quando se escala horizontalmente.

File e URL engines
Leitura direta de arquivos (CSV, Parquet, JSON) ou de dados vindos via HTTP. Muito usadas em integrações rápidas.

View e Materialized View
Permitem abstrações e pré-processamento no momento do insert. Esse último é especialmente útil para criar pipelines de agregação sem pesar na aplicação.

Esse ecossistema de engines é um dos pontos que tornam o ClickHouse tão flexível. É possível modelar a mesma informação de formas diferentes, dependendo se o foco é compressão, agregação ou velocidade de leitura.

1

UAU. lendo seu comentario me interessei mais ainda sobre esse DB. me parece algo muito incrivel e pouco divulgado hahaha.

gostei bastante de seus exemplos, nao tinha conhecimento dessas diferenças.

em especifico sobre como deduplicar linhas. poderia me explicar como fazer isso? seria bastante util no meu cenario atual, já que os inserts volumosos sempre apresentam dados duplicados e acabo tendo que remover essas duplicações na aplicação pra nao quebrar as contagens

1
0
1

tentei estudar sobre duckdb, mas nao pareceu que iria me atender.
pelo oque eu entendi, o duck DB não chega a ser um DB (me corrija se eu estiver errado), me pareceu ser uma ferramenta de análises de grandes dados.
e oque eu estou precisando é de um DB de fato que substitua o PostgreSQL.

sobre o chdb, tentei pesquisar aqui agora mas nao entendi do que se trata.

1

Quais seriam as outras opções,os rivais/concorrentes equivalentes ao Click House em Nuvem?

GPT me disse:

🔹 Concorrentes diretos (Cloud Data Warehouses)
Amazon Redshift (AWS)

Um dos pioneiros.

Altamente integrado ao ecossistema AWS.

Bom para BI e relatórios empresariais.

Preço baseado em armazenamento + processamento.

Google BigQuery (GCP)

Serverless (não precisa administrar cluster).

Cobrança por query (bytes processados).

Muito forte em análises rápidas sobre datasets enormes.

Snowflake

Multicloud (AWS, Azure, GCP).

Separa storage de compute, escalando de forma independente.

Bastante usado em empresas que precisam de governança de dados e compartilhamento seguro.

Azure Synapse Analytics (Microsoft)

Integrado ao Azure Data Lake, Power BI e todo o ecossistema Microsoft.

Ideal para empresas já no stack Azure.

1
1

eu acredito que uns 30%
porque esse DB PostgreSQL foi recriado tem menos de 1 mes.
o DB anterior, também PostgreSQL, tinha 5tb mas tinha um esquema diferente, recriamos o DB e modificamos o particionamento dele pra melhorar as consultas e com isso ele saltou pra 7tb,

então imagino que só de dados seja 4-5tb em media, o restante são indices e um pouco de bloat.
mas o bloat nesse DB ate um tempo atrás era minino, pois os dados nele nao sofrem alterações, são apenas inserts e depois selects, recentemente que os deletes começaram a a ser feitos constantemente, então o bloat pode ter aumentado (mas continuo fazendo vacuum constante dele quando dá)

1

Eu fico pensando agora num duelo de 8tb do Postgres num DuckDB x ClickHouse. Vai ser lindo. 🥹
Coloquei um teste de 2gb de dados em JSON e CSV no DuckDB e o treco não chegou a 50mb de uso de RAM. Eu tava quase chorando. 🤣

1

seria interessante mesmo. mas poderia me explicar melhor sobre o duck DB? ate vi algumas comparações dele com o clickhouse, mas o duck DB me pareceu um SQLite colunar, então nao sei se atenderia a demanda nesse meu caso.

1

To usando o DuckDB pra analises da área juridica. Como eu tenho acesso a anos de dados, preciso fazer essa análise de forma rápida, e o DuckDB conseguiu fazer o banco de dados .duckdb permanente de pouco mais de 2gb (em testes) me custando apenas 50mb de ram e 0% de CPU (vps de 4vcpu e 16gb ram). No caso, to usando ele como banco de dados permanente também, então todo o banco puro vai pra ele. No Postgres, antes da conversão pro DuckDB, tava chegando a 10gb e consumindo 18~22% de cpu com 3gb ram. A diferença foi bem grande.

To pensando em como usar o clickhouse nesse caso.

2

entendi, nesse caso o duckdb seria pra vc analisar localmente esses dados ne?
ai nao me atenderia, pois preciso de um DB online em um servidor pra que as APIs consumam esses dados pra exibir em dashboards de clientes.
imagino que possa ser o mesmo pra ti. pegar os dados ja comprimidos pelo duckdb e lançar no clickhouse pra poder usar via sistema ou algo do gênero

2
1

Quando comecei a ler, tinha a certeza de que uma das conclusões seria a perda de desempenho.

Eu fiquei surpreso ao ver que as consultas analíticas ficaram mais rápidas, me pergunto como isso é possível 🤔.

Fora outras ótimas questões, como melhor uso dos recursos computacionais e essa redução ABSURDA de ~8TB para ~220GB, isso é realmente fenomenal.

Fiquei curioso - Quais seriam os pontos fracos até então?

2

hahaha, realmente esperava uma queda nas consultas.
e de fato inicialmente teve.

tanto que o meu primeiro teste com um DB menor (57gb) as consultas gerais ficaram em media 2x mais lentas do que em comparação com o timescale DB.
mas porque?
estudando mais a fundo, descobri que o clickhouse começa a brilhar em uma grande massa de dados, e o primeiro DB que eu testei era relativamente pequeno, então o PostgreSQL ainda estava dando conta com todos os indices e cache que ele gera (apesar de ocupar 97% mais disco).
porem, a realidade mudou nesse DB de 8tb, justamente porque nele ja temos 44bi de dados, nisso o PostgreSQL já estava dando sinais de sobrecarga e o clickhouse tirando de letra.

isso sem contar a redução de disco nos dois casos.

mas algo que ajudou bastante a velocidade nas consultas: views materializadas + tabelas de agregação.

isso tornou as consultas que ja eram rápidas, quase instantâneas.

e, pra nao dizer que ficou uma comparação injusta, eu tentei semanas atrás criar esse mesmo arranjo no PostgreSQL, mas ficou inviável, a materialização das views estava consumindo quase a CPU toda, coisa que no clickhouse é mínimo.

sobre como é possível que as consultas ficaram rápidas: o clickhouse é focado nisso, tanto que, ao criar a tabela, vc ja define um "order by" de acordo com a natureza das consultas, e isso acelera absurdamente elas.

como o sistema que trabalho sempre procura na mesma ordem de dados, foi um salto incrível de velocidade.

0
1

Cara, ate o momento, só identifiquei detalhes mínimos, como ter que refazer as consultas pra tirar máximo proveito do clickhouse e de como ele opera.

atualmente a API que fornece os dados do DB esta adaptada pra puxar linhas brutas, mas como o clickhouse se dá melhor com contagens, somas e agrupamentos de dados, estou precisando mudar algumas funções pra já esperar isso direto do DB. antes essas agregações eram feitas na aplicação (por conta de desempenho mesmo), mas agora vão ser feitas no DB (que é até o ideal de ser feito)

outra coisa que precisei fazer pra adaptar o clickhouse pra demanda do sistema:
criar Views materializdas que compilam os dados no momento do insert e adicionam em outras tabelas.

ja havia tentado fazer isso com timescale DB (plugin do PostgreSQL pra séries temporais) mas não tinha ficado bom e tava puxando demais das CPUs por conta do alto volume de inserts.
já no clickhouse isso não gerou quase nada de carga extra nos inserts.
fiz inserts de 1-2M de uma vez e o DB deu conta tranquilamente.

1

Dada a arquitetura do banco, ele não performa bem em deletes ou updates. Também performa pior que o postgres em escritas ou leituras de linhas individuais, por exemplo. O foco do clickhouse é análise e alto volume de dados, OLAP. Para outros casos, OLTP, melhor um banco tradicional

0
1

opa, ainda nao, seria o mesmo propósito? segui pro clickhouse por conta de um post no blog do posthog em relação a essa migração.

1

Eu uso o postgres com timescale, testei o Questdb e gostei, ainda não consegui testar em produção. Ele é muito fácil para testar, pois pode usar a mesma conexão do PG. Só pedi por curiosidade mesmo.

1
1
1

ahh sim, entendi. vi isso no clickhouse também, tem essa compatibilidade com MySQL e PostgreSQL. muito interessante. vou dar uma olhada e fazer alguma comparação