Replicación lógica con Postgres y pglogical

David Castro
4 min readFeb 3, 2021

--

Photo by Christina @ wocintechchat.com on Unsplash

¿Qué es la replicación lógica?

La replicación lógica es un método para replicar objetos de datos y sus cambios, en función de su identidad de replicación (generalmente una clave principal — Primary Key). Usamos el término lógico en contraste con la replicación física, que usa direcciones de bloque exactas y replicación byte por byte. PostgreSQL admite ambos mecanismos al mismo tiempo. La replicación lógica permite un control detallado tanto de la replicación como de la seguridad de los datos.

La replicación lógica utiliza un modelo de publicación y suscripción con uno o más suscriptores que se suscriben a una o más publicaciones en un nodo de editor . Los suscriptores extraen datos de las publicaciones a las que se suscriben y posteriormente pueden volver a publicar datos para permitir la replicación en cascada o configuraciones más complejas.

La replicación lógica de una tabla generalmente comienza con tomar una instantánea de los datos en la base de datos del editor y copiarla al suscriptor. Una vez hecho esto, los cambios en el editor se envían al suscriptor a medida que ocurren en tiempo real. El suscriptor aplica los datos en el mismo orden que el editor para garantizar la coherencia transaccional para las publicaciones dentro de una sola suscripción.

Los casos de uso típicos para la replicación lógica son:

  • Enviar cambios incrementales en una sola base de datos o un subconjunto de una base de datos a los suscriptores a medida que ocurren.
  • Activar triggers para cambios individuales a medida que llegan al suscriptor.
  • Consolidar múltiples bases de datos en una sola (por ejemplo, con fines analíticos).
  • Replicar entre diferentes versiones principales de PostgreSQL.
  • Replicar entre instancias de PostgreSQL en diferentes plataformas (por ejemplo, de Linux a Windows)
  • Dar acceso a datos replicados a diferentes grupos de usuarios.
  • Compartir un subconjunto de la base de datos entre varias bases de datos.

Instantánea inicial

Los datos iniciales de las tablas suscritas existentes se capturan y copian en una instancia paralela de un tipo especial de proceso de aplicación. Este proceso creará su propia ranura de replicación temporal y copiará los datos existentes. Una vez que se copian los datos existentes, el trabajador ingresa al modo de sincronización, lo que asegura que la tabla se lleve a un estado sincronizado con el proceso de aplicación principal al transmitir cualquier cambio que ocurriera durante la copia de datos inicial utilizando la replicación lógica estándar. Una vez realizada la sincronización, el control de la replicación de la tabla se devuelve al proceso de aplicación principal, donde la replicación continúa con normalidad.

Arquitectura

La replicación lógica comienza copiando una instantánea de los datos en la base de datos del editor. Una vez hecho esto, los cambios en el editor se envían al suscriptor a medida que ocurren en tiempo real. El suscriptor aplica los datos en el orden en que se realizaron las confirmaciones en el editor para garantizar la coherencia transaccional de las publicaciones dentro de una única suscripción.

Uso básico

La replicación lógica utiliza un modelo de publicación / suscripción, por lo que creamos publicaciones en el flujo ascendente (o editor) y suscripciones en el flujo descendente (o suscriptor).

Antes de que realmente podamos hacer eso, necesitamos cambiar un poco la configuración de PostgreSQL.

Configuración básica

Para empezar, el servidor PostgreSQL debe estar correctamente configurado para soportar la decodificación lógica, este procedimiento se debe realizar en el archivo postgresql.conf

wal_level = 'logical'
max_worker_processes = 10 # one per database needed on provider node
# one per node needed on subscriber node
max_replication_slots = 10 # one per node needed on provider node
max_wal_senders = 10 # one per node needed on provider node
shared_preload_libraries = 'pglogical'

El archivo de configuración pg_hba.conf debe permitir conexiones de replicación desde el localhost.

local   all     all                     trust
host all all all trust
host all all ::1/128 trust
local replication all trust
host replication all all trust
host replication all ::1/128 trust
host all all all md5

Luego, la extensión pglogical tiene que ser instalada en todos los nodos:

CREATE EXTENSION pglogical;

Ahora cree el nodo proveedor:

SELECT pglogical.create_node(
node_name := 'provider',
dsn := 'host=providerhost port=5432 dbname=provider'
);

Añada todas las tablas del esquema public al conjunto de replicación default .

SELECT pglogical.replication_set_add_all_tables('default', ARRAY['public']);

Tras la configuración del nodo proveedor, los suscriptores podrán suscribirse al mismo. Pero primero deberá crearse el nodo suscriptor:

SELECT pglogical.create_node(
node_name := 'subscriber',
dsn := 'host=subscriberhost port=5432 dbname=subscriber'
);

Finalmente, en el nodo suscriptor, podrá crear la suscripción que iniciará, en segundo plano, el proceso de sincronización y replicación:

SELECT pglogical.create_subscription(
subscription_name := 'subscription1',
provider_dsn := 'host=providerhost port=5432 dbname=provider'
);

Para ver un ejemplo completo, con cada nodo y sus respectivas configuraciones en Docker, visita el siguiente link:

Referencias

--

--

David Castro
David Castro

Written by David Castro

🚀 Software Engineer with a master’s in Software Development, working as a 🖥️ Backend Developer using 🐍 Python.

No responses yet