El conector Postgres CDC lee una instantánea completa de una base de datos PostgreSQL y luego captura los datos de cambio, con semántica de procesamiento exactly-once.
Descripción general
El conector Postgres CDC es compatible con las siguientes capacidades:
|
Categoría |
Detalles |
|
Tipos compatibles |
Origen SQL, origen Flink CDC Nota
Utilice el conector JDBC para las tablas sink y las tablas de búsqueda (dimensión). |
|
Modo de ejecución |
Streaming |
|
Formato de datos |
No aplicable |
|
Métricas |
|
|
Tipos de API |
SQL y Flink CDC |
|
Actualización o eliminación en el destino |
No aplicable |
Funciones
A partir de VVR 8.0.6, el conector Postgres CDC se integra con el framework de instantáneas incrementales. Lee los datos históricos completos y después cambia automáticamente a la lectura de registros de cambios desde el WAL, con semántica exactly-once.
Funciones principales:
Procesamiento unificado de flujos y lotes. Lee datos completos e incrementales en un solo trabajo.
Lecturas de instantáneas concurrentes. Escala horizontalmente para lograr un rendimiento más rápido.
Cambio fluido entre la fase completa y la incremental. Reduce automáticamente la escala para disminuir el uso de recursos.
Lecturas reanudables. Reanuda la operación desde puntos de interrupción durante la fase de instantánea para mejorar la estabilidad.
Lectura sin bloqueos. No requiere bloqueos, lo que evita afectar las operaciones en línea.
Requisitos previos
El conector Postgres CDC lee flujos CDC mediante la replicación lógica de PostgreSQL. Es compatible con ApsaraDB RDS for PostgreSQL, Amazon RDS for PostgreSQL y PostgreSQL autogestionado.
La configuración varía según el tipo de despliegue. Configure Postgres.
Después de configurar el entorno, compruebe lo siguiente:
El parámetro wal_level está establecido en
logicalpara habilitar la decodificación lógica.-
El valor REPLICA IDENTITY de cada tabla suscrita está establecido en
FULL, de modo que los eventosINSERTyUPDATEincluyan los valores anteriores de las columnas para garantizar la consistencia de los datos.NotaREPLICA IDENTITYes una configuración a nivel de tabla en PostgreSQL que controla si los eventosINSERTyUPDATEincluyen los valores anteriores de las columnas. REPLICA IDENTITY. Los valores de
max_wal_sendersymax_replication_slotssuperan la suma de las ranuras en uso y las ranuras que requiere el trabajo de Flink.La cuenta tiene privilegios de
SUPERUSER, o bien permisos deLOGINyREPLICATION, además deSELECTsobre las tablas suscritas.
Si la tabla de Postgres contiene columnas generadas, establezca el parámetro publish_generated_columns en
storedal crear la ranura. De lo contrario, los esquemas de la fase de instantánea y de la fase incremental podrían diferir.
Notas de uso
La función de instantánea incremental requiere VVR 8.0.6 o posterior.
Ranuras de replicación
Los trabajos de Flink PostgreSQL CDC usan ranuras de replicación para evitar la purga prematura del WAL y garantizar la consistencia de los datos. Una gestión deficiente de estas ranuras puede provocar un uso excesivo del disco o retrasos en la lectura. A continuación se presentan las prácticas recomendadas:
-
Elimine oportunamente las ranuras que no se utilicen
Flink no elimina automáticamente las ranuras de replicación cuando un trabajo se detiene o se reinicia sin estado, ya que esto previene la pérdida de datos del WAL.
-
Si un trabajo no se va a reiniciar, elimine manualmente su ranura de replicación para liberar espacio en disco.
NotaGestión del ciclo de vida: Trate las ranuras de replicación como recursos a nivel de trabajo y gestíonelas junto con los inicios y las detenciones del trabajo.
-
Evite reutilizar ranuras antiguas
Utilice siempre un nombre de ranura nuevo. Si reutiliza una ranura antigua, el trabajo leerá los datos históricos acumulados del WAL durante el inicio, lo que retrasará el procesamiento de datos nuevos.
-
PostgreSQL requiere una ranura por conexión. Cada trabajo debe usar un nombre de ranura único.
NotaConvención de nomenclatura: Cuando personalice
slot.name, evite nombres con sufijos numéricos comomy_slot_1para prevenir conflictos con ranuras temporales.
-
Comportamiento de las ranuras con instantáneas incrementales habilitadas
Requisitos previos: Los puntos de control deben estar habilitados y la tabla de origen debe tener definida una clave principal.
-
Reglas de creación de ranuras:
Instantánea incremental deshabilitada: Solo se admite un paralelismo de 1. Se utiliza una ranura global.
-
Instantánea incremental habilitada:
Fase de instantánea: Cada subtarea de origen concurrente crea una ranura temporal. El formato de nomenclatura es
${slot.name}_${task_id}.Fase incremental: Todas las ranuras temporales se recuperan automáticamente. Solo se conserva una ranura global.
Número máximo de ranuras: Paralelismo del origen + 1 (durante la fase de instantánea).
-
Recursos y rendimiento
Si las ranuras disponibles o el espacio en disco son limitados, reduzca el paralelismo de la instantánea para usar menos ranuras temporales. Esto disminuye la velocidad de lectura de la instantánea.
-
Si el destino descendente admite escrituras idempotentes, establezca
scan.incremental.snapshot.backfill.skip = truepara omitir el llenado retroactivo del WAL durante la fase de instantánea y acelerar el inicio.Esta opción solo proporciona semántica at-least-once y no es adecuada para cálculos con estado (agregaciones o uniones de búsqueda), porque pueden perderse los cambios históricos necesarios.
-
Cuando las instantáneas incrementales están deshabilitadas, no se admiten puntos de control durante la fase de instantánea.
Reutilización de la suscripción de Postgres
El conector Postgres CDC depende de una publicación para determinar qué cambios de tablas se envían a una ranura. Si varios trabajos comparten la misma publicación, sus configuraciones se sobrescribirán.
Causa
El valor predeterminado de publication.autocreate.mode es filtered, que incluye únicamente las tablas definidas en la configuración del conector. Esto modifica la publicación al iniciar el trabajo, lo cual puede afectar a otros trabajos.
Solución
-
Cree una publicación en PostgreSQL que incluya todas las tablas monitoreadas, o bien cree una publicación independiente por cada trabajo.
-- Create a publication named my_flink_pub that includes all tables (or specified tables, creating one publication per job) CREATE PUBLICATION my_flink_pub FOR TABLE table_a, table_b; -- Or more simply, include all tables in the database CREATE PUBLICATION my_flink_pub FOR ALL TABLES;NotaNo se recomienda suscribirse a todas las tablas en bases de datos grandes, debido al consumo excesivo de ancho de banda y CPU en el clúster de Flink.
-
Agregue las siguientes configuraciones de Flink:
debezium.publication.name = 'my_flink_pub'(Especifica el nombre de la publicación)debezium.publication.autocreate.mode = 'disabled'(Impide que Flink intente crear o modificar la publicación durante el inicio)
Esto garantiza un aislamiento completo y evita que los trabajos nuevos afecten a los existentes.
SQL
Sintaxis
CREATE TABLE postgrescdc_source (
id INT NOT NULL,
name STRING,
description STRING,
weight DECIMAL(10,3)
) WITH (
'connector' = 'postgres-cdc',
'hostname' = '<host name>',
'port' = '<port>',
'username' = '<user name>',
'password' = '<password>',
'database-name' = '<database name>',
'schema-name' = '<schema name>',
'table-name' = '<table name>',
'decoding.plugin.name'= 'pgoutput',
'scan.incremental.snapshot.enabled' = 'true',
-- Skipping backfill can speed up reads and reduce resource usage, but it may cause data duplication. Enable this if the downstream sink is idempotent.
'scan.incremental.snapshot.backfill.skip' = 'false',
-- In a production environment, set this to 'filtered' or 'disabled' and manage the publication manually instead of through Flink.
'debezium-publication.autocreate.mode' = 'disabled'
-- If you have multiple sources, configure a different publication for each source.
--'debezium.publication.name' = 'my_flink_pub'
);
Opciones del conector
|
Opción |
Descripción |
Tipo de datos |
Obligatorio |
Predeterminado |
Observaciones |
|
connector |
Nombre del conector. |
STRING |
Sí |
– |
El valor debe ser |
|
hostname |
Dirección IP o nombre de host de la base de datos PostgreSQL. |
STRING |
Sí |
– |
– |
|
username |
Nombre de usuario del servicio de base de datos PostgreSQL. |
STRING |
Sí |
– |
– |
|
password |
Contraseña del servicio de base de datos PostgreSQL. |
STRING |
Sí |
– |
– |
|
database-name |
Nombre de la base de datos PostgreSQL. |
STRING |
Sí |
– |
Nombre de la base de datos. |
|
schema-name |
Nombre del esquema de PostgreSQL. Admite expresiones regulares. |
STRING |
Sí |
– |
El nombre del esquema admite expresiones regulares para leer datos de varios esquemas. |
|
table-name |
Nombre de la tabla de PostgreSQL. Admite expresiones regulares. |
STRING |
Sí |
– |
El nombre de la tabla admite expresiones regulares para leer datos de varias tablas. |
|
port |
Número de puerto. |
INTEGER |
No |
5432 |
– |
|
decoding.plugin.name |
Nombre del plugin de decodificación lógica de PostgreSQL. |
STRING |
No |
decoderbufs |
Lo determina el plugin instalado en el servicio de PostgreSQL. Los plugins compatibles son:
|
|
slot.name |
Nombre de la ranura de decodificación lógica. |
STRING |
Obligatorio para VVR 8.0.1 y versiones posteriores. Opcional para versiones anteriores. |
|
Establezca un valor único de No hay valor predeterminado para VVR 8.0.1 y versiones posteriores. |
|
debezium.* |
Propiedades y parámetros de Debezium |
STRING |
No |
– |
Proporciona un control más detallado sobre el comportamiento del cliente Debezium. Por ejemplo, |
|
scan.incremental.snapshot.enabled |
Especifica si se habilitan las instantáneas incrementales. |
BOOLEAN |
No |
false |
Nota
|
|
scan.startup.mode |
Modo de inicio para el consumo de datos. |
STRING |
No |
initial |
Valores válidos:
|
|
changelog-mode |
Modo de registro de cambios para codificar las modificaciones del flujo. |
String |
No |
all |
Modos de registro de cambios compatibles:
|
|
heartbeat.interval.ms |
Intervalo para enviar paquetes de latido. |
Duration |
No |
30s |
La unidad es milisegundos. El conector Postgres CDC envía activamente latidos a la base de datos para avanzar el desplazamiento de la ranura. Cuando los cambios en la tabla son poco frecuentes, establecer este valor garantiza la recuperación oportuna de los registros del WAL. |
|
scan.incremental.snapshot.chunk.key-column |
Especifica una columna que se utilizará como clave de fragmento para dividir los shards durante la fase de instantánea. |
STRING |
No |
– |
De forma predeterminada, se selecciona la primera columna de la clave principal. |
|
scan.incremental.close-idle-reader.enabled |
Especifica si se cierran los lectores inactivos una vez completada la instantánea. |
Boolean |
No |
false |
Para habilitar esta configuración, establezca |
|
scan.incremental.snapshot.backfill.skip |
Especifica si se omite la lectura de registros durante la fase de instantánea. |
Boolean |
No |
false |
Valores válidos:
|
Mapeo de tipos
A continuación se muestra el mapeo de tipos de PostgreSQL a Flink:
|
PostgreSQL CDC |
Flink |
|
SMALLINT |
SMALLINT |
|
INT2 |
|
|
SMALLSERIAL |
|
|
SERIAL2 |
|
|
INTEGER |
INT |
|
SERIAL |
|
|
BIGINT |
BIGINT |
|
BIGSERIAL |
|
|
REAL |
FLOAT |
|
FLOAT4 |
|
|
FLOAT8 |
DOUBLE |
|
DOUBLE PRECISION |
|
|
NUMERIC(p, s) |
DECIMAL(p, s) |
|
DECIMAL(p, s) |
|
|
BOOLEAN |
BOOLEAN |
|
DATE |
DATE |
|
TIME [(p)] [WITHOUT TIMEZONE] |
TIME [(p)] [WITHOUT TIMEZONE] |
|
TIMESTAMP [(p)] [WITHOUT TIMEZONE] |
TIMESTAMP [(p)] [WITHOUT TIMEZONE] |
|
CHAR(n) |
STRING |
|
CHARACTER(n) |
|
|
VARCHAR(n) |
|
|
CHARACTER VARYING(n) |
|
|
TEXT |
|
|
BYTEA |
Bytes |
Ejemplo
CREATE TABLE source (
id INT NOT NULL,
name STRING,
description STRING,
weight DECIMAL(10,3)
) WITH (
'connector' = 'postgres-cdc',
'hostname' = '<host name>',
'port' = '<port>',
'username' = '<user name>',
'password' = '<password>',
'database-name' = '<database name>',
'schema-name' = '<schema name>',
'table-name' = '<table name>'
);
SELECT * FROM source;
Flink CDC
VVR V11.4 y versiones posteriores son compatibles con el conector de PostgreSQL como origen de Flink CDC.
Sintaxis
source:
type: postgres
name: PostgreSQL Source
hostname: localhost
port: 5432
username: pg_username
password: pg_password
tables: db.scm.tbl
slot.name: test_slot
scan.startup.mode: initial
server-time-zone: UTC
connect.timeout: 120s
decoding.plugin.name: decoderbufs
sink:
type: ...
Opciones del conector
|
Opción |
Descripción |
Obligatorio |
Tipo de datos |
Predeterminado |
Observaciones |
|
type |
Nombre del conector. |
Sí |
STRING |
– |
Debe ser |
|
name |
Nombre del origen de datos. |
No |
STRING |
– |
– |
|
hostname |
Nombre de dominio o dirección IP del servidor de la base de datos PostgreSQL. |
Sí |
STRING |
– |
– |
|
port |
Puerto de la base de datos PostgreSQL. |
No |
INTEGER |
5432 |
– |
|
username |
Nombre de usuario de PostgreSQL. |
Sí |
STRING |
– |
– |
|
password |
Contraseña de PostgreSQL. |
Sí |
STRING |
– |
– |
|
tables |
Nombres de las tablas que se capturarán. Compatible con expresiones regulares. |
Sí |
STRING |
– |
Importante
Actualmente, solo se pueden capturar tablas de la misma base de datos. El punto (.) se interpreta como separador de un nombre completo. Para usarlo en una expresión regular y coincidir con cualquier carácter, escápelo con una barra invertida. Por ejemplo: |
|
slot.name |
Nombre del slot de replicación de PostgreSQL. |
Sí |
STRING |
– |
El nombre debe cumplir con las reglas de nomenclatura de slots de replicación de PostgreSQL. Puede contener letras minúsculas, números y guiones bajos. |
|
decoding.plugin.name |
Nombre del plugin de decodificación lógica de PostgreSQL instalado en el servidor. |
No |
STRING |
|
Valores válidos: |
|
tables.exclude |
Tablas que se excluirán. Esta opción surte efecto después de la opción |
No |
STRING |
– |
Consulte la opción |
|
server-time-zone |
Zona horaria de la sesión del servidor de la base de datos, por ejemplo, "Asia/Shanghai". |
No |
STRING |
– |
Si no se establece, se utiliza la zona horaria predeterminada del sistema ( |
|
scan.incremental.snapshot.chunk.size |
Tamaño (número de filas) de cada fragmento en el framework de instantáneas incrementales. |
No |
INTEGER |
8096 |
Cuando se habilita la instantánea incremental, la tabla se divide en varios fragmentos para su lectura. Los datos de un fragmento se almacenan en caché en la memoria hasta que se consumen por completo. Un fragmento más pequeño aumenta el número total de fragmentos de la tabla. Esto reduce la granularidad de la recuperación ante fallos, pero puede provocar errores de falta de memoria (OOM) y disminuir el throughput general. Por lo tanto, busque un equilibrio y establezca un tamaño de fragmento adecuado. |
|
scan.snapshot.fetch.size |
Número máximo de registros que se obtienen a la vez al leer los datos completos de una tabla. |
No |
INTEGER |
1024 |
– |
|
scan.startup.mode |
Modo de inicio para el consumo de datos. |
No |
STRING |
initial |
Valores válidos:
|
|
scan.incremental.close-idle-reader.enabled |
Indica si se cierran los lectores inactivos una vez que finaliza la instantánea. |
No |
BOOLEAN |
false |
Para habilitar esta configuración, establezca |
|
scan.lsn-commit.checkpoints-num-delay |
Número de puntos de control que se retrasan antes de comenzar a confirmar los desplazamientos LSN. |
No |
INTEGER |
3 |
Los desplazamientos LSN de los puntos de control se confirman de forma rotativa para evitar que sea imposible recuperar el estado. |
|
connect.timeout |
Tiempo máximo que el conector espera para conectarse al servidor de la base de datos PostgreSQL antes de agotar el tiempo de espera. |
No |
DURATION |
30s |
Este valor no puede ser inferior a 250 milisegundos. |
|
connect.max-retries |
Número máximo de intentos de reconexión del conector para establecer una conexión. |
No |
INTEGER |
3 |
– |
|
connection.pool.size |
Tamaño del pool de conexiones. |
No |
INTEGER |
20 |
– |
|
jdbc.properties.* |
Permite pasar propiedades personalizadas de la URL JDBC. |
No |
STRING |
20 |
Se pueden pasar propiedades personalizadas, por ejemplo, |
|
heartbeat.interval |
Intervalo para enviar eventos de latido que rastrean el último desplazamiento disponible del registro WAL. |
No |
DURATION |
30s |
– |
|
debezium.* |
Pasa las propiedades de Debezium al motor integrado de Debezium, que se utiliza para capturar los cambios de datos del servidor PostgreSQL. |
No |
STRING |
– |
Propiedades del conector Debezium para PostgreSQL: documentación de Debezium. |
|
chunk-meta.group.size |
Tamaño de los metadatos del fragmento. |
No |
STRING |
1000 |
Si los metadatos superan este valor, se transmiten en varias partes. |
|
metadata.list |
Lista de metadatos legibles que se pasan al flujo descendente. Se pueden utilizar en el módulo de transformación. |
No |
STRING |
false |
Utilice comas (,) como separadores. A continuación se muestran los metadatos disponibles:
Nota
Las columnas de metadatos están disponibles únicamente en VVR 11.9 y versiones posteriores. |
|
scan.incremental.snapshot.unbounded-chunk-first.enabled |
Envía primero el fragmento ilimitado durante la fase de lectura de la instantánea. |
No |
STRING |
false |
Esta es una función experimental. Habilitarla reduce el riesgo de errores OOM cuando TaskManager sincroniza el último fragmento durante la fase de instantánea. Se recomienda agregarla antes del primer inicio del trabajo. |
|
schema-change.enabled |
Indica si el conector deduce automáticamente los cambios de esquema. |
No |
BOOLEAN |
false |
Una vez habilitada esta función, el conector compara los mensajes recibidos por Nota
Los cambios de esquema que se pueden deducir incluyen agregar columnas, eliminar columnas, cambiar el nombre de columnas y modificar los tipos de datos de las columnas. Este parámetro está disponible únicamente en VVR 11.9 y versiones posteriores. |