Compactación de Logs de un Topic en Kafka

compactación de logs de un topic en kafka

compactación de logs de un topic en kafka


En esta entrada sobre compactación de logs de un Topic de Kafka o lo que es lo mismo Log Compacted Topic en Kafka, vamos a ver como internamente Kafka guarda el estado de estos topics en el file system.

Para comenzar vamos a definir que es un Log Compacted Topic en Kafka.

Qué es un Log Compacted Topic en Kafka

Según la documentación de oficial de confluent es:

La compactación de registros es un mecanismo para proporcionar una retención por registro de grano más fino, en lugar de una retención basada en el tiempo de grano más grueso. La idea es eliminar de forma selectiva los registros en los que tenemos una actualización más reciente con la misma clave principal. De esta manera, se garantiza que el registro tenga al menos el último estado para cada clave.

Confluent

Es decir, lo que nos dice confluent es que se va a eliminar el registro antiguo cuando tengamos una nueva versión con la misma clave.

Por ejemplo si a una partición se envían varios registros y llega un momento en el que se comienza a repetir la clave entonces lo que kafka hará será borrar la anterior y dejar únicamente la nueva.

Qué es un log compacted?|Compactación de Logs de un  Topic en Kafka

Como podemos ver en los dibujos anteriores, al llegar un nuevo mensaje con key=k1 se sobreescribe y se actualiza el valor.

Kafka de manera interna se encarga de eliminar el anterior y así poder dejar el nuevo valor y evitar tener duplicados.

El uso de compacted log, ya que siempre se guarda el más nuevo, puede ser usado a modo caché, ya que será sumamente rápido y lo tendremos al arrancar.

Estructura de Registro Compactado o Log Compacted

La estructura de Log Compacted de Kafka tiene dos partes: Head y Tail.

  • Head: Es la parte delantera y no podrá tener ninguna clave repetida.
  • Tail: Parte trasera y es el proceso previo de análisis, podrá tener claves repetidas.
Estructura Log Compacted | Compactación de Logs de un  Topic en Kafka
Estructura Log Compacted

Ahora que entendemos un poco mejor la compactación de registros, vamos a ver un ejemplo para ver su funcionamiento en vivo y en directo.

Segmentos

Otro tema que tenemos que tener en cuenta sobre el funcionamiengo de log compacted son los segments y cómo se comportan.

Dentro del Compacted Log tenemos el partition log, que podríamos decir que es una abstración que nos va a permitir consumir los mensajes dentro de una partición de manera ordenada. Realmente los segmentos, podríamos decir, que son ficheros almacenados en el file system y con el nombre que genera termina en .log.

El partition log en kafka se divide por el broker de kafka en segmentos.

El primer offset que se va a generar en un segmento es el base offset; y el último segmento en las particiones se llama active segment, hay que tener en cuenta que únicamente el active segment puede recibir los mensajes que se acaban de producir.

En el ejemplo de más abajo podremos ver y consultar los segmentos.

Proceso de limpieza

Nuestro Kafka Broker tiene que realizar un proceso de limpieza sobre los compacted logs, para ello, al arrancar se crean una serie de threads encargados de limpiar. Estos threads tienen como cometido encontrar el log más lleno y que puede recibir mensajes nuevos en el broker y limpiarlo.

Una vez hemos encontrado el log más lleno y capaz de recepcionar nuevos mensajes, vamos a ver de ese log que porción limpiamos. Por defecto kafka también eliminará los registros a null (esto puede ser configurable en la configuración de kafka).

Una vez hemos realizado el proceso de limpieza, obviamente tendremos un nuevo head y tail. Kafka nos va a mantener un registro de los procesos de clean en el fichero cleaner-offset-checkpoint, podemos hacer un cat para ver lo que tiene, que es la versión del fichero, el número de líneas y el nombre del compacted log topic.

Crear ejemplo de Log Compacted Topic

Para el siguiente topic vamos a necesitar tener descargados los binarios para poder crear un Topic Compactado, producir y consumir mensajes.

Lo primero que vamos a hacer es crear un compacted topic por línea de comando:

kafka-topics --create --zookeeper zookeeper:2181 --topic latest-product-price --replication-factor 1 --partitions 1 --config "cleanup.policy=compact" --config "delete.retention.ms=100"  --config "segment.ms=100" --config "min.cleanable.dirty.ratio=0.01"

En el anterior comando le hemos añadido las propiedades necesarias para indicar el tipo de topic que queremos crear. A continuación, vamos a añadir un productor sobre ese topic:

kafka-console-producer --broker-list localhost:9092 --topic latest-product-price --property parse.key=true --property key.separator=:

A continuación abrimos en otro terminal un consumidor de esos mensajes:

kafka-console-consumer --bootstrap-server localhost:9092 --topic latest-product-price --property  print.key=true --property key.separator=: --from-beginning

Para hacer una prueba en la que no vemos mensajes con key duplicada podemos comenzar a escribir en nuestro productor mensajes con la misma key, de forma que veremos en el consumidor que ninguna aparece con la misma key.

A continuación como comentamos anteriormente, vamos a hacer una consulta sobre el directorio en el que tenemos los segmentos, para ello escribimos el siguiente comando:

ls /var/lib/kafka/data/latest-car-color-0/
00000000000000000000.index 00000000000000000002.log
00000000000000000000.log 00000000000000000002.snapshot
00000000000000000000.timeindex 00000000000000000002.timeindex
00000000000000000005.snapshot leader-epoch-checkpoint
00000000000000000006.index

En el directorio anterior podemos ver el active segment que sería 00000000000000000002.log y los segmentos 00000000000000000002.log y 00000000000000000000.log.

Conclusión

En este artículo hemos visto un tema más sobre kafka, sobre Compactación de Logs de un Topic en Kafka. Qué es la compactación de logs, y un resumen de como funciona.

Si quieres puedes ver algún artículo más sobre Kafka como:

Si necesitas más información puedes escribirnos un comentario o un correo electrónico a refactorizando.web@gmail.com o también nos puedes contactar por nuestras redes sociales Facebook o twitter y te ayudaremos encantados!


Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *