Comparación entre la eliminación de temas de Kafka y los comandos de política de retención

Compara la eliminación de temas de Kafka con la configuración de retención, incluyendo comandos seguros para eliminar temas o eliminar datos antiguos.

Comparación entre la eliminación de temas de Kafka y los comandos de política de retención

La eliminación de datos en Kafka se presenta en dos formas muy diferentes: eliminar un tema completo o permitir que la retención elimine segmentos de registro antiguos de un tema activo. Gestionar los temas de Kafka de manera efectiva es crucial para mantener la salud del sistema, optimizar el almacenamiento y garantizar la integridad de los datos. Esto implica no solo crear y monitorear temas, sino también comprender cómo eliminar de manera gradual los datos que ya no son necesarios. Existen dos mecanismos principales para la eliminación de datos: la eliminación inmediata de temas y las políticas de retención basadas en el tiempo. Aunque ambos conducen en última instancia a la eliminación de datos, sus diferencias funcionales, casos de uso e implicaciones varían significativamente.

Utilice la eliminación de temas cuando el tema en sí deba desaparecer. Utilice la configuración de retención cuando el tema deba permanecer pero los datos antiguos deban eliminarse automáticamente.

Comprender la eliminación de temas de Kafka (kafka-topics.sh --delete)

La eliminación de temas en Kafka es una acción directa e inmediata destinada a eliminar por completo un tema, incluidas todas sus particiones, datos y metadatos, del clúster de Kafka. Esto se utiliza típicamente cuando un tema está obsoleto, se creó por error o ya no cumple ningún propósito dentro de su sistema.

Cómo funciona la eliminación de temas

Cuando ejecuta un comando de eliminación de temas, Kafka marca el tema para su eliminación. El proceso de eliminación real implica varios pasos:

  1. Marcado para eliminación: Los metadatos del tema en ZooKeeper (o el quórum de Raft de Kafka para clústeres KRaft) se actualizan para marcarlo para su eliminación.
  2. Acción del controlador: El controlador de Kafka (un broker con un rol especial) orquesta la eliminación. Indica a otros brokers que dejen de producir o consumir de las particiones del tema marcado.
  3. Limpieza del directorio de registros: Cada broker que aloja particiones para el tema eliminado eventualmente eliminará los segmentos de registro asociados y los archivos de índice de su disco. Esta limpieza es asíncrona y depende de la coordinación entre el broker y el controlador, así como de la limpieza del sistema de archivos en los brokers que alojaron las particiones.

Habilitar la eliminación de temas

Antes de poder eliminar temas, la eliminación de temas debe estar explícitamente habilitada en todos los brokers de Kafka. Esta es una medida de seguridad crítica para evitar la pérdida accidental de datos.

Para habilitar la eliminación de temas, establezca la siguiente propiedad en su archivo server.properties en cada broker de Kafka:

delete.topic.enable=true

Después de modificar server.properties, reinicie sus brokers de Kafka para que el cambio surta efecto.

Ejemplo práctico: Eliminar un tema

Para eliminar un tema llamado my-obsolete-topic:

kafka-topics.sh --bootstrap-server localhost:9092 --delete --topic my-obsolete-topic

Ejemplo de salida:

Deleting topic my-obsolete-topic.

Puede verificar que el tema está marcado para eliminación listando los temas:

kafka-topics.sh --bootstrap-server localhost:9092 --list

Si tiene éxito, my-obsolete-topic podría inicialmente seguir apareciendo en la lista (marcado para eliminación) pero debería desaparecer por completo después de que el proceso de limpieza se complete en todos los brokers.

Advertencia: Eliminar un tema es una operación destructiva e irreversible. Una vez eliminado, los datos desaparecen. Siempre tenga extrema precaución y asegúrese de tener copias de seguridad o estar seguro de que los datos ya no son necesarios.

Configuración de políticas de retención de temas de Kafka

Las políticas de retención de Kafka ofrecen una forma más granular y automática de gestionar el ciclo de vida de los datos, definiendo cuánto tiempo deben conservarse los mensajes en un tema o cuánto espacio deben ocupar. Esto es ideal para temas que almacenan flujos continuos de eventos, registros o métricas, donde los datos más antiguos pierden naturalmente su relevancia con el tiempo.

Cómo funcionan las políticas de retención

Los brokers de Kafka ejecutan continuamente un proceso de limpieza de registros que verifica periódicamente los segmentos de los temas en busca de datos que hayan superado los límites de retención definidos. Hay dos configuraciones de retención principales:

  1. retention.ms (Retención basada en tiempo): Esta configuración especifica el tiempo máximo (en milisegundos) que Kafka conservará un segmento de registro antes de que sea elegible para su eliminación. Por ejemplo, si retention.ms se establece en 604800000 (7 días), cualquier mensaje con más de 7 días será eliminado.

  2. retention.bytes (Retención basada en tamaño): Esta configuración especifica el tamaño máximo (en bytes) que las particiones de un tema pueden crecer en disco antes de que los segmentos de registro más antiguos se eliminen para liberar espacio. Si se alcanza retention.bytes, Kafka eliminará los segmentos más antiguos hasta que el tamaño del tema esté dentro del límite, independientemente de retention.ms.

Si se configuran tanto retention.ms como retention.bytes, la política que se active primero tendrá prioridad. Por ejemplo, si los datos alcanzan su límite de tiempo antes que el límite de tamaño, serán eliminados por retention.ms. Si el límite de tamaño se alcanza antes que el límite de tiempo, retention.bytes activará la eliminación.

