Replicación por Streaming de PostgreSQL

PostgreSQLBeginner
Practicar Ahora

Introducción

En este laboratorio, aprenderá a configurar la replicación por streaming de PostgreSQL. Esta potente función le permite mantener una copia en vivo y de solo lectura de su base de datos principal en un servidor secundario, conocido como réplica. La réplica recibe y aplica continuamente los cambios de datos de la principal, lo que la hace útil para alta disponibilidad, balanceo de carga de consultas de lectura y copias de seguridad.

Recorrerá todo el proceso, comenzando por la configuración del servidor principal para permitir la replicación. Luego, creará un servidor réplica realizando una copia de seguridad base. Finalmente, iniciará la réplica, probará el flujo de datos entre los dos servidores y verá cómo la réplica se mantiene sincronizada con la principal.

Configurar el Servidor Principal para Replicación

En este primer paso, configurará el servidor PostgreSQL principal para prepararlo para la replicación. Esto implica modificar sus archivos de configuración para permitir conexiones de red, habilitar el nivel necesario de Write-Ahead Log (WAL) y crear un usuario especial para la replicación.

1. Modificar el Archivo de Configuración de PostgreSQL

Para prepararse para la replicación, necesita modificar el archivo de configuración principal, postgresql.conf. Editar este archivo grande manualmente con un editor de texto como nano puede ser desafiante y propenso a errores debido a la gran cantidad de opciones. Un método más eficiente y confiable es usar herramientas de línea de comandos para ver y actualizar las configuraciones específicas que necesita cambiar. Esto evita tener que desplazarse por cientos de líneas y previene errores accidentales.

Primero, verifiquemos los valores actuales de las configuraciones que necesitamos modificar: listen_addresses, wal_level y max_wal_senders.

CONF_FILE="/etc/postgresql/14/main/postgresql.conf"
echo "--- Current Settings ---"
sudo grep -E "^#?\s*(listen_addresses|wal_level|max_wal_senders)" $CONF_FILE

Probablemente verá estas líneas comentadas con un #.

Ahora, actualicemos estas configuraciones automáticamente. Los siguientes comandos harán una copia de seguridad del archivo de configuración y luego actualizarán cada parámetro requerido.

CONF_FILE="/etc/postgresql/14/main/postgresql.conf"
## Create a backup before making changes
sudo cp $CONF_FILE ${CONF_FILE}.bak.$(date +%s)

## Set listen_addresses to allow connections from any IP address
sudo sed -i -E "s/^[#\s]*listen_addresses\s*=.*/listen_addresses = '*'/" "$CONF_FILE"

## Set wal_level to 'replica' to enable replication logs
sudo sed -i -E "s/^[#\s]*wal_level\s*=.*/wal_level = replica/" "$CONF_FILE"

## Set the maximum number of concurrent replication connections
sudo sed -i -E "s/^[#\s]*max_wal_senders\s*=.*/max_wal_senders = 10/" "$CONF_FILE"

Finalmente, verifiquemos que los cambios se aplicaron correctamente. El siguiente comando mostrará los nuevos valores, filtrando cualquier línea comentada.

echo "--- Verified Settings ---"
sudo grep -E "^(listen_addresses|wal_level|max_wal_senders)" $CONF_FILE

La salida debería mostrar la configuración actualizada y activa:

listen_addresses = '*'
wal_level = replica
max_wal_senders = 10

Con estas configuraciones confirmadas, el servidor está correctamente preparado para los siguientes pasos.

2. Crear un Usuario Dedicado para Replicación

Es una buena práctica usar un usuario dedicado para la replicación en lugar de un superusuario. Creemos un rol llamado replicator.

Conéctese a PostgreSQL usando el cliente de línea de comandos psql:

sudo -u postgres psql

Ahora, ejecute el siguiente comando SQL para crear el usuario con privilegios de replicación y una contraseña:

CREATE ROLE replicator WITH REPLICATION LOGIN PASSWORD 'replicapass';

Debería ver la salida CREATE ROLE. Ahora, salga del cliente psql:

\q

3. Permitir la Conexión de Replicación

A continuación, deberá configurar el servidor para permitir que el usuario replicator se conecte desde el servidor réplica. Hará esto editando el archivo pg_hba.conf.

Abra el archivo con nano:

sudo nano /etc/postgresql/14/main/pg_hba.conf

Agregue la siguiente línea al final del archivo. Esta regla especifica que al usuario replicator se le permite conectarse a la pseudo-base de datos replication desde cualquier dirección IP (0.0.0.0/0). Para este laboratorio, usamos 127.0.0.1/32 ya que ambos servidores están en la misma máquina.

host    replication     replicator      127.0.0.1/32            md5

Presione Ctrl+X, Y y Enter para guardar y salir.

4. Reiniciar el Servidor Principal

Para aplicar todos estos cambios de configuración, debe reiniciar el servicio de PostgreSQL.

sudo service postgresql restart

El servidor principal ahora está listo para aceptar conexiones de replicación.

