Replicación lógica para Amazon RDS para PostgreSQL
A partir de la versión 10.4, RDS para PostgreSQL admite la sintaxis SQL de publicación y suscripción introducida en PostgreSQL 10. Para obtener más información, consulte Replicación lógica
nota
Además de la función de replicación lógica nativa de PostgreSQL introducida en PostgreSQL 10, RDS para PostgreSQL también admite la extensión pglogical
. Para obtener más información, consulte Uso de pglogical para sincronizar datos entre instancias.
A continuación encontrará información sobre la configuración de la replicación lógica para una instancia de base de datos de RDS for PostgreSQL.
Temas
Comprensión de la replicación lógica y la descodificación lógica
RDS for PostgreSQL admite el streaming de los cambios del registro de escritura anticipada (WAL) mediante las ranuras de replicación lógica de PostgreSQL. También admite el uso de decodificación lógica. Puede configurar ranuras de replicación lógica en su instancia y transmitir los cambios de la base de datos a través de estas ranuras a un cliente como pg_recvlogical
. Las ranuras de replicación lógica se crean a nivel de la base de datos y admiten conexiones de replicación a una única base de datos.
Los clientes más comunes para la replicación lógica de PostgreSQL son AWS Database Migration Service o un host administrado personalizado en una instancia de Amazon EC2. La ranura de replicación lógica no tiene información sobre el receptor de la transmisión. Además, no existe el requisito de que el destino sea una base de datos de réplica. Si configura una ranura de replicación lógica y no lee desde la ranura, los datos podrían escribirse y rellenarse rápidamente en el almacenamiento de la instancia de base de datos.
La replicación y descodificación lógicas de PostgreSQL en Amazon RDS se activan con un parámetro, un tipo de conexión de replicación y un rol de seguridad. El cliente para la descodificación lógica puede ser cualquier cliente que sea capaz de establecer una conexión de replicación con una base de datos en una instancia de base de datos PostgreSQL.
Para activar la descodificación lógica para una instancia de base de datos de RDS for PostgreSQL
-
Asegúrese de que la cuenta de usuario que está utilizando tenga los siguientes roles:
-
El rol
rds_superuser
para poder activar la replicación lógica -
El rol
rds_replication
para conceder permisos para administrar ranuras lógicas y para transmitir datos mediante ranuras lógicas
-
-
Establezca el parámetro estático
rds.logical_replication
en 1. Como parte de la aplicación de este parámetro, también defina los parámetroswal_level
,max_wal_senders
,max_replication_slots
ymax_connections
. Estos cambios de parámetro pueden incrementar la generación de WAL, por lo que el parámetrords.logical_replication
se debe configurar solo cuando se utilicen ranuras lógicas. -
Reinicie la instancia de base de datos para que el parámetro
rds.logical_replication
estático tenga efecto. -
Cree una ranura de replicación lógica como se indica en la siguiente sección. Este proceso necesita que especifique un complemento de descodificación. Actualmente, RDS for PostgreSQL admite los complementos de salida test_decoding y wal2json que se incluyen con PostgreSQL.
Para obtener más información acerca de la descodificación lógica de PostgreSQL, consulte la documentación de PostgreSQL
Trabajo con ranuras de replicación lógica
Puede usar comandos de SQL para trabajar con las ranuras lógicas. Por ejemplo, el siguiente comando crea una ranura lógica denominada test_slot
usando el complemento de salida predeterminado de PostgreSQL test_decoding
.
SELECT * FROM pg_create_logical_replication_slot('test_slot', 'test_decoding');
slot_name | xlog_position -----------------+--------------- regression_slot | 0/16B1970 (1 row)
Para ver las ranuras lógicas, use el siguiente comando.
SELECT * FROM pg_replication_slots;
Para eliminar una ranura lógica, use el siguiente comando.
SELECT pg_drop_replication_slot('test_slot');
pg_drop_replication_slot ----------------------- (1 row)
Para ver más ejemplos del trabajo con ranuras de replicación lógica, consulte Logical Decoding Examples
Luego de crear la ranura de replicación lógica, se puede iniciar el streaming. El siguiente ejemplo muestra cómo se controla la decodificación lógica a través del protocolo de replicación del streaming. Este ejemplo utiliza el programa pg_recvlogical, que se incluye en la distribución de PostgreSQL. Esto requiere que la autenticación del cliente se configure para permitir las conexiones de replicación.
pg_recvlogical -d postgres --slot test_slot -U postgres --host -
instance-name.111122223333
.aws-region
.rds.amazonaws.com -f - --start
Para ver el contenido de la vista pg_replication_origin_status
, consulte la función pg_show_replication_origin_status
.
SELECT * FROM pg_show_replication_origin_status();
local_id | external_id | remote_lsn | local_lsn ----------+-------------+------------+----------- (0 rows)
Replicación de datos de nivel de tabla mediante replicación lógica
Puede utilizar la replicación lógica para replicar los datos de las tablas de origen a las tablas de destino en RDS para PostgreSQL. La replicación lógica primero realiza una carga inicial de los datos existentes de las tablas de origen y, a continuación, continúa replicando los cambios en curso.
-
Creación de las tablas de origen
Conéctese a la base de datos de origen en la instancia de base de datos de RDS para PostgreSQL:
source=> CREATE TABLE testtab (slno int primary key); CREATE TABLE
-
Inserción de datos en las tablas de origen
source=> INSERT INTO testtab VALUES (generate_series(1,1000)); INSERT 0 1000
-
Creación de una publicación para las tablas de origen
-
Cree una publicación para las tablas de origen:
source=> CREATE PUBLICATION testpub FOR TABLE testtab; CREATE PUBLICATION
-
Utilice una consulta SELECT para verificar los detalles de la publicación que se creó:
source=> SELECT * FROM pg_publication; oid | pubname | pubowner | puballtables | pubinsert | pubupdate | pubdelete | pubtruncate | pubviaroot --------+---------+----------+--------------+-----------+-----------+-----------+-------------+------------ 115069 | testpub | 16395 | f | t | t | t | t | f (1 row)
-
Verifique que las tablas de origen se hayan agregado a la publicación:
source=> SELECT * FROM pg_publication_tables; pubname | schemaname | tablename ---------+------------+----------- testpub | public | testtab (1 rows)
-
Para replicar todas las tablas de una base de datos, utilice:
CREATE PUBLICATION testpub FOR ALL TABLES;
-
Si la publicación ya está creada para una tabla individual y necesita agregar una tabla nueva, puede ejecutar la siguiente consulta para agregar cualquier tabla nueva a la publicación existente:
ALTER PUBLICATION <publication_name> add table <new_table_name>;
-
-
Conéctese a la base de datos de destino y cree tablas de destino
-
Conéctese a la base de datos de destino en la instancia de base de datos de destino. Cree las tablas de destino con los mismos nombres que las tablas de origen:
target=> CREATE TABLE testtab (slno int primary key); CREATE TABLE
-
Asegúrese de que no haya datos presentes en las tablas de destino ejecutando una consulta SELECT en las tablas de destino:
target=> SELECT count(*) FROM testtab; count ------- 0 (1 row)
-
-
Cree y verifique la suscripción en la base de datos de destino
-
Cree la suscripción en la base de datos de destino:
target=> CREATE SUBSCRIPTION testsub CONNECTION 'host=<source RDS/host endpoint> port=5432 dbname=<source_db_name> user=<user> password=<password>' PUBLICATION testpub; NOTICE: Created replication slot "testsub" on publisher CREATE SUBSCRIPTION
-
Utilice una consulta SELECT para verificar que la suscripción esté habilitada:
target=> SELECT oid, subname, subenabled, subslotname, subpublications FROM pg_subscription; oid | subname | subenabled | subslotname | subpublications -------+---------+------------+-------------+----------------- 16434 | testsub | t | testsub | {testpub} (1 row)
-
Cuando se crea la suscripción, se cargan todos los datos de las tablas de origen en las tablas de destino. Ejecute una consulta SELECT en las tablas de destino para verificar que se cargan los datos iniciales:
target=> SELECT count(*) FROM testtab; count ------- 1000 (1 row)
-
-
Verificación de la ranura de replicación en la base de datos de origen
La creación de una suscripción en la base de datos de destino crea una ranura de replicación en la base de datos de origen. Verifique los detalles de la ranura de replicación ejecutando la siguiente consulta SELECT en la base de datos de origen:
source=> SELECT * FROM pg_replication_slots; slot_name | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn | wal_status | safe_wal_size ----------+----------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+---------------------+------------+--------------- testsub | pgoutput | logical | 115048 | source | f | t | 846 | | 6945 | 58/B4000568 | 58/B40005A0 | reserved | (1 row)
-
prueba de replicación
-
Compruebe si los cambios en los datos de las tablas de origen se están replicando en las tablas de destino insertando filas en las tablas de origen:
source=> INSERT INTO testtab VALUES(generate_series(1001,2000)); INSERT 0 1000 source=> SELECT count(*) FROM testtab; count ------- 2000 (1 row)
-
Verifique el número de filas en las tablas de destino para confirmar que se están replicando las nuevas inserciones:
target=> SELECT count(*) FROM testtab; count ------- 2000 (1 row)
-
-
Actualización de la suscripción después de agregar tablas
-
Cuando se agregan nuevas tablas a una publicación existente, es obligatorio actualizar la suscripción para que los cambios surtan efecto:
ALTER SUBSCRIPTION <subscription_name> REFRESH PUBLICATION;
-
Este comando obtiene la información de las tablas que faltan del publicador e inicia la replicación de las tablas que se agregaron a las publicaciones suscritas desde que se creó la suscripción o se actualizó por última vez.
-