Replicación en Streaming de PostgreSQL

PostgreSQLPostgreSQLBeginner
Practicar Ahora

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

En este laboratorio, aprenderá cómo configurar la replicación de streaming de PostgreSQL (PostgreSQL streaming replication). Este mecanismo envía y aplica continuamente registros de Write-Ahead Logging (WAL) desde un servidor primario a un servidor réplica, asegurando una sincronización de datos casi en tiempo real.

Configurará una réplica de streaming, verificará el replication lag (retraso de replicación) y el estado, consultará datos desde la réplica y apagará la replicación de forma segura. Esto implica preparar el servidor primario modificando postgresql.conf para permitir conexiones desde la réplica, configurando el wal_level a replica y ajustando max_wal_senders.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL postgresql(("PostgreSQL")) -.-> postgresql/PostgreSQLGroup(["PostgreSQL"]) postgresql/PostgreSQLGroup -.-> postgresql/db_setup("Create New Database") postgresql/PostgreSQLGroup -.-> postgresql/db_access("Connect To Database") postgresql/PostgreSQLGroup -.-> postgresql/data_all("Select All Data") postgresql/PostgreSQLGroup -.-> postgresql/db_status("Check Database Status") postgresql/PostgreSQLGroup -.-> postgresql/db_drop("Drop Entire Database") subgraph Lab Skills postgresql/db_setup -.-> lab-550962{{"Replicación en Streaming de PostgreSQL"}} postgresql/db_access -.-> lab-550962{{"Replicación en Streaming de PostgreSQL"}} postgresql/data_all -.-> lab-550962{{"Replicación en Streaming de PostgreSQL"}} postgresql/db_status -.-> lab-550962{{"Replicación en Streaming de PostgreSQL"}} postgresql/db_drop -.-> lab-550962{{"Replicación en Streaming de PostgreSQL"}} end

Configurar el Servidor Primario

En este paso, configurará el servidor primario de PostgreSQL para permitir la replicación de streaming (streaming replication). Esto implica modificar los archivos postgresql.conf y pg_hba.conf.

  1. Conectarse al servidor PostgreSQL:

    Abra una terminal y conéctese al servidor PostgreSQL como el usuario postgres:

    sudo -u postgres psql
  2. Modificar postgresql.conf:

    Salga del shell psql escribiendo \q y presionando Enter.

    Ahora, abra el archivo postgresql.conf usando nano:

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

    Localice los siguientes parámetros y modifíquelos de la siguiente manera:

    • listen_addresses: Cámbielo a '*' para permitir conexiones desde cualquier dirección. Para entornos de producción, se recomienda restringir esto a la dirección IP de la réplica.

      listen_addresses = '*'
    • wal_level: Establézcalo en replica. Esto asegura que se escriba suficiente información en el WAL para la replicación.

      wal_level = replica
    • max_wal_senders: Establézcalo en 10. Esto especifica el número máximo de conexiones concurrentes desde servidores en espera (standby servers).

      max_wal_senders = 10

    Guarde los cambios y salga de nano.

  3. Modificar pg_hba.conf:

    Abra el archivo pg_hba.conf:

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

    Agregue la siguiente línea al final del archivo para permitir que el servidor réplica se conecte para la replicación. Dado que esta es una configuración de una sola máquina, usaremos 127.0.0.1.

    host    replication     all             127.0.0.1/32            trust

    Guarde los cambios y salga de nano.

  4. Reiniciar el Servidor Primario:

    Reinicie el servidor PostgreSQL para aplicar los cambios:

    sudo pg_ctlcluster 14 main restart

    Debería ver una salida similar a:

    Waiting for server to shut down.... done
    server stopped
    server starting

Configurar el Servidor Réplica

En este paso, configurará el servidor réplica para recibir registros WAL (WAL records) desde el servidor primario.

  1. Detener el Servidor Primario:

    Detenga el servidor primario de PostgreSQL:

    sudo pg_ctlcluster 14 main stop
  2. Tomar una Copia de Seguridad Base (Base Backup):

    Tome una copia de seguridad base del directorio de datos del servidor primario utilizando pg_basebackup. Esto copiará los archivos de datos al directorio de datos de la réplica (~/project/replica_data).

    sudo pg_basebackup -h localhost -p 5432 -U postgres -D ~/project/replica_data -X stream -P -v

    Se le pedirá la contraseña del usuario postgres. Ingrese labex.

  3. Crear un Archivo standby.signal:

    Cree un archivo standby.signal en el directorio de datos de la réplica. Este archivo indica a PostgreSQL que esta instancia debe iniciarse como un hot standby (espera activa).

    touch ~/project/replica_data/standby.signal
  4. Iniciar el Servidor Réplica:

    Inicie el servidor réplica, apuntándolo al directorio ~/project/replica_data:

    sudo pg_ctlcluster 14 main start -D ~/project/replica_data

