Saltar al contenido

Cómo configurar la replicación de transmisión física con PostgreSQL 12 en Ubuntu 20.04

Introducción

La replicación de transmisión es un método popular que puede utilizar para escalar horizontalmente sus bases de datos relacionales. Utiliza dos o más copias del mismo clúster de base de datos que se ejecuta en máquinas independientes. Un clúster de base de datos se denomina principal y sirve tanto para operaciones de lectura como de escritura; las otras, denominadas réplicas, solo sirven para operaciones de lectura. También puede utilizar la replicación de transmisión para proporcionar alta disponibilidad de un sistema. Si el clúster o servidor de la base de datos principal fallara inesperadamente, las réplicas pueden continuar sirviendo operaciones de lectura o (una de las réplicas) se convierte en el nuevo clúster principal.

PostgreSQL es una base de datos relacional ampliamente utilizada que admite la replicación tanto lógica como física. Replicación lógica transmite cambios de alto nivel desde el clúster de la base de datos principal a las bases de datos de réplica. Con la replicación lógica, puede transmitir cambios a una sola base de datos o tabla en una base de datos. Sin embargo, en replicacion fisica, los cambios en el archivo de registro WAL (Write-Ahead-Logging) se transmiten y replican en los clústeres de réplicas. Como resultado, no puede replicar áreas específicas de un clúster de base de datos principal, sino que se replican todos los cambios en el principal.

En este tutorial, configurará la replicación de transmisión física con PostgreSQL 12 en Ubuntu 20.04 usando dos máquinas separadas que ejecutan dos clústeres de PostgreSQL 12 separados. Una máquina será la primario y el otro, el réplica.

Para completar este tutorial, necesitará lo siguiente:

  • Dos máquinas separadas Máquinas Ubuntu 20.04; uno conocido como el primario y el otro conocido como el réplica. Puede configurarlos con nuestra Guía de configuración inicial del servidor, incluidos los usuarios no root con permisos sudo y un firewall.
  • Sus firewalls configurados para permitir HTTP / HTTPS y tráfico en el puerto 5432—El puerto predeterminado utilizado por PostgreSQL 12. Puede seguir Cómo configurar un firewall con ufw en Ubuntu 20.04 para configurar estos ajustes de firewall.
  • PostgreSQL 12 ejecutándose en ambos servidores Ubuntu 20.04. Seguir Paso 1 del tutorial Cómo instalar y usar PostgreSQL en Ubuntu 20.04 que cubre la instalación y el uso básico de PostgreSQL en Ubuntu 20.04.

Paso 1: configuración de la base de datos principal para aceptar conexiones

En este primer paso, configurará el primario base de datos para permitir su réplica base de datos (s) para conectar. De forma predeterminada, PostgreSQL solo escucha localhost (127.0.0.1) para conexiones. Para cambiar esto, primero editará el listen_addresses parámetro de configuración en el primario base de datos.

En tu primario servidor, ejecute el siguiente comando para conectarse al clúster de PostgreSQL como predeterminado postgres usuario:

Una vez que se haya conectado a la base de datos, modificará el listen_addresses parámetro usando el ALTER SYSTEM mando:

Reemplazar 'your_replica_IP_addr' con la dirección IP de su réplica máquina.

Recibirá el siguiente resultado:

Salida

ALTER SYSTEM

El comando que acaba de ingresar le indica al clúster de base de datos PostgreSQL que permita conexiones solo desde su réplica máquina. Si estuviera usando más de uno réplica máquina, debería enumerar las direcciones IP de todas sus réplicas separadas por comas. También podrías usar '*' para permitir conexiones desde todas las direcciones IP, sin embargo, esto no se recomienda por razones de seguridad.

Nota: También puede ejecutar el comando en la base de datos desde la terminal usando psql -c como sigue:

Alternativamente, puede cambiar el valor de listen_addresses editando manualmente el postgresql.conf archivo de configuración, que puede encontrar en el /etc/postgresql/12/main/ directorio por defecto. También puede obtener la ubicación del archivo de configuración ejecutando SHOW config_file; en el clúster de la base de datos.

Para abrir el archivo usando nano utilizar:

Una vez que haya terminado, su primario La base de datos ahora aceptará conexiones de otras máquinas. A continuación, creará un rol con los permisos adecuados que el réplica utilizará cuando se conecte al primario.

Paso 2: creación de un rol especial con permisos de replicación

Ahora, debe crear un rol en el primario base de datos que tiene permiso para replicar la base de datos. Tu réplica utilizará este rol cuando se conecte al primario. La creación de un rol separado solo para la replicación también tiene beneficios de seguridad. Tu réplica no podrá manipular ningún dato en el primario; solo podrá replicar los datos.

Para crear un rol, debe ejecutar el siguiente comando en el primario racimo:

Recibirás el siguiente resultado:

Salida

CREATE ROLE

Este comando crea un rol llamado test con la contraseña 'testpassword', que tiene permiso para replicar el clúster de la base de datos.

PostgreSQL tiene una pseudo-base de datos de replicación especial que réplica se conecta, pero primero debe editar el /etc/postgresql/12/main/pg_hba.conf archivo de configuración para permitir su réplica para acceder a él. Por lo tanto, salga del símbolo del sistema de PostgreSQL ejecutando:

Ahora que está de vuelta en el símbolo del sistema de su terminal, abra el /etc/postgresql/12/main/pg_hba.conf archivo de configuración usando nano:

