Debezium
Debezium es una herramienta de Change Data Capture (CDC). Monitoriza el WAL (Write-Ahead Log) de PostgreSQL — el registro interno de todas las operaciones de escritura — y publica un evento en RabbitMQ cada vez que se inserta, modifica o borra un registro en las tablas configuradas.
Debezium solo lee. Nunca escribe en ninguna base de datos. No modifica el comportamiento de PostgreSQL.
Configuración
La forma más correcta de poner en marcha Debezium es partiendo de un escenario en el que las bases de datos a monitorizar ya estén creadas. Ver la documentación sobre Postgres.
-
Editar
debezium/debezium_tables.ymlcon las bases de datos y tablas deseadas:databases: odoo_db: # Formato: schema.tabla - public.res_users - public.hr_department main_db: - public.users_core - public.departments -
Generar los ficheros de configuración
python3 debezium/debezium_generate.pyEl script genera los tres ficheros automáticos y muestra un resumen:
▶ Leyendo debezium_tables.yml [INFO] Bases de datos encontradas: 2 [INFO] odoo_db: 2 tabla(s) [INFO] main_db: 2 tabla(s) ▶ Generando ficheros application.properties [OK] odoo_db → debezium/conf/odoo_db/application.properties [OK] main_db → debezium/conf/main_db/application.properties ▶ Generando docker-compose.debezium.yml [OK] → docker-compose.debezium.yml ▶ Generando rabbitmq/definitions/debezium.yml [OK] → rabbitmq/definitions/debezium.yml -
Comprobar que en el fichero .services está descomentada la línea con el servicio debezium.
-
Arrancar
./up.shup.shdetectadebeziumenSERVICESy automáticamente:- Comprueba si los ficheros generados están actualizados (y regenera si no)
- Añade
-f docker-compose.debezium.ymlal comando de compose - Sustituye la palabra
debeziumpor los servicios reales (por ejemplo,debezium-odoo-db,debezium-main-db) - Arranca todos los servicios
-
Verificar que wal_level es logical
docker exec odoodock-db-1 psql -U odoodock -W --dbname postgres -c "SHOW wal_level;"Debe mostrar
logical. Si muestrareplicaominimal, PostgreSQL no recogió la configuración — revisar que el serviciodbse reinició completamente. -
Una vez que el servicio
dbestá corriendo, ejecutar el script de sincronización. Este paso solo es necesario la primera vez o cuando se modifican las tablas monitorizadas:chmod +x ./debezium/debezium_sync.sh ./debezium/debezium_sync.shEl script crea el rol
debezium_reader, aplica los GRANTs necesarios en cada base de datos y crea las publicaciones PostgreSQL. Es idempotente — puede ejecutarse varias veces sin efecto secundario.▶ Gestionando rol debezium_reader [OK] Rol debezium_reader creado ▶ Sincronizando publicaciones [INFO] ── Base de datos: odoo_db [OK] Publicación debezium_odoo_db_pub creada [INFO] ── Base de datos: main_db [OK] Publicación debezium_main_db_pub creada -
Inicializar colas en RabbitMQ
docker exec odoodock-rabbitmq-1 bash /init-rabbit.sh \ "$RABBITMQ_DEFAULT_USER" "$RABBITMQ_DEFAULT_PASSWORD"init-rabbit.shescanea toda la carpetadefinitions/y aplica todos los ficheros yml, incluido eldebezium.ymlgenerado en el paso 2. -
Verificar que Debezium está funcionando
# Ver logs del conector de odoo_db docker logs debezium-odoo-db --tail 30 # Comprobar que el slot de replicación existe en PostgreSQL docker exec db psql -U "$POSTGRES_USER" -c \ "SELECT slot_name, active FROM pg_replication_slots;"
Un arranque correcto muestra en los logs algo similar a:
INFO Debezium version: 2.7.x
INFO Creating replication slot debezium_odoo_db_slot
INFO Snapshot step 1 - Snapshotting contents of 2 table(s)
INFO Finished reading 1 record(s) from snapshotting table 'public.res_users'
INFO Streaming changes from WAL position...
Añadir una tabla nueva o una base de datos nueva a la monitorización
Este es el caso más frecuente durante el desarrollo: ya hay Debezium corriendo y se quiere monitorizar una tabla adicional.
-
Detener los servicios
docker compose down -
Editar
debezium/debezium_tables.ymlcon las bases de datos y tablas deseadas:databases: odoo_db: # Formato: schema.tabla - public.res_users - public.hr_department main_db: - public.users_core - public.departments # nueva base de datos new_db: - public.employee -
Regenerar configuraciones
python3 debezium/debezium_generate.py -
Sincronizar PostgreSQL
./postgres/debezium_sync.sh -
Actualizar colas en RabbitMQ
docker exec rabbitmq bash /init-rabbit.sh "$RABBITMQ_DEFAULT_USER" "$RABBITMQ_DEFAULT_PASSWORD" --file /definitions/debezium.yml -
Reiniciar el contenedor Debezium afectado:
El
application.propertiesha cambiado, por lo que Debezium necesita reiniciarse para leerlo:Si es una nueva base de datos:
mkdir -p "$DATA_PATH_HOST/debezium/new_db" docker compose -f docker-compose.yml -f docker-compose.debezium.yml up -d debezium-new_dbSi la tabla pertenece a una base de datos que ya existía:
# la tabla pertenece a odoo_db docker compose -f docker-compose.yml -f docker-compose.debezium.yml restart debezium-odoo-db