Crear la Réplica a partir de una Copia de Seguridad Base

Con el servidor principal configurado, el siguiente paso es crear la réplica. La forma estándar de hacerlo es tomando una "copia de seguridad base" (base backup) del servidor principal. Esto crea una copia idéntica del directorio de datos de la principal, que servirá como punto de partida para la réplica.

1. Crear un Directorio de Datos para la Réplica

Primero, cree un nuevo directorio donde se almacenarán los datos de la réplica. Es una buena práctica crearlo en una ubicación del sistema, no en el directorio de inicio de un usuario, para evitar problemas de permisos. Lo crearemos como el usuario postgres en el directorio estándar de PostgreSQL.

sudo -u postgres mkdir -p /var/lib/postgresql/14/replica

2. Tomar la Copia de Seguridad Base

Ahora, use la utilidad pg_basebackup para copiar los datos del servidor principal. Este comando se conectará a la principal como el usuario replicator y transmitirá los datos al nuevo directorio de la réplica. Dado que creó el directorio como el usuario postgres, no hay problemas de permisos que resolver.

Ejecute el siguiente comando. Se le pedirá la contraseña del usuario replicator, que es replicapass.

sudo -u postgres pg_basebackup -h localhost -p 5432 -U replicator -D /var/lib/postgresql/14/replica -P -v -R

Analicemos este comando:

  • sudo -u postgres: Ejecuta el comando como el usuario del sistema postgres, que tiene los permisos necesarios.
  • pg_basebackup: La utilidad para tomar copias de seguridad base.
  • -h localhost -p 5432: Especifica el host y el puerto del servidor principal.
  • -U replicator: El nombre de usuario con el que conectarse.
  • -D /var/lib/postgresql/14/replica: El directorio de destino para la copia de seguridad.
  • -P: Muestra un informe de progreso.
  • -R: Esta es una opción muy útil. Crea un archivo standby.signal y agrega la configuración de conexión al archivo postgresql.auto.conf en el directorio de destino, lo que configura automáticamente el nuevo directorio de datos como una réplica.

3. Copiar Archivos de Configuración

La copia de seguridad base copia los archivos de datos principales, pero en muchos sistemas basados en Debian (como este entorno Ubuntu), los archivos de configuración (pg_hba.conf y pg_ident.conf) se almacenan por separado en /etc/postgresql/ y no se incluyen en la copia de seguridad. Debe copiarlos manualmente al directorio de datos de la réplica. Después de copiarlos, también debe asegurarse de que sean propiedad del usuario postgres para que el proceso del servidor pueda leerlos.

sudo cp /etc/postgresql/14/main/pg_hba.conf /var/lib/postgresql/14/replica/
sudo cp /etc/postgresql/14/main/pg_ident.conf /var/lib/postgresql/14/replica/
sudo chown postgres:postgres /var/lib/postgresql/14/replica/pg_hba.conf
sudo chown postgres:postgres /var/lib/postgresql/14/replica/pg_ident.conf

Con los archivos de datos y la configuración en su lugar, el directorio de la réplica está listo para los pasos finales de configuración.

Configurar e Iniciar el Servidor Réplica

La copia de seguridad base ha preparado el directorio de datos de la réplica. Sin embargo, dado que está ejecutando tanto el servidor principal como el réplica en la misma máquina, no pueden usar el mismo puerto de red (el predeterminado es 5432). En este paso, configurará la réplica para usar un puerto diferente y luego la iniciará.

1. Configurar el Puerto de la Réplica

Edite el archivo postgresql.conf dentro del directorio de datos de la réplica para cambiar su puerto de escucha. Tenga en cuenta que necesita sudo porque este archivo ahora es propiedad del usuario postgres.

sudo nano /var/lib/postgresql/14/replica/postgresql.conf

Agregue la siguiente línea al final del archivo para establecer el puerto en 5433:

port = 5433

Presione Ctrl+X, Y y Enter para guardar y salir.

2. Establecer Permisos del Directorio de Datos

Por seguridad, PostgreSQL requiere que su directorio de datos no sea accesible por otros usuarios. Debe establecer sus permisos en 700, lo que otorga permisos de lectura, escritura y ejecución solo al propietario (postgres).

sudo chmod 0700 /var/lib/postgresql/14/replica

3. Iniciar el Servidor Réplica

Ahora puede iniciar el servidor réplica. Usará pg_ctl, una utilidad estándar de PostgreSQL para controlar un servidor de base de datos.

Ejecute el siguiente comando para iniciar la réplica. Debe usar la ruta completa a pg_ctl porque el comando sudo podría no saber dónde encontrarlo de otra manera. También especificaremos un archivo de registro en /tmp para que sea fácil verificar el estado del servidor.

sudo -u postgres /usr/lib/postgresql/14/bin/pg_ctl -D /var/lib/postgresql/14/replica -l /tmp/replica.log start
  • pg_ctl: La utilidad de control del servidor.
  • -D /var/lib/postgresql/14/replica: Especifica el directorio de datos para esta instancia del servidor.
  • -l /tmp/replica.log: Especifica el archivo de registro.
  • start: La acción a realizar.

