La suscripción lógica permite la sincronización unidireccional a nivel de tabla y casi en tiempo real entre instancias de ApsaraDB RDS for PostgreSQL. Utilícela para compartir datos entre regiones, consolidar información de múltiples orígenes en una base de datos central o distribuir los datos en bases de datos independientes.
Requisitos previos
Antes de empezar, asegúrese de contar con lo siguiente:
Una instancia de ApsaraDB RDS for PostgreSQL que ejecute PostgreSQL 10 o posterior con discos en la nube
El parámetro
wal_levelestablecido comologicalen la instancia publicadora; configúrelo nuevamente en la página de Parameters de la consola de ApsaraDB RDS y reinicie la instancia para que el cambio surta efecto(Para suscripciones entre instancias) El bloque CIDR de la red virtual privada (VPC) agregado a la lista de permitidos de direcciones IP de ambas instancias; por ejemplo, agregue
172.16.0.0/16. Para más detalles, consulte Configure an IP address whitelistUna cuenta con el rol
rds_superuser, ya sea la cuenta privilegiada o una cuenta estándar creada medianteCREATE ROLE xxx WITH SUPERUSER
Funcionamiento
En el publicador, cree una publicación para una o varias tablas dentro de una base de datos.
En el suscriptor, cree una suscripción que se conecte a la base de datos del publicador y haga referencia a la publicación.
PostgreSQL transmite los cambios a nivel de fila (INSERT, UPDATE, DELETE) desde las tablas publicadas hacia el suscriptor casi en tiempo real.
Las suscripciones lógicas funcionan entre dos bases de datos dentro de la misma instancia de RDS, o bien entre dos instancias de RDS que residen en la misma VPC y están conectadas mediante endpoints internos.
Para obtener contexto sobre el mecanismo subyacente, consulte Principios y mejores prácticas de la suscripción lógica.
Creación de una publicación en el publicador
Connect to the publisher instance y conéctese a la base de datos que desea publicar.
-
Cree una publicación para una tabla:
Solo se pueden publicar tablas base persistentes. Para conocer los objetos compatibles, consulte CREATE PUBLICATION .
-- On the publisher database CREATE PUBLICATION <publication_name> FOR TABLE <schema.table_name>;Ejemplo:
-- On the publisher database (testdb01) CREATE PUBLICATION pub1 FOR TABLE public.t1; -
Compruebe que la publicación se haya creado correctamente:
-- On the publisher database SELECT * FROM pg_publication;La salida muestra
pub1junto con sus detalles de configuración.
Creación de una suscripción en el suscriptor
Los pasos varían según si el publicador y el suscriptor se encuentran en la misma instancia de RDS o en instancias distintas.
Misma instancia de RDS, diferentes bases de datos
Cuando el publicador y el suscriptor residen en la misma instancia, PostgreSQL no puede crear un slot de replicación dentro del mismo comando CREATE SUBSCRIPTION, ya que esto provoca que el comando se bloquee. Se trata de una restricción del motor de PostgreSQL, no de una limitación de RDS. Cree primero el slot por separado y luego haga referencia a él en la suscripción.
-
Connect to the publisher database y cree un slot de replicación lógica:
-- On the publisher database SELECT pg_create_logical_replication_slot('<slot_name>', 'pgoutput'); Conéctese a la base de datos del suscriptor y cree una tabla con el mismo esquema y nombre que la tabla del publicador.
-
Conéctese a la base de datos del suscriptor y cree la suscripción haciendo referencia al slot que creó en el paso 1. Si la instancia ejecuta PostgreSQL 16 o posterior:
ImportanteIncluya siempre
create_slot=falseen la cláusulaWITHcuando el publicador y el suscriptor estén en la misma instancia. Omitir este parámetro provoca que el comando se bloquee.-- On the subscriber database CREATE SUBSCRIPTION <subscription_name> CONNECTION 'host=127.0.0.1 port=<port> user=<username> password=<password> dbname=<publisher_db_name>' PUBLICATION <publication_name> WITH (create_slot=false, slot_name=<slot_name>);Si la instancia ejecuta de PostgreSQL 10 a 15:
-- On the subscriber database CREATE SUBSCRIPTION <subscription_name> CONNECTION 'dbname=<publisher_db_name>' PUBLICATION <publication_name> WITH (create_slot=false, slot_name=<slot_name>); -
Verifique la suscripción:
-- On the subscriber database SELECT * FROM pg_subscription;
Diferentes instancias de RDS
Connect to the subscriber instance y conéctese a la base de datos del suscriptor.
Cree una tabla con el mismo esquema y nombre que la tabla del publicador.
-
Cree la suscripción:
-- On the subscriber database CREATE SUBSCRIPTION <subscription_name> CONNECTION 'host=<Internet endpoint of the publisher RDS instance> port=<port> user=<username> password=<password> dbname=<publisher_db_name>' PUBLICATION <publication_name>;Ejemplo:
-- On the subscriber database (testdb02) CREATE SUBSCRIPTION sub1_from_pub1 CONNECTION 'host=pgm-2ze7n9zb0n1f****.pg.rds.aliyuncs.comm port=5432 user=testdbuser password=****x dbname=testdb01' PUBLICATION pub1 WITH (enabled, create_slot, slot_name='sub1_from_pub1');Para consultar todos los parámetros de suscripción disponibles, vea CREATE SUBSCRIPTION.
-
Verifique la suscripción:
-- On the subscriber database SELECT * FROM pg_subscription;
Adición de tablas a una publicación existente
Después de agregar tablas a una publicación, actualice la suscripción en el suscriptor, ya que las nuevas tablas no se detectan automáticamente.
-- On the subscriber database
ALTER SUBSCRIPTION <subscription_name> REFRESH PUBLICATION;
Supervisión de slots de replicación
Los slots de replicación sin uso retienen archivos de Write-Ahead Logging (WAL) e impiden su reciclaje. Si un suscriptor deja de consumir cambios, los archivos WAL se acumulan y pueden llenar el almacenamiento del publicador, lo que dejaría la instancia no disponible.
Después de configurar las suscripciones lógicas:
Supervise Storage Used en la instancia publicadora y configure una alerta para detectar crecimientos anómalos.
Monitoree Maximum Used Transaction IDs para identificar riesgos de desbordamiento de ID de transacción.
-
Elimine cualquier slot de replicación que ya no esté en uso:
-- On the publisher database SELECT pg_drop_replication_slot('<slot_name>');Para listar todos los slots de replicación activos:
-- On the publisher database SELECT * FROM pg_replication_slots;