Agregue la siguiente línea al final del pg_hba.conf archivo:

/etc/postgresql/12/main/pg_hba.conf

Esto asegura que su primario permite tu réplica para conectarse a la pseudo-base de datos de replicación usando el rol, test, que creó anteriormente. los host valor significa aceptar conexiones no locales a través de sockets TCP / IP simples o cifrados con SSL. replication es el nombre de la pseudo-base de datos especial que PostgreSQL usa para la replicación. Finalmente, el valor md5 es el tipo de autenticación utilizado. Si quieres tener más de uno réplica, simplemente agregue la misma línea nuevamente al final del archivo con la dirección IP de su otro réplica.

Para asegurarse de que se implementen estos cambios en el archivo de configuración, debe reiniciar el primario clúster usando:

Si tu primario el clúster se reinició correctamente, está configurado correctamente y listo para comenzar a transmitir una vez que su réplica conecta. A continuación, pasará a configurar su réplica racimo.

Paso 3: hacer una copia de seguridad del clúster principal en la réplica

Mientras configura la replicación física con PostgreSQL en este tutorial, debe realizar una copia de seguridad física del primario archivos de datos del clúster en el réplicas directorio de datos. Para hacer esto, primero borrará todos los archivos en el réplicas directorio de datos. El directorio de datos predeterminado para PostgreSQL en Ubuntu es /var/lib/postgresql/12/main/.

También puede encontrar el directorio de datos de PostgreSQL ejecutando el siguiente comando en el réplicas base de datos:

Una vez que tenga la ubicación del directorio de datos, ejecute el siguiente comando para eliminar todo:

Dado que el propietario predeterminado de los archivos en el directorio es el postgres usuario, deberá ejecutar el comando como postgres utilizando sudo -u postgres.

Nota:
Si, en el caso extremadamente raro, un archivo en el directorio está dañado y el comando no funciona, elimine el main directorio todos juntos y recrearlo con los permisos apropiados de la siguiente manera:

Ahora que el réplicas El directorio de datos está vacío, puede realizar una copia de seguridad física del primaria archivos de información. PostgreSQL tiene convenientemente la utilidad pg_basebackup que simplifica el proceso. Incluso le permite poner el servidor en modo de espera utilizando el -R opción.

Ejecute el pg_basebackup comando en el réplica como sigue:

  • los -h La opción especifica un host no local. Aquí, debe ingresar la dirección IP de su servidor con el primario racimo.
  • los -p La opción especifica el número de puerto al que se conecta en el primario servidor. De forma predeterminada, PostgreSQL usa el puerto :5432.
  • los -U La opción le permite especificar el usuario que se conecta a la primario agrupar como. Este es el rol que creó en el paso anterior.
  • los -D flag es el directorio de salida de la copia de seguridad. Esta es tu réplicas directorio de datos que vació justo antes.
  • los -Fp especifica los datos que se enviarán en formato plano en lugar de como tar archivo.
  • -Xs transmite el contenido del registro WAL como copia de seguridad del primario es interpretado.
  • Finalmente, -R crea un archivo vacío, llamado standby.signal, en el réplicas directorio de datos. Este archivo le permite réplica el clúster sabe que debe funcionar como servidor de reserva. los -R La opción también agrega la información de conexión sobre el primario servidor al postgresql.auto.conf archivo. Este es un archivo de configuración especial que se lee siempre que el postgresql.conf se lee el archivo, pero los valores en el .auto archivo anula los valores en el archivo de configuración regular.

Cuando el pg_basebackup el comando se conecta al primario, se le pedirá que ingrese la contraseña para el rol que creó en el paso anterior. Dependiendo del tamaño de su primario clúster de base de datos, puede llevar algún tiempo copiar todos los archivos.

Tu réplica ahora tendrá todos los archivos de datos del primario que requiere para comenzar la replicación. A continuación, pondrás el réplica en modo de espera y comience a replicar.

Paso 4: reiniciar y probar los clústeres

Ahora que el primario Los archivos de datos del clúster se han respaldado con éxito en el réplica, el siguiente paso es reiniciar el réplica clúster de base de datos para ponerlo en modo de espera. Para reiniciar el réplica base de datos, ejecute el siguiente comando:

Si tu réplica clúster reiniciado en modo de espera con éxito, ya debería haberse conectado al primario clúster de base de datos en su otra máquina. Para comprobar si el réplica se ha conectado al primario y el primario está transmitiendo, conéctese al primario clúster de base de datos ejecutando:

Ahora consulta el pg_stat_replication mesa en el primario clúster de base de datos de la siguiente manera:

Ejecutando esta consulta en el primario cluster generará algo similar a lo siguiente:

Salida

   client_addr    |  state
------------------+-----------
 your_replica_IP | streaming

Si tiene un resultado similar, entonces el primario está transmitiendo correctamente al réplica.

conclusión
Ahora tiene dos servidores Ubuntu 20.04, cada uno con un clúster de base de datos PostgreSQL 12 que se ejecuta con transmisión física entre ellos. Cualquier cambio realizado ahora en primario El clúster de base de datos también aparecerá en el réplica racimo.

También puede agregar más réplicas a su configuración si sus bases de datos necesitan manejar más tráfico.

Si desea obtener más información sobre la replicación de transmisión física, incluido cómo configurar la replicación sincrónica para garantizar que no haya ninguna posibilidad de perder datos de misión crítica, puede leer la entrada en los documentos oficiales de PostgreSQL.