pglogical
.
Para obtener más información, consulta Acerca de la extensión pglogical
y Terminología y componentes fundamentales de pglogical
.
Métodos de autenticación compatibles
Los dos principales métodos de autenticación que se usan con la extensión pglogical
son los métodos de autenticación por contraseña y por confianza.
El método de autenticación recomendado es el método de autenticación de confianza. Para obtener más información, consulta Métodos de autenticación admitidos.
Antes de comenzar
Puedes instalar pglogical
como una extensión dentro de una base de datos determinada.
Antes de implementar la extensión pglogical
en AlloyDB Omni, asegúrate de cumplir con los siguientes requisitos del sistema:
- Acceso a tu clúster de PostgreSQL que no es de AlloyDB como
superuser
. - La extensión
pglogical
está instalada en tu clúster de PostgreSQL que no es de AlloyDB. Para obtener instrucciones de instalación específicas de la versión y la distribución, consulta pglogical. - Un servidor de AlloyDB Omni instalado y configurado Para obtener instrucciones sobre cómo instalar AlloyDB Omni, consulta Instala AlloyDB Omni.
- Las direcciones IP del clúster de PostgreSQL que no es de AlloyDB y del servidor host de AlloyDB Omni.
- Una red establecida y segura entre el clúster de PostgreSQL que no es de AlloyDB y el servidor host de AlloyDB Omni. Se requiere conectividad TCP en el puerto estándar de PostgreSQL 5432.
Ajusta los parámetros en el proveedor que no es de AlloyDB
Establece el parámetro
wal_level
enlogical
y agregapglogical
al parámetroshared_preload_libraries
en el archivopostgresql.conf
. La extensiónpglogical
requiere un conjunto mínimo de ajustes de parámetros en el clúster del proveedor que no es de AlloyDB.cp postgresql.conf postgresql.bak
sed -r -i "s|(\#)?wal_level\s*=.*|wal_level=logical|" postgresql.conf
sed -r -i "s|(\#)?(shared_preload_libraries\s*=\s*)'(.*)'.*$|\2'\3,pglogical'|" postgresql.conf
sed -r -i "s|',|'|" postgresql.conf
Verifica que los parámetros estén configurados correctamente:
grep -iE 'wal_level|shared_preload_libraries' postgresql.conf
Reinicia tu clúster que no es de AlloyDB para que los cambios en los parámetros surtan efecto.
Es posible que otros parámetros ya estén configurados con valores suficientes o que requieran ajustes según la distribución y la versión que no sean de AlloyDB.
Verifica los siguientes parámetros:
max_worker_processes
: Uno por base de datos del proveedor y, al menos, uno por nodo suscriptor Al menos 10 es el estándar para este parámetro.max_replication_slots
: Uno por nodo en los nodos del proveedor.max_wal_senders
: Uno por nodo en los nodos del proveedor.track_commit_timestamp
: Se establece enon
si se requiere la resolución de conflictos en la que gana la última o la primera actualización.listen_addresses
: Debe incluir la dirección IP de AlloyDB Omni o mencionarla a través de un bloque CIDR de cobertura.
(Opcional) Si tu proveedor que no es de AlloyDB es Amazon RDS o Aurora, se debe habilitar la extensión pglogical y ajustar los parámetros requeridos a través de los ajustes de
cluster parameter group
.Dentro de un grupo de parámetros del clúster existente o nuevo, configura los siguientes parámetros:
- De
rds.logical_replication
a1
- De
max_replication_slots
a50
- De
max_wal_senders
a50
- De
max_worker_processes
a64
- De
shared_preload_libraries
apg_stat_statements, pglogical
- De
Reinicia tu clúster de Amazon RDS o Aurora para que se apliquen los ajustes del grupo de parámetros del clúster.
Confirma que todos los valores de los parámetros sean relevantes:
SELECT name, setting FROM pg_catalog.pg_settings WHERE name IN ('listen_addresses', 'wal_level', 'shared_preload_libraries', 'max_worker_processes', 'max_replication_slots', 'max_wal_senders', 'track_commit_timestamp') ORDER BY name;
Ajustes de autenticación basados en el host en el clúster del proveedor que no es de AlloyDB Omni
El pglogical
realiza conexiones TCP locales a la base de datos del proveedor. Por lo tanto, debes agregar la dirección IP del servidor host al archivo DATA_DIR/pg_hba.conf
de AlloyDB Omni, en el que DATA_DIR
es la ruta de acceso del sistema de archivos a tu directorio de datos (por ejemplo, /home/$USER/alloydb-data
).
Agrega una entrada de autenticación de confianza para el servidor local, específica para un usuario
pglogical_replication
nuevo, al archivoDATA_DIR/pg_hba.conf
.Además, los nodos suscriptores deben poder autenticarse en los nodos proveedores. Agrega la dirección IP de cada nodo de suscriptor o el rango de IP del bloque CIDR adecuado al archivo
DATA_DIR/pg_hba.conf
:echo -e "# pglogical entries: host all pglogical_replication samehost trust host all pglogical_replication SERVER_IP_ADDRESS/32 trust " | column -t | sudo tee -a DATA_DIR/pg_hba.conf
Reemplaza
SERVER_IP_ADDRESS
por la dirección IP de la instancia principal de AlloyDB Omni desde la que se realizará la replicación.Verifica que las entradas sean correctas:
tail -3 DATA_DIR/pg_hba.conf
Reinicia tu clúster que no es de AlloyDB para que los cambios en los parámetros surtan efecto.
Ajusta los parámetros del clúster de suscriptor de AlloyDB Omni
pglogical
también requiere un conjunto mínimo de ajustes de parámetros en el clúster de suscriptor de AlloyDB Omni. Debes agregar pglogical
al parámetro shared_preload_libraries
en el archivo DATA_DIR/postgresql.conf
. Si alguna base de datos dentro del clúster actúa como base de datos del proveedor, realiza los cambios de parámetros necesarios para las bases de datos del proveedor.
Ajusta los parámetros:
sudo sed -r -i "s|(shared_preload_libraries\s*=\s*)'(.*)'.*$|\1'\2,pglogical'|" DATA_DIR/postgresql.conf
Verifica que el parámetro esté configurado correctamente:
grep -iE 'shared_preload_libraries' DATA_DIR/postgresql.conf
Reinicia AlloyDB Omni para que se aplique el cambio de parámetro:
Docker
docker container restart CONTAINER_NAME
Reemplaza
CONTAINER_NAME
por el nombre que le asignaste al contenedor de AlloyDB Omni cuando lo iniciaste.Podman
podman container restart CONTAINER_NAME
Reemplaza
CONTAINER_NAME
por el nombre que le asignaste al contenedor de AlloyDB Omni cuando lo iniciaste.Establece los valores predeterminados de AlloyDB Omni para otros parámetros de la base de datos del proveedor:
max_worker_processes
: Uno por base de datos del proveedor y uno por nodo del suscriptor.track_commit_timestamp
: Se establece enon
si se requiere la resolución de conflictos de la última o primera actualización.
Confirma que todos los valores de los parámetros sean relevantes:
Docker
docker exec CONTAINER_NAME psql -h localhost -U postgres -c " SELECT name, setting FROM pg_catalog.pg_settings WHERE name IN ('listen_addresses', 'wal_level', 'shared_preload_libraries', 'max_worker_processes', 'max_replication_slots', 'max_wal_senders', 'track_commit_timestamp') ORDER BY name; "
Podman
podman exec CONTAINER_NAME psql -h localhost -U postgres -c " SELECT name, setting FROM pg_catalog.pg_settings WHERE name IN ('listen_addresses', 'wal_level', 'shared_preload_libraries', 'max_worker_processes', 'max_replication_slots', 'max_wal_senders', 'track_commit_timestamp') ORDER BY name; "
Ajustes de autenticación basados en el host en el clúster de suscriptor de AlloyDB Omni
pglogical
realiza conexiones TCP locales a la base de datos de suscriptor de AlloyDB Omni. Por lo tanto, debes agregar la dirección IP del servidor host del suscriptor al archivo DATA_DIR/pg_hba.conf
de AlloyDB Omni.
Agrega una entrada de autenticación de confianza para el servidor local, específica para un nuevo usuario de
pglogical_replication
, al archivoDATA_DIR/pg_hba.conf
:echo -e "# pglogical entries: host all pglogical_replication samehost trust " | column -t | sudo tee -a DATA_DIR/pg_hba.conf
Verifica que la entrada sea correcta:
tail -2 DATA_DIR/pg_hba.conf
Reinicia AlloyDB Omni para que se aplique el cambio de autenticación:
docker container restart CONTAINER_NAME
Crea un usuario pglogical
en los clústeres del proveedor y del suscriptor
Debes crear un usuario nuevo en el clúster del proveedor y en el del suscriptor.
pglogical
requiere que el usuario tenga los atributos superuser
y replication
.
En el clúster del proveedor de AlloyDB para PostgreSQL, crea el rol de usuario:
CREATE USER pglogical_replication LOGIN PASSWORD 'secret'; ALTER USER pglogical_replication WITH replication; ALTER USER pglogical_replication WITH superuser;
(Opcional) Si tu proveedor que no es de AlloyDB es Amazon RDS o Aurora, debes otorgar el siguiente rol:
GRANT rds_superuser TO replication_user;
Agrega pglogical
y nodos a la base de datos del proveedor que no es de AlloyDB
Otorga los privilegios necesarios.
Debes instalar la extensión
pglogical
en cada base de datos y otorgar el permisousage
al usuario de la base de datos pglogical.Por ejemplo, si tu base de datos es
my_test_db
, ejecuta el siguiente comando:CREATE EXTENSION IF NOT EXISTS pglogical; GRANT usage ON SCHEMA pglogical TO pglogical_replication;
Crea un nodo
pglogical
para las bases de datos del proveedor. Elnode_name
es arbitrario y la cadena dedsn
debe ser una conexión TCP válida a la misma base de datos.Por ejemplo, para la base de datos
my_test_db
, ejecuta el siguiente comando:SELECT pglogical.create_node(node_name := 'provider', dsn := 'host=SERVER_IP_ADDRESS port=5432 dbname=my_test_db user=pglogical_replication password=secret');
Crea una tabla y agrégala al conjunto de replicación predeterminado
Crea una tabla y agrégala al conjunto de replicación predeterminado en la base de datos del proveedor que no es de AlloyDB.
Crea una tabla de prueba llamada
test_table_1
en la base de datos del proveedor:CREATE TABLE test_table_1 (col1 INT PRIMARY KEY); INSERT INTO test_table_1 VALUES (1),(2),(3);
Agrega manualmente la tabla de prueba al conjunto de replicación predeterminado. Puedes crear conjuntos de replicación pglogical personalizados o usar los conjuntos de replicación predeterminados. Cuando creaste la extensión, se crearon varios conjuntos de replicación predeterminados, como
default
,default_insert_only
yddl_sql
. Puedes agregar tablas y secuencias a los conjuntos de replicación de forma individual o todas a la vez para un esquema especificado.-- Add the specified table to the default replication set: SELECT pglogical.replication_set_add_table(set_name := 'default', relation := 'test_table_1', synchronize_data := TRUE); -- Check which tables have been added to all replication sets: SELECT * FROM pglogical.replication_set_table;
Opcional: Agrega todas las tablas en un esquema especificado, como
public
:-- Add all "public" schema tables to the default replication set: SELECT pglogical.replication_set_add_all_tables('default', ARRAY['public']); -- Check which tables have been added to all replication sets: SELECT * FROM pglogical.replication_set_table; -- Add all "public" schema sequences to the default replication: SELECT pglogical.replication_set_add_all_sequences('default', ARRAY['public']); -- Check which sequences have been added to all replication sets: SELECT * FROM pglogical.replication_set_seq;
Quita la tabla del conjunto de replicación
default
. Si hay tablas en el esquema que no tienen una clave primaria o una identidad de réplica, solo se pueden replicar las instruccionesINSERT
. Si agregaste esas tablas al conjunto de replicacióndefault
automáticamente a través de la funciónreplication_set_add_all_tables
, debes quitarlas manualmente de ese conjunto de replicación y agregarlas al conjuntodefault_insert_only
.-- Remove the table from the **default** replication set: SELECT pglogical.replication_set_remove_table(set_name := 'default', relation := 'test_table_2'); -- Manually add to the **default_insert_only** replication set: SELECT pglogical.replication_set_add_table(set_name := 'default_insert_only', relation := 'test_table_2');
De manera opcional, si deseas agregar las tablas recién creadas al conjunto de replicación automáticamente, agrega el activador
pglogical_assign_repset
como se sugiere en la fuentepglogical
.
Copia la base de datos en el clúster de suscriptor de AlloyDB Omni
Crea una copia de seguridad solo del esquema de la base de datos de origen con la utilidad
pg_dump
.Ejecuta el comando
pg_dump
desde tu servidor suscriptor de AlloyDB Omni con la dirección IP o el extremo de tu servidor que no es de AlloyDB.pg_dump -h SERVER_IP_ADDRESS -U postgres --create --schema-only my_test_db > my_test_db.schema-only.sql
Importa la copia de seguridad a la base de datos de suscriptor en el servidor de AlloyDB Omni del suscriptor:
Docker
docker exec -i CONTAINER_NAME psql -h localhost -U postgres < my_test_db.schema-only.sql
Podman
podman exec -i CONTAINER_NAME psql -h localhost -U postgres < my_test_db.schema-only.sql
Esto crea la base de datos y el esquema, sin ninguno de los datos de las filas. La extensión pglogical
replica los datos de las filas. Copia o recrea manualmente cualquier otro usuario o rol que se requiera.
Crea un nodo y una suscripción en la base de datos del suscriptor de AlloyDB Omni
Crea un nodo en la base de datos de suscriptor de AlloyDB Omni. Agrega la contraseña a tu
dsn
si decides usar la autenticación con contraseña.Docker
docker exec CONTAINER_NAME psql -h localhost -U postgres -d my_test_db -c "
SELECT pglogical.create_node(node_name := 'subscriber', dsn := 'host=localhost port=5432 dbname=my_test_db user=pglogical_replication'); "
Podman
podman exec CONTAINER_NAME psql -h localhost -U postgres -d my_test_db -c "
SELECT pglogical.create_node(node_name := 'subscriber', dsn := 'host=localhost port=5432 dbname=my_test_db user=pglogical_replication'); "
Crea una suscripción en la base de datos del suscriptor que apunte a la base de datos del proveedor en el servidor del proveedor de AlloyDB Omni.
Docker
docker exec CONTAINER_NAME psql -h localhost -U postgres -d my_test_db -c "
SELECT pglogical.create_subscription(subscription_name := 'test_sub_1', provider_dsn := 'host=SERVER_IP_ADDRESS port=5432 dbname=my_test_db user=pglogical_replication password=secret'); "
Podman
podman exec CONTAINER_NAME psql -h localhost -U postgres -d my_test_db -c "
SELECT pglogical.create_subscription(subscription_name := 'test_sub_1', provider_dsn := 'host=SERVER_IP_ADDRESS port=5432 dbname=my_test_db user=pglogical_replication password=secret'); "
En cuestión de segundos o minutos, los datos iniciales deberían replicarse del proveedor al suscriptor:
Docker
docker exec CONTAINER_NAME psql -h localhost -U postgres -d my_test_db -c "
SELECT * FROM test_table_1 ORDER BY 1; "
Podman
podman exec CONTAINER_NAME psql -h localhost -U postgres -d my_test_db -c "
SELECT * FROM test_table_1 ORDER BY 1; "
Las filas adicionales que se agregan a la base de datos del proveedor también se replican en tiempo real en cuestión de segundos.
Consideraciones adicionales para la implementación de pglogical
La extensión pglogical
tiene muchas funciones avanzadas que no se describen en este documento. Muchas de estas funciones se pueden aplicar a tu implementación. Puedes considerar las siguientes funciones avanzadas:
- Resolución de conflictos
- Replicación bidireccional y multimaster
- Inclusión de secuencias
- Procedimientos de cambio y conmutación por error
¿Qué sigue?
- Replica datos entre AlloyDB para PostgreSQL y AlloyDB Omni
- Conmutación y conmutación por error con replicación de
pglogical