Nota: Un valor de retention.ms de -1 indica retención infinita (los datos nunca se eliminan por tiempo).

Ejemplo práctico: Crear un tema con retención

Para crear un tema my-event-stream con un período de retención de 24 horas (86,400,000 milisegundos):

kafka-topics.sh --bootstrap-server localhost:9092 \
                --create \
                --topic my-event-stream \
                --partitions 3 \
                --replication-factor 1 \
                --config retention.ms=86400000

Ejemplo práctico: Modificar la retención de un tema existente

Para cambiar la retención de un tema existente my-log-topic a 7 días (604,800,000 milisegundos) y agregar un límite de tamaño de 1 GB (1,073,741,824 bytes):

kafka-configs.sh --bootstrap-server localhost:9092 \
                 --entity-type topics \
                 --entity-name my-log-topic \
                 --alter \
                 --add-config retention.ms=604800000,retention.bytes=1073741824

Para eliminar una configuración de retención específica (por ejemplo, para volver al valor predeterminado del broker para retention.bytes):

kafka-configs.sh --bootstrap-server localhost:9092 \
                 --entity-type topics \
                 --entity-name my-log-topic \
                 --alter \
                 --delete-config retention.bytes

Ver configuraciones de temas

Puede inspeccionar la configuración actual de un tema, incluida su configuración de retención:

kafka-configs.sh --bootstrap-server localhost:9092 \
                 --entity-type topics \
                 --entity-name my-event-stream \
                 --describe

Diferencias clave y casos de uso

Característica Eliminación de temas (--delete) Política de retención (retention.ms/retention.bytes)
Tipo de acción Manual, inmediata, irreversible Automática, continua, configurable
Alcance Elimina todo el tema (todos los datos y metadatos) Elimina segmentos de datos antiguos dentro de un tema activo
Propósito Eliminar temas obsoletos, corregir errores Gestionar el ciclo de vida de los datos para temas activos, controlar el uso del almacenamiento
Riesgo de pérdida de datos Alto (todos los datos se pierden instantáneamente) Controlado (solo se eliminan los datos que exceden la política)
Configuración delete.topic.enable a nivel de broker, luego ejecución del comando Configuraciones a nivel de tema (--config o --alter)
Reversibilidad No Se puede modificar o deshabilitar para datos futuros, pero las eliminaciones pasadas son permanentes

Cuándo usar la eliminación de temas

  • Temas obsoletos: Cuando un proyecto o servicio se da de baja y sus temas de Kafka asociados ya no son necesarios.
  • Limpieza de desarrollo/pruebas: Limpiar temas temporales creados durante ciclos de desarrollo o pruebas.
  • Corrección de errores: Si un tema se creó con configuraciones incorrectas (por ejemplo, demasiadas particiones, factor de replicación incorrecto) y es más fácil recrearlo desde cero.

Cuándo usar políticas de retención

  • Datos de registro/monitoreo: Para temas que recopilan registros de aplicaciones, métricas o eventos de auditoría donde los datos más antiguos eventualmente pierden valor.
  • Flujos de eventos: En arquitecturas basadas en eventos donde los eventos deben ser accesibles durante un cierto período para reproducción o sincronización de consumidores, pero no indefinidamente.
  • Gestión de recursos: Para evitar que los temas consuman espacio en disco excesivo en los brokers de Kafka, garantizando la estabilidad del clúster y la eficiencia de costos.
  • Cumplimiento normativo: Para cumplir con regulaciones de retención de datos que exigen que los datos se eliminen después de un período específico.

Mejores prácticas y consideraciones

  • Habilitar delete.topic.enable=true con precaución: Aunque es necesario para la eliminación, tenga en cuenta quién tiene acceso para realizar operaciones de eliminación en un entorno de producción.
  • Automatizar la retención: Para la mayoría de los temas activos, establezca políticas de retención sensatas desde el principio para evitar problemas inesperados de espacio en disco.
  • Monitorear el uso del disco: Monitoree regularmente el uso del disco de los brokers de Kafka. Si los temas crecen inesperadamente, revise sus políticas de retención o investigue el comportamiento de los productores.
  • Probar eliminación/retención: En entornos que no sean de producción, simule eliminaciones de temas y observe cómo se comportan las políticas de retención para comprender completamente su impacto.
  • Respaldar datos críticos: Para temas que contienen datos críticos para la misión o de archivo a largo plazo, considere soluciones de archivo externas (por ejemplo, S3, HDFS) en lugar de depender únicamente de la retención infinita de Kafka, o asegúrese de que su retention.ms esté configurado en -1 y retention.bytes sea suficientemente grande o -1.
  • Temas compactados: Para temas con compactación de registros habilitada (cleanup.policy=compact), retention.ms aún se aplica para eliminar segmentos antiguos (no mensajes individuales) que han sido compactados, y min.cleanable.dirty.ratio controla cuándo se ejecuta la compactación. Este es un mecanismo separado de la retención estándar y se utiliza para temas donde el último valor para una clave determinada es importante (por ejemplo, registros de cambios de base de datos, perfiles de usuario).

Conclusión

Elimine un tema de Kafka solo cuando los productores, consumidores y dependencias posteriores ya no lo necesiten. Para temas activos, configure retention.ms y retention.bytes deliberadamente y monitoree el uso del disco del broker para que los datos antiguos caduquen antes de que la presión de almacenamiento se convierta en un incidente.