Este guia faz parte de uma coleção de aprendizados obtidos em encontros da comunidade. Para ver mais soluções e insights práticos, você pode navegar por problema específico. Sofrendo com altos custos operacionais? Confira o guia de insights da comunidade sobre Otimização de Custos.
Tabelas de sistema essenciais
Estas tabelas de sistema são fundamentais para a depuração de problemas em produção:
system.errors
Exibe todos os erros ativos na sua instância do ClickHouse.
SELECT name, value, changed
FROM system.errors
WHERE value > 0
ORDER BY value DESC;system.replicas
Contém informações sobre atraso de replicação e status para monitorar a integridade do cluster.
SELECT database, table, replica_name, absolute_delay, queue_size, inserts_in_queue
FROM system.replicas
WHERE absolute_delay > 60
ORDER BY absolute_delay DESC;system.replication_queue
Fornece informações detalhadas para ajudar a diagnosticar problemas de replicação.
SELECT database, table, replica_name, position, type, create_time, last_exception
FROM system.replication_queue
WHERE last_exception != ''
ORDER BY create_time DESC;system.merges
Mostra as operações de merge em andamento e pode ajudar a identificar processos travados.
SELECT database, table, elapsed, progress, is_mutation, total_size_bytes_compressed
FROM system.merges
ORDER BY elapsed DESC;system.parts
Essencial para monitorar a quantidade de partes e identificar problemas de fragmentação.
SELECT database, table, count() as part_count
FROM system.parts
WHERE active = 1
GROUP BY database, table
ORDER BY count() DESC;Problemas comuns em ambientes de produção
Problemas de espaço em disco
O esgotamento do espaço em disco em configurações replicadas gera problemas em cascata. Quando um nó fica sem espaço, os outros nós continuam tentando se sincronizar com ele, causando picos no tráfego de rede e sintomas confusos. Um membro da comunidade passou 4 horas depurando um problema que, na verdade, era apenas falta de espaço em disco. Confira esta consulta para monitorar o armazenamento em disco em um cluster específico.
Se você estiver usando AWS, saiba que os volumes EBS de uso geral padrão têm um limite de 16 TB.
Erro "Too many partes"
Inserções pequenas e frequentes causam problemas de desempenho. A comunidade identificou que taxas de inserção acima de 10 por segundo frequentemente acionam erros "too many partes", porque o ClickHouse não consegue mesclar as partes com rapidez suficiente.
Soluções:
- Agrupe os dados em lotes usando limites de 30 segundos ou 200 MB
- Ative
async_insertpara agrupamento automático em lotes - Use tabelas de buffer para agrupamento em lotes no lado do servidor
- Configure o Kafka para tamanhos de lote controlados
Recomendação oficial: no mínimo 1.000 linhas por inserção, idealmente entre 10.000 e 100.000.
Problemas com timestamps inválidos
Aplicações que enviam dados com timestamps arbitrários geram problemas de partição. Isso resulta em partições com dados de datas irreais (como 1998 ou 2050), causando comportamento inesperado no armazenamento.
Riscos da operação ALTER
Operações ALTER grandes em tabelas com vários terabytes podem consumir muitos recursos e até bloquear bancos de dados. Em um exemplo da comunidade, a mudança de um Integer para um Float em 14 TB de dados bloqueou todo o banco de dados e exigiu a reconstrução a partir de backups.
Monitore mutações custosas:
SELECT database, table, mutation_id, command, parts_to_do, is_done
FROM system.mutations
WHERE is_done = 0;Teste primeiro as alterações de schema em conjuntos de dados menores.
Memória e desempenho
Agregação externa
Ative a agregação externa para operações com uso intensivo de memória. Ela é mais lenta, mas evita falhas por falta de memória ao gravar dados em disco. Você pode fazer isso usando max_bytes_before_external_group_by, o que ajuda a evitar falhas por falta de memória em operações GROUP BY de grande volume. Saiba mais sobre essa configuração aqui.
SELECT
column1,
column2,
COUNT(*) as count,
SUM(value) as total
FROM large_table
GROUP BY column1, column2
SETTINGS max_bytes_before_external_group_by = 1000000000; -- 1GB thresholdDetalhes do async insert
O async insert agrupa automaticamente pequenos inserts no servidor para melhorar o desempenho. Você pode configurar se deve esperar que os dados sejam gravados em disco antes de retornar a confirmação — o retorno imediato é mais rápido, mas menos durável. Versões mais recentes oferecem suporte à desduplicação para lidar com dados duplicados nos lotes.
Documentação relacionada
Configuração de tabela distribuída
Por padrão, tabelas distribuídas usam inserções em thread única. Habilite insert_distributed_sync para processamento paralelo e envio imediato de dados para os shards.
Monitore o acúmulo temporário de dados ao usar tabelas distribuídas.
Limiares de monitoramento de desempenho
Limiares de monitoramento recomendados pela comunidade:
- Partes por partição: de preferência, menos de 100
- Inserções atrasadas: devem se manter em zero
- Taxa de inserção: limite a cerca de 1 por segundo para um desempenho ideal
Documentação relacionada
Referência rápida
| Problema | Detecção | Solução |
|---|---|---|
| Espaço em disco | Verifique o total de bytes em system.parts |
Monitore o uso e planeje a escalabilidade |
| Muitas partes | Conte as partes por tabela | Agrupe inserções em lote e habilite async_insert |
| Atraso de replicação | Verifique o atraso em system.replicas |
Monitore a rede e reinicie as réplicas |
| Dados inválidos | Valide as datas da partição | Implemente a validação de timestamp |
| Mutações travadas | Verifique o status em system.mutations |
Teste primeiro com poucos dados |