Debería ver el mensaje:

waiting for server to start.... done
server started

4. Verificar el Archivo de Registro de la Réplica

Para confirmar que la réplica se inició correctamente y se conectó a la principal, vea su archivo de registro con sudo ya que es propiedad del usuario postgres:

sudo cat /tmp/replica.log

Busque líneas que indiquen que el sistema de base de datos está listo para aceptar conexiones de solo lectura y que ha comenzado a transmitir desde la principal. Debería ver algo similar a esto:

...
LOG:  database system is ready to accept read-only connections
LOG:  started streaming WAL from primary at 0/4000000 on timeline 1
...

Esto confirma que su servidor réplica está activo, funcionando y conectado exitosamente a la principal.

Probar la Replicación

Ahora que ambos servidores están en funcionamiento, es hora de probar si la replicación está funcionando como se espera. Creará una tabla en el servidor principal y verificará que aparezca en la réplica. También confirmará que la réplica es de solo lectura.

1. Comprobar el Estado de la Replicación en la Principal

Primero, conéctese al servidor principal (en el puerto 5432) y compruebe la vista pg_stat_replication. Esta vista proporciona información de monitoreo sobre las réplicas conectadas.

sudo -u postgres psql -p 5432

Ejecute esta consulta:

SELECT client_addr, state, sync_state FROM pg_stat_replication;

La salida debería mostrar su réplica conectada, con su estado como streaming y sync_state como async o sync.

 client_addr |   state   | sync_state
-------------+-----------+------------
 127.0.0.1   | streaming | async
(1 row)

2. Crear Datos en la Principal

Mientras aún está conectado a la principal, cree una nueva tabla e inserte algunos datos:

CREATE TABLE replication_test (id INT, message TEXT);
INSERT INTO replication_test VALUES (1, 'Hello from primary!');

Ahora, consulte la tabla para confirmar que los datos están allí:

SELECT * FROM replication_test;

Debería ver la fila que acaba de insertar. Salga del shell psql de la principal:

\q

3. Verificar Datos en la Réplica

Abra una nueva terminal o use la que ya tiene para conectarse al servidor réplica en el puerto 5433. Deberá proporcionar la contraseña del usuario postgres, que es labex.

psql -h localhost -p 5433 -U postgres -d postgres

Ahora, consulte la tabla replication_test en la réplica:

SELECT * FROM replication_test;

Debería ver exactamente los mismos datos que creó en la principal. ¡Esto confirma que la replicación por streaming está funcionando!

 id |      message
----+---------------------
  1 | Hello from primary!
(1 row)

4. Probar la Naturaleza de Solo Lectura de la Réplica

Intente insertar datos en la tabla de la réplica:

INSERT INTO replication_test VALUES (2, 'Hello from replica?');

El comando fallará con un error porque un servidor réplica está en modo de solo lectura por defecto.

ERROR:  cannot execute INSERT in a read-only transaction

Este es un comportamiento esperado y una característica clave de una réplica de streaming. Salga del shell psql de la réplica:

\q

Limpiar el Entorno

En este paso final, detendrá los servidores y eliminará los archivos y directorios creados durante el laboratorio para devolver el entorno a su estado inicial.

1. Detener el Servidor Réplica

Primero, detenga el servidor réplica usando pg_ctl. Recuerde usar la ruta completa al ejecutable.

sudo -u postgres /usr/lib/postgresql/14/bin/pg_ctl -D /var/lib/postgresql/14/replica stop

Verá un mensaje de confirmación de que el servidor se ha detenido.

waiting for server to shut down.... done
server stopped

2. Detener el Servidor Principal

A continuación, detenga el servidor principal usando el comando service.

sudo service postgresql stop

3. Eliminar Datos y Registros de la Réplica

Ahora que los servidores están detenidos, puede eliminar de forma segura el directorio de datos de la réplica y el archivo de registro que creó. Tenga en cuenta que se requiere sudo ya que estos archivos son propiedad del usuario postgres.

sudo rm -rf /var/lib/postgresql/14/replica /tmp/replica.log

Esto completa el proceso de limpieza. Ha configurado, probado y desmantelado con éxito un entorno de replicación por streaming de PostgreSQL.

Resumen

En este laboratorio, configuró con éxito la replicación por streaming de PostgreSQL desde cero. Aprendió a preparar un servidor principal modificando postgresql.conf y pg_hba.conf y creando un usuario de replicación dedicado. Luego utilizó pg_basebackup para crear una réplica y la configuró para que se ejecutara en un puerto separado.

Al probar la configuración, verificó que los datos escritos en el servidor principal se replican automáticamente al servidor secundario en tiempo casi real. También confirmó que un servidor réplica es de solo lectura, lo cual es un aspecto fundamental de su diseño. Estas habilidades son esenciales para administrar implementaciones de PostgreSQL robustas y escalables.