Lab — Pipeline Connect CDC: IBM i → destino
Objetivo
Configurar un pipeline end-to-end de Precisely Connect CDC que capture cambios desde una tabla DB2 for i en IBM i y los entregue a un destino externo (Kafka, SQL Server o Snowflake — el lab acepta cualquiera de los tres). Validar la propagación, probar catch-up tras detener el destino.
Tiempo estimado
180 minutos.
Prerequisitos
- •Lab Journaling IBM i completado.
- •Connect CDC instalado en el laboratorio compartido: motor + agente IBM i.
- •Destino accesible:
- •Kafka local con un topic creado, o
- •SQL Server con una tabla destino creada, o
- •Snowflake account con database/schema/table de práctica.
- •Documentación oficial vigente: Precisely Help — Connect CDC IBM i Installation Guide.
Paso 1 — Preparar el source en IBM i
CRTLIB LIB(CDCLAB)
CRTJRNRCV JRNRCV(CDCLAB/RCV0001) THRESHOLD(500000)
CRTJRN JRN(CDCLAB/JRNCDC) JRNRCV(CDCLAB/RCV0001) MNGRCV(*SYSTEM)
Crear la tabla con SQL para tener nombres claros:
CREATE TABLE CDCLAB.ORDENES (
ORD_ID INT NOT NULL,
CLIENTE VARCHAR(50),
MONTO DECIMAL(10,2),
FECHA DATE,
PRIMARY KEY (ORD_ID)
);
Iniciar journaling con imagen *BOTH (requerido por Connect CDC):
STRJRNPF FILE(CDCLAB/ORDENES) JRN(CDCLAB/JRNCDC) IMAGES(*BOTH)
(Fuente: Precisely Help — Set up journaling)
Paso 2 — Preparar el destino
Opción A — Kafka
Crear un tópico:
kafka-topics --create --topic cdc.ordenes --bootstrap-server localhost:9092 --partitions 3 --replication-factor 1
Opción B — SQL Server
CREATE TABLE dbo.ORDENES_CDC (
ORD_ID INT NOT NULL PRIMARY KEY,
CLIENTE NVARCHAR(50),
MONTO DECIMAL(10,2),
FECHA DATE,
CDC_OP CHAR(1),
CDC_TS DATETIME
);
Opción C — Snowflake
CREATE TABLE LAB_DB.LAB_SCHEMA.ORDENES (
ORD_ID NUMBER NOT NULL,
CLIENTE VARCHAR(50),
MONTO NUMBER(10,2),
FECHA DATE,
CDC_OP VARCHAR(1),
CDC_TS TIMESTAMP_NTZ
);
Paso 3 — Configurar el pipeline en Connect
Pasos generales (los nombres de campos varían por versión, validar con docs):
- •Crear una datastore source apuntando a la LPAR IBM i (host, puerto, credenciales del agente).
- •Crear una datastore target apuntando al destino elegido (Kafka broker / SQL Server / Snowflake).
- •Crear un subscription que capture la tabla
CDCLAB.ORDENES. - •Configurar el mapping source→target. Para Kafka, mapping a JSON. Para SQL Server / Snowflake, mapping columna a columna.
- •Configurar la carga inicial (snapshot) y luego CDC.
- •Activar la subscription.
Para los nombres exactos de menúes y campos, ver la documentación oficial Connect CDC en help.precisely.com.
Paso 4 — Validar que el pipeline está corriendo
En la consola de Connect:
- •Subscription en estado: Replicating.
- •Carga inicial: Completed.
- •Latency / lag: bajo.
- •No hay errores en logs del motor ni del agente IBM i.
Paso 5 — Generar cambios en source
INSERT INTO CDCLAB.ORDENES VALUES (1, 'JUAN PEREZ', 1500.00, CURRENT DATE);
INSERT INTO CDCLAB.ORDENES VALUES (2, 'MARIA LOPEZ', 2300.50, CURRENT DATE);
INSERT INTO CDCLAB.ORDENES VALUES (3, 'PEDRO GARCIA', 750.25, CURRENT DATE);
UPDATE CDCLAB.ORDENES SET MONTO = 1800.00 WHERE ORD_ID = 1;
DELETE FROM CDCLAB.ORDENES WHERE ORD_ID = 3;
Paso 6 — Validar en destino
Kafka
kafka-console-consumer --topic cdc.ordenes --from-beginning --bootstrap-server localhost:9092
Deberías ver mensajes JSON para cada operación (3 inserts, 1 update con before/after, 1 delete).
SQL Server / Snowflake
SELECT * FROM dbo.ORDENES_CDC ORDER BY CDC_TS;
-- o en Snowflake
SELECT * FROM LAB_DB.LAB_SCHEMA.ORDENES;
Deben verse los registros aplicados según la lógica del subscription (apply directo, audit, soft-delete según configuración).
Paso 7 — Probar catch-up tras detener el destino
- •Detener el destino (parar el broker Kafka / parar el servicio SQL Server / pausar el warehouse Snowflake).
- •Generar más cambios en source:
INSERT INTO CDCLAB.ORDENES VALUES (4, 'ANA MARTINEZ', 5000.00, CURRENT DATE);
INSERT INTO CDCLAB.ORDENES VALUES (5, 'LUIS RAMIREZ', 2750.00, CURRENT DATE);
- •Verificar que el agente sigue capturando hacia la Data Queue y que se forma backlog (ver RB-CDC-007).
- •Reanudar el destino.
- •Esperar minutos y verificar que el catch-up se completó (los registros 4 y 5 aparecen sin pérdida).
Paso 8 — Cleanup
En source:
ENDJRNPF FILE(CDCLAB/ORDENES)
DROP TABLE CDCLAB.ORDENES;
DLTJRN JRN(CDCLAB/JRNCDC)
DLTJRNRCV JRNRCV(CDCLAB/RCV0001) DLTOPT(*IGNINQMSG)
DLTLIB LIB(CDCLAB)
En el motor: detener subscription y eliminar.
Validación esperada
- •Los 3 inserts iniciales aparecen en destino.
- •El update aparece como cambio de
MONTO. - •El delete aparece (eliminación física o marca soft según config).
- •Tras detener-reanudar el destino, los 2 inserts adicionales aparecen sin pérdida.
- •Lag vuelve a bajo nivel tras catch-up.
Errores comunes
| Síntoma | Mitigación |
|---|---|
| Subscription no captura inserts nuevos | Tabla no journaled o imagen *BEFORE solamente — ver RB-CDC-002, RB-CDC-003 |
| Auth error contra destino | Credenciales / certificado / token — ver RB-CDC-004 |
| Destino aplica con delay alto | Performance del destino o batch size — ver RB-CDC-009 |
| Carga inicial no completa | Volumen alto o configuración de chunk — ver docs Precisely |
Lecciones del lab
- •El journaling con imagen
*BOTHes no-negociable. - •La Data Queue absorbe el rato que el destino esté caído — pero tiene límite (ver retención de receivers).
- •El catch-up es automático mientras los receivers no se hayan purgado. Si la caída excede la retención, se requiere re-sync (ver RB-CDC-008).