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.
Contenidos
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.
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.
Siguientes Pasos y Formación
Preguntas Frecuentes – FAQ
¿Cómo funciona el CDC en Debezium?
Debezium funciona capturando eventos en las bases de datos mediante la monitorización de los logs binarios (binlogs) o logs de transacciones. Estos eventos son enviados a Kafka como mensajes, los cuales pueden ser consumidos por aplicaciones para procesar, analizar o replicar los datos.
¿Cómo se configuran los conectores de Debezium?
Los conectores de Debezium se configuran mediante archivos de configuración JSON que especifican detalles como la conexión a la base de datos, las tablas a monitorizar, y las propiedades de Kafka Connect. Estos archivos se pueden cargar en Kafka Connect para iniciar el CDC.
¿Es posible filtrar los cambios capturados por Debezium?
Sí, es posible filtrar los cambios capturados por Debezium. Los conectores de Debezium permiten configurar filtros para incluir o excluir tablas, columnas y tipos específicos de cambios. Esto permite a los usuarios capturar y procesar solo los datos relevantes para sus necesidades.