Verificar el Estado de la Replicación y Crear una Tabla de Prueba

En este paso, verificará el estado de la replicación y creará una tabla de prueba en el servidor primario para verificar la replicación.

  1. Conectarse al Servidor Primario:

    Conéctese al servidor primario de PostgreSQL:

    sudo -u postgres psql
  2. Verificar el Estado de la Replicación:

    Ejecute la siguiente consulta SQL para ver el estado de la replicación:

    SELECT
        pid,
        client_addr,
        state,
        sync_state,
        pg_wal_lsn_diff(pg_current_wal_lsn(), sent_lsn) AS write_lag,
        pg_wal_lsn_diff(pg_current_wal_lsn(), replay_lsn) AS replay_lag
    FROM pg_stat_replication;

    Esta consulta muestra información sobre la conexión de replicación. Un write_lag y replay_lag cercanos a 0 indican que la réplica está sincronizada.

  3. Crear una Tabla de Prueba:

    Cree una tabla llamada test_table:

    CREATE TABLE test_table (
        id SERIAL PRIMARY KEY,
        name VARCHAR(255)
    );

    Inserte algunos datos en la tabla:

    INSERT INTO test_table (name) VALUES ('Replica Test Data 1');
    INSERT INTO test_table (name) VALUES ('Replica Test Data 2');

    Salga de psql en el servidor primario:

    \q

Consultar Datos desde el Servidor Réplica

En este paso, se conectará al servidor réplica y consultará la test_table para verificar que los datos se hayan replicado.

  1. Conectarse al Servidor Réplica:

    Conéctese al servidor réplica de PostgreSQL:

    sudo -u postgres psql -h localhost -p 5432 -d postgres -W

    Se le pedirá la contraseña para el usuario postgres. Ingrese labex.

  2. Consultar la test_table:

    Ejecute la siguiente consulta para seleccionar todos los datos de la test_table:

    SELECT * FROM test_table;

    Debería ver los datos que insertó en el servidor primario:

     id |       name
    ----+-----------------------
      1 | Replica Test Data 1
      2 | Replica Test Data 2
    (2 rows)

    Si ve los datos, la replicación está funcionando correctamente.

  3. Insertar Más Datos en el Servidor Primario:

    Vuelva a la terminal conectada al servidor primario e inserte una nueva fila:

    sudo -u postgres psql -c "INSERT INTO test_table (name) VALUES ('Replica Test Data 3');"
  4. Consultar el Servidor Réplica Nuevamente:

    Vuelva a la terminal conectada al servidor réplica y ejecute la consulta de selección nuevamente:

    SELECT * FROM test_table;

    Ahora debería ver los nuevos datos:

     id |       name
    ----+-----------------------
      1 | Replica Test Data 1
      2 | Replica Test Data 2
      3 | Replica Test Data 3
    (3 rows)
  5. Salir del Servidor Réplica:

    Salga de psql en el servidor réplica:

    \q

Apagar la Replicación de Forma Segura

En este paso, apagará la configuración de replicación de forma segura.

  1. Apagar el Servidor Réplica:

    Apague el servidor réplica:

    sudo pg_ctlcluster 14 main stop -D ~/project/replica_data
  2. Apagar el Servidor Primario:

    Apague el servidor primario:

    sudo pg_ctlcluster 14 main stop
  3. Limpieza (Opcional):

    Si desea eliminar la configuración de replicación, puede eliminar el directorio de datos de la réplica. Tenga mucho cuidado al hacer esto, ya que eliminará todos los datos de la réplica.

    sudo rm -rf ~/project/replica_data

    Además, revierta los cambios realizados en postgresql.conf y pg_hba.conf en el servidor primario si ya no necesita la replicación.

    • Revertir postgresql.conf:

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

      Cambie wal_level de nuevo a minimal.

      wal_level = minimal

      Cambie max_wal_senders de nuevo a 0.

      max_wal_senders = 0

      Cambie listen_addresses de nuevo a localhost.

      listen_addresses = 'localhost'

      Guarde los cambios y salga del editor.

    • Revertir pg_hba.conf:

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

      Elimine la línea que agregó para la replicación.

      Guarde los cambios y salga del editor.

    • Reiniciar el Servidor Primario:

      Reinicie el servidor primario para aplicar los cambios de configuración.

      sudo pg_ctlcluster 14 main restart

Resumen

En este laboratorio, configuró una réplica de streaming (streaming replica) de una base de datos PostgreSQL. Esto implicó modificar los archivos postgresql.conf y pg_hba.conf en el servidor primario, tomar una copia de seguridad base (base backup), configurar el servidor réplica y verificar que la replicación funcionara correctamente. También aprendió cómo apagar de forma segura la configuración de replicación.