Debezium: Introducción a Change Data Capture con Kafka

Última actualización: 23/08/2022

Las herramientas de Change Data Capture o CDC nos ayudan a capturar los cambios que se producen en las bases de datos en tiempo real para poder transformarlos y propagarlos a otras herramientas. En esta entrada aprenderás qué es Debezium, una de las herramientas open source de CDC más populares desarrollada por Redhat.

Debezium introduccion cdc

Para qué sirve el Change Data Capture

El destino más común de las herramientas de CDC como Debezium son los data warehouses. Estos almacenes de datos nos permiten preservar todos los cambios producidos en las bases de datos y usarlos posteriormente para analítica o para alimentar otros sistemas de datos.

Otro escenario bastante común es el uso de las herramientas de CDC para generar el stream de cambios en un formato estandarizado a partir de varias bases de datos heterogéneas. Esta capacidad nos permite monitorizar varias bases de datos y despreocuparnos de transformar posteriormente los cambios para procesarlos de manera conjunta. Además, podremos sincronizar varios sistemas de bases de datos en tiempo real.

Change Data Capture con Debezium

Con Debezium podemos hacer CDC en streaming con una baja latencia y con una implementación muy sencilla. Para ello se apoya en Apache Kafka como plataforma de streaming de datos distribuida, escalable y tolerante a fallos y en Kafka Connect. El equipo de desarrollo de Debezium también ofrece otras posibilidades de despliegue sin usar Apache Kafka. Debezium Server o la embedded engine son alternativas menos usadas.

Para conseguir la información de los cambios en los datos y generar los eventos, Debezium consulta el binlog de la base de datos. Este es un fichero de registro de la base de datos donde se escriben todos los cambios de una forma ordenada. De esta forma, se consigue detectar los cambios de forma no intrusiva y sin impacto en la base de datos original, aunque es necesario que tenga activada esta funcionalidad.

Esquema Debezium
Esquema Debezium

La capacidad de leer el log de cambios tiene varias ventajas respecto en las alternativas basadas en consultas. Por un lado, no impacta en el rendimiento del sistema origen, ya que no le obliga a procesar consultas de sincronización ni a mantener registros con la marca temporal de la última consulta. Por otro lado, permite tratar los cambios que se producen con muy baja latencia y mantener todo el histórico de operaciones sin perder los que se producirían entre consultas.

Debezium es capaz de procesar los cambios que se han producido en el sistema origen desde el último instante en el que estuvo ejecutando. De esta forma se evita perder datos de origen. Si los clientes o el destino de los datos sufre una interrupción, por ejemplo una desconexión de red o una parada de funcionamiento, Debezium también será capaz de proporcionar los datos de este periodo de tiempo inactivo para evitar pérdidas de datos.

Cómo Ejecutar Debezium

Debezium también ofrece módulos para facilitar la conexión con la mayoría de bases de datos como MySQL, PostgreSQL, SQL Server, Oracle, MongoDB, db2 y Cassandra.

Para probar Debezium, podemos clonar el repositorio de código con git en nuestro sistema. Necesitaremos el JDK y Docker.

El repositorio de Debezium está disponible en Github. Además, también proporcionan un repositorio con ejemplos y una interfaz gráfica

Para que Debezium funcione, debemos ejecutar también Apache Kafka, Zookeeper y Kafka Connect. Puedes seguir el artículo de guía de comandos para Kafka para ejecutar estas herramientas directamente en tu sistema o bien en contenedores Docker.

Probaremos el conector de Debezium con la base de datos MySQL. Por cada tabla en nuestra base de datos, el conector creará un topic de Kafka en cuyo nombre aparecerá el servidor de base de datos, la base de datos y la tabla, separado por puntos. En este topic se encontrarán los eventos de cambio y DDLs ordenados.

Para registrar el conector en Kafka Connect, definiremos la siguiente configuración:

{
  "name": "mysql-connector",
   "config": {
      "connector.class": "io.debezium.connector.mysql.MySqlConnector",
      "tasks.max": "1",
      "database.hostname": "localhost",  
      "database.port": "3306",
      "database.user": "usuario",
      "database.password": "password",
      "database.server.id": "1",
      "database.server.name": "dbserver",  
      "database.include.list": "database",  
      "database.history.kafka.bootstrap.servers": "localhost:9092",  
      "database.history.kafka.topic": "schema-changes.database"  
   }
}

Deberemos sustituir en la configuración los parámetros para que coincidan con nuestro despliegue de Kafka y de MySQL. Podemos enviar esta información a Kafka Connect (ejecutando localmente en el puerto 8083) usando el siguiente comando. Deberemos sustituir aquí los puntos suspensivos por el JSON definido anteriormente:

curl -i -X POST -H 'Accept: application/json' -H 'Content-Type: application/json' 'http://localhost:8083/connectors/' -d '{...}'

Una vez registrado, el conector de Debezium se conectará a MySQL y comenzará a monitorizar los cambios Podremos visualizar estos cambios en el topic de Kafka configurado para comprobar que se muestran a medida que se van produciendo.

Deja una respuesta