Comparando Exclusão de Tópicos Kafka vs. Comandos de Política de Retenção
Compare a exclusão de tópicos Kafka com as configurações de retenção, incluindo comandos seguros para remover tópicos ou eliminar dados antigos automaticamente.
Comparando Exclusão de Tópicos Kafka vs. Comandos de Política de Retenção
A remoção de dados no Kafka ocorre de duas formas muito diferentes: excluir um tópico inteiro ou permitir que a retenção remova segmentos de log antigos de um tópico ativo. Gerenciar tópicos Kafka de forma eficaz é crucial para manter a saúde do sistema, otimizar o armazenamento e garantir a integridade dos dados. Isso envolve não apenas criar e monitorar tópicos, mas também entender como remover dados que não são mais necessários de forma graciosa. Existem dois mecanismos principais para remoção de dados: exclusão imediata de tópicos e políticas de retenção baseadas em tempo. Embora ambos resultem na remoção de dados, suas diferenças funcionais, casos de uso e implicações variam significativamente.
Use a exclusão de tópicos quando o próprio tópico deve desaparecer. Use as configurações de retenção quando o tópico deve permanecer, mas os dados antigos devem ser eliminados automaticamente.
Entendendo a Exclusão de Tópicos Kafka (kafka-topics.sh --delete)
A exclusão de tópicos no Kafka é uma ação direta e imediata, destinada a remover completamente um tópico, incluindo todas as suas partições, dados e metadados, do cluster Kafka. Isso é tipicamente usado quando um tópico está obsoleto, foi criado por engano ou não serve mais a nenhum propósito em seu sistema.
Como Funciona a Exclusão de Tópicos
Quando você executa um comando de exclusão de tópico, o Kafka marca o tópico para exclusão. O processo de exclusão real envolve várias etapas:
- Marcação para Exclusão: Os metadados do tópico no ZooKeeper (ou no quorum Raft do Kafka para clusters KRaft) são atualizados para marcá-lo para exclusão.
- Ação do Controlador: O controlador Kafka (um broker com uma função especial) orquestra a exclusão. Ele instrui outros brokers a parar de produzir ou consumir das partições do tópico marcado.
- Limpeza do Diretório de Log: Cada broker que hospeda partições para o tópico excluído eventualmente removerá os segmentos de log associados e arquivos de índice de seu disco. Essa limpeza é assíncrona e depende da coordenação entre broker/controlador e da limpeza do sistema de arquivos nos brokers que hospedaram as partições.
Habilitando a Exclusão de Tópicos
Antes de excluir tópicos, a exclusão de tópicos deve ser explicitamente habilitada em todos os brokers Kafka. Esta é uma medida de segurança crítica para evitar perda acidental de dados.
Para habilitar a exclusão de tópicos, defina a seguinte propriedade no arquivo server.properties de cada broker Kafka:
delete.topic.enable=true
Após modificar o server.properties, reinicie seus brokers Kafka para que a alteração entre em vigor.
Exemplo Prático: Excluindo um Tópico
Para excluir um tópico chamado meu-topico-obsoleto:
kafka-topics.sh --bootstrap-server localhost:9092 --delete --topic meu-topico-obsoleto
Exemplo de Saída:
Excluindo tópico meu-topico-obsoleto.
Você pode verificar se o tópico está marcado para exclusão listando os tópicos:
kafka-topics.sh --bootstrap-server localhost:9092 --list
Se bem-sucedido, meu-topico-obsoleto pode inicialmente ainda aparecer na lista (marcado para exclusão), mas deve desaparecer completamente após o processo de limpeza ser concluído em todos os brokers.
Aviso: Excluir um tópico é uma operação destrutiva e irreversível. Uma vez excluído, os dados desaparecem. Sempre tenha extrema cautela e garanta que você tenha backups ou tenha certeza de que os dados não são mais necessários.
Configurando Políticas de Retenção de Tópicos Kafka
As políticas de retenção do Kafka oferecem uma maneira mais granular e automática de gerenciar o ciclo de vida dos dados, definindo por quanto tempo as mensagens devem ser mantidas em um tópico ou quanto espaço elas devem ocupar. Isso é ideal para tópicos que armazenam fluxos contínuos de eventos, logs ou métricas, onde dados mais antigos perdem naturalmente sua relevância ao longo do tempo.
Como Funcionam as Políticas de Retenção
Os brokers Kafka executam continuamente um processo de limpeza de log que verifica periodicamente os segmentos do tópico em busca de dados que excederam os limites de retenção definidos. Existem duas configurações principais de retenção:
retention.ms(Retenção Baseada em Tempo): Esta configuração especifica o tempo máximo (em milissegundos) que o Kafka reterá um segmento de log antes que ele seja elegível para exclusão. Por exemplo, seretention.msestiver definido como 604800000 (7 dias), todas as mensagens com mais de 7 dias serão removidas.retention.bytes(Retenção Baseada em Tamanho): Esta configuração especifica o tamanho máximo (em bytes) que as partições de um tópico podem crescer em disco antes que segmentos de log mais antigos sejam excluídos para liberar espaço. Seretention.bytesfor atingido, o Kafka excluirá os segmentos mais antigos até que o tamanho do tópico esteja dentro do limite, independentemente deretention.ms.
Se ambos retention.ms e retention.bytes estiverem configurados, a política que for acionada primeiro terá precedência. Por exemplo, se os dados atingirem seu limite de tempo antes do limite de tamanho, eles serão excluídos por retention.ms. Se o limite de tamanho for atingido antes do limite de tempo, retention.bytes acionará a exclusão.
Nota: Um valor de
retention.msigual a-1indica retenção infinita (os dados nunca são excluídos por tempo).
Exemplo Prático: Criando um Tópico com Retenção
Para criar um tópico meu-fluxo-de-eventos com um período de retenção de 24 horas (86.400.000 milissegundos):
kafka-topics.sh --bootstrap-server localhost:9092 \
--create \
--topic meu-fluxo-de-eventos \
--partitions 3 \
--replication-factor 1 \
--config retention.ms=86400000
Exemplo Prático: Alterando a Retenção de um Tópico Existente
Para alterar a retenção de um tópico existente meu-topico-de-log para 7 dias (604.800.000 milissegundos) e adicionar um limite de tamanho de 1 GB (1.073.741.824 bytes):
kafka-configs.sh --bootstrap-server localhost:9092 \
--entity-type topics \
--entity-name meu-topico-de-log \
--alter \
--add-config retention.ms=604800000,retention.bytes=1073741824
Para remover uma configuração de retenção específica (por exemplo, para reverter ao padrão do broker para retention.bytes):
kafka-configs.sh --bootstrap-server localhost:9092 \
--entity-type topics \
--entity-name meu-topico-de-log \
--alter \
--delete-config retention.bytes
Visualizando Configurações de Tópicos
Você pode inspecionar a configuração atual de um tópico, incluindo suas configurações de retenção:
kafka-configs.sh --bootstrap-server localhost:9092 \
--entity-type topics \
--entity-name meu-fluxo-de-eventos \
--describe
Principais Diferenças e Casos de Uso
| Característica | Exclusão de Tópico (--delete) |
Política de Retenção (retention.ms/retention.bytes) |
|---|---|---|
| Tipo de Ação | Manual, imediata, irreversível | Automática, contínua, configurável |
| Escopo | Remove o tópico inteiro (todos os dados e metadados) | Remove segmentos de dados antigos dentro de um tópico ativo |
| Propósito | Eliminar tópicos obsoletos, corrigir erros | Gerenciar o ciclo de vida dos dados para tópicos ativos, controlar o uso de armazenamento |
| Risco de Perda de Dados | Alto (todos os dados perdidos instantaneamente) | Controlado (apenas dados que excedem a política são removidos) |
| Configuração | delete.topic.enable no nível do broker, depois execução do comando |
Configurações no nível do tópico (--config ou --alter) |
| Reversibilidade | Não | Pode ser alterada ou desabilitada para dados futuros, mas remoções passadas são permanentes |
Quando Usar a Exclusão de Tópicos
- Tópicos Obsoletos: Quando um projeto ou serviço é desativado e seus tópicos Kafka associados não são mais necessários.
- Limpeza de Desenvolvimento/Teste: Limpeza de tópicos temporários criados durante ciclos de desenvolvimento ou teste.
- Correção de Erros: Se um tópico foi criado com configurações incorretas (por exemplo, muitas partições, fator de replicação errado) e é mais fácil recriá-lo do zero.
Quando Usar Políticas de Retenção
- Dados de Log/Monitoramento: Para tópicos que coletam logs de aplicativos, métricas ou eventos de auditoria, onde dados mais antigos eventualmente perdem valor.
- Fluxos de Eventos: Em arquiteturas orientadas a eventos, onde os eventos precisam estar acessíveis por um determinado período para reprodução ou sincronização do consumidor, mas não indefinidamente.
- Gerenciamento de Recursos: Para evitar que os tópicos consumam espaço em disco excessivo nos brokers Kafka, garantindo a estabilidade do cluster e a eficiência de custos.
- Conformidade: Para aderir a regulamentações de retenção de dados que determinam que os dados sejam excluídos após um período específico.
Melhores Práticas e Considerações
- Habilite
delete.topic.enable=truecom Cautela: Embora necessário para exclusão, esteja atento a quem tem acesso para realizar operações de exclusão em um ambiente de produção. - Automatize a Retenção: Para a maioria dos tópicos ativos, estabeleça políticas de retenção sensatas desde o início para evitar problemas inesperados de espaço em disco.
- Monitore o Uso do Disco: Monitore regularmente o uso do disco dos brokers Kafka. Se os tópicos estiverem crescendo inesperadamente, revise suas políticas de retenção ou investigue o comportamento do produtor.
- Teste Exclusão/Retenção: Em ambientes não produtivos, simule exclusões de tópicos e observe como as políticas de retenção se comportam para entender completamente seu impacto.
- Faça Backup de Dados Críticos: Para tópicos que contêm dados de missão crítica ou de arquivamento de longo prazo, considere soluções de arquivamento externas (por exemplo, S3, HDFS) em vez de depender apenas da retenção infinita do Kafka, ou garanta que seu
retention.msesteja definido como-1eretention.bytesseja suficientemente grande ou-1. - Tópicos Compactados: Para tópicos com compactação de log habilitada (
cleanup.policy=compact),retention.msainda se aplica para excluir segmentos antigos (não mensagens individuais) que foram compactados, emin.cleanable.dirty.ratiocontrola quando a compactação é executada. Este é um mecanismo separado da retenção padrão e é usado para tópicos onde o valor mais recente para uma determinada chave é importante (por exemplo, logs de alteração de banco de dados, perfis de usuário).
Conclusão
Exclua um tópico Kafka apenas quando produtores, consumidores e dependências downstream não precisarem mais dele. Para tópicos ativos, defina retention.ms e retention.bytes deliberadamente e monitore o uso do disco do broker para que os dados antigos expirem antes que a pressão de armazenamento se torne um incidente.