Restablecimiento de la replicación lógica después de una actualización principal
Para poder realizar una actualización de una versión principal de un clúster de base de datos de Aurora PostgreSQL que se haya configurado como nodo publicador para la replicación lógica, debe eliminar todas las ranuras de replicación, incluso las que no estén activas. Se recomienda desviar temporalmente las transacciones de la base de datos del nodo publicador, eliminar las ranuras de replicación, actualizar el clúster de base de datos de Aurora PostgreSQL, y, a continuación, restablecer y reiniciar la replicación.
Las ranuras de replicación se alojan únicamente en el nodo publicador. El nodo suscriptor de Aurora PostgreSQL en un escenario de replicación lógica no tiene ranuras que eliminar. El proceso de actualización de la versión principal de Aurora PostgreSQL permite actualizar el suscriptor a una nueva versión principal de PostgreSQL independiente del nodo publicador. Sin embargo, el proceso de actualización interrumpe el proceso de replicación e interfiere con la sincronización de los datos WAL entre el nodo publicador y el nodo suscriptor. Debe restablecer la replicación lógica entre el publicador y el suscriptor después de actualizar el publicador, el suscriptor o ambos. En el procedimiento siguiente se muestra cómo determinar que se ha interrumpido la replicación y cómo resolver el problema.
Determinación de que la replicación lógica se ha interrumpido
Puede determinar que el proceso de replicación se ha interrumpido consultando el nodo publicador o el nodo suscriptor de la siguiente manera.
Para comprobar el nodo publicador
-
Utilice
psql
para conectarse al nodo publicador y, a continuación, consulte la funciónpg_replication_slots
. Anote el valor de la columna activa. Normalmente, esto devolverát
(true) y mostrará que la replicación está activa. Si la consulta devuelvef
(false), indica que la replicación en el suscriptor se ha detenido.SELECT slot_name,plugin,slot_type,active FROM pg_replication_slots;
slot_name | plugin | slot_type | active -------------------------------------------+------------------+-----------+-------- pgl_labdb_docs_labcb4fa94_docs_lab3de412c | pglogical_output | logical | f (1 row)
Para comprobar el nodo suscriptor
En el nodo suscriptor, puede comprobar el estado de la replicación de tres maneras diferentes.
-
Revise los registros de PostgreSQL en el nodo suscriptor para encontrar los mensajes de error. El registro identifica el error con mensajes que incluyen el código de salida 1, como se muestra a continuación.
2022-07-06 16:17:03 UTC::@:[7361]:LOG: background worker "pglogical apply 16404:2880255011" (PID 14610) exited with exit code 1 2022-07-06 16:19:44 UTC::@:[7361]:LOG: background worker "pglogical apply 16404:2880255011" (PID 21783) exited with exit code 1
-
Consulte la función
pg_replication_origin
. Conéctese a la base de datos en el nodo suscriptor mediantepsql
y consulte la funciónpg_replication_origin
de la siguiente manera.SELECT * FROM pg_replication_origin;
roident | roname ---------+-------- (0 rows)
Un conjunto de resultados vacío significa que la replicación se ha interrumpido. Debería ver una salida como la siguiente.
roident | roname ---------+---------------------------------------------------- 1 | pgl_labdb_docs_labcb4fa94_docs_lab3de412c (1 row)
-
Consulte la función
pglogical.show_subscription_status
tal y como se muestra en el siguiente ejemplo.SELECT subscription_name,status,slot_name FROM pglogical.show_subscription_status();
subscription_name | status | slot_name ---====----------------+--------+------------------------------------- docs_lab_subscription | down | pgl_labdb_docs_labcb4fa94_docs_lab3de412c (1 row)
Este resultado muestra que la replicación se ha interrumpido. Su estado es
down
. Normalmente, la salida muestra el estado comoreplicating
.
Si el proceso de replicación lógica se ha interrumpido, puede restablecerla siguiendo estos pasos.
Para restablecer la replicación lógica entre los nodos publicador y suscriptor
Para restablecer la replicación, primero debe desconectar el suscriptor del nodo publicador y, a continuación, restablecer la suscripción, tal como se describe en estos pasos.
-
Conéctese al nodo suscriptor con
psql
de la siguiente manera.psql --host=
222222222222
.aws-region
.rds.amazonaws.com --port=5432 --username=postgres
--password --dbname=labdb
-
Desactive la suscripción mediante la función
pglogical.alter_subscription_disable
.SELECT pglogical.alter_subscription_disable('docs_lab_subscription',true);
alter_subscription_disable ---------------------------- t (1 row)
-
Obtenga el identificador del nodo publicador consultando el
pg_replication_origin
de la siguiente manera.SELECT * FROM pg_replication_origin;
roident | roname ---------+------------------------------------- 1 | pgl_labdb_docs_labcb4fa94_docs_lab3de412c (1 row)
-
Utilice la respuesta del paso anterior con el comando
pg_replication_origin_create
para asignar el identificador que podrá utilizar la suscripción cuando se restablezca.SELECT pg_replication_origin_create('pgl_labdb_docs_labcb4fa94_docs_lab3de412c');
pg_replication_origin_create ------------------------------ 1 (1 row)
-
Para activar la suscripción, introduzca su nombre con un estado de
true
, tal como se muestra en el ejemplo siguiente.SELECT pglogical.alter_subscription_enable('docs_lab_subscription',true);
alter_subscription_enable --------------------------- t (1 row)
Compruebe el estado del nodo. Su estado debería ser replicating
, tal y como se muestra en este ejemplo.
SELECT subscription_name,status,slot_name FROM pglogical.show_subscription_status();
subscription_name | status | slot_name -------------------------------+-------------+------------------------------------- docs_lab_subscription | replicating | pgl_labdb_docs_lab98f517b_docs_lab3de412c (1 row)
Compruebe el estado de la ranura de replicación del suscriptor en el nodo publicador. La columna active
de la ranura debe devolver t
(true), lo que indica que se ha restablecido la replicación.
SELECT slot_name,plugin,slot_type,active FROM pg_replication_slots;
slot_name | plugin | slot_type | active -------------------------------------------+------------------+-----------+-------- pgl_labdb_docs_lab98f517b_docs_lab3de412c | pglogical_output | logical | t (1 row)