Cómo configurar la replicación de transmisión física con PostgreSQL 12 en Ubuntu 20.04
El autor seleccionó el Fondo de Ayuda COVID-19 para recibir una donación como parte del programa Write for DOnations .
Introducción
La replicación en streaming 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 bases de datos que se ejecutan en máquinas separadas. Un clúster de bases de datos se denomina principal y realiza operaciones de lectura y escritura; los demás, denominados réplicas, solo realizan operaciones de lectura. También puede utilizar la replicación en streaming para proporcionar alta disponibilidad a un sistema. Si el servidor o el clúster de bases de datos principal fallara inesperadamente, las réplicas pueden continuar realizando operaciones de lectura o (una de las réplicas) convertirse en el nuevo clúster principal.
PostgreSQL es una base de datos relacional ampliamente utilizada que admite la replicación lógica y física. La replicación lógica transmite cambios de alto nivel desde el clúster de 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 la replicación física , los cambios en el archivo de registro WAL (Write-Ahead-Logging) se transmiten y replican en los clústeres de réplica. 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 la base de datos principal.
En este tutorial, configurará la replicación de transmisión física con PostgreSQL 12 en Ubuntu 20.04 utilizando dos máquinas independientes que ejecutan dos clústeres PostgreSQL 12 independientes. Una máquina será la principal y la otra, la réplica .
Prerrequisitos
Para completar este tutorial, necesitará lo siguiente:
- Dos máquinas independientes con Ubuntu 20.04: una denominada principal y la otra denominada réplica . Puede configurarlas con nuestra Guía de configuración inicial del servidor , incluidos usuarios no root con permisos sudo y un firewall.
- Sus firewalls están 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 en ejecución en ambos servidores Ubuntu 20.04. Siga el 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á la base de datos principal para permitir que las bases de datos de réplica se conecten. De manera predeterminada, PostgreSQL solo escucha el localhost
( 127.0.0.1
) en busca de conexiones. Para cambiar esto, primero editará el listen_addresses
parámetro de configuración en la base de datos principal .
En su servidor principal , abra el archivo de configuración de PostgreSQL, postgresql.conf
que se encuentra en el /etc/postgresql/12/main/
directorio:
- sudo nano /etc/postgresql/12/main/postgresql.conf
Una vez abierto el archivo, localiza la listen_addresses
variable y cambia el valor de localhost
a la dirección IP de tu servidor principal . También tendrás que eliminar el #
carácter del comienzo de la línea, como se muestra a continuación:
/etc/postgresql/12/main/postgresql.conf
. . .listen_addresses = 'your_primary_IP_address'. . .
Guardar y salir del archivo.
Una vez que haya terminado, su base de datos principal estará lista para aceptar conexiones desde otras máquinas en la dirección IP que ingresó. A continuación, creará un rol con los permisos adecuados que la réplica usará al conectarse a la base de datos principal .
Paso 2: Creación de un rol especial con permisos de replicación
Ahora, debe crear un rol en la base de datos principal que tenga permiso para replicar la base de datos. Su réplica utilizará este rol al conectarse a la base de datos principal . Crear un rol independiente solo para la replicación también tiene beneficios de seguridad. Su réplica no podrá manipular ningún dato en la base de datos principal ; solo podrá replicar los datos.
Primero, conéctese al clúster de base de datos como postgres
usuario con el siguiente comando:
- sudo -u postgres psql
Para crear un rol, debes ejecutar el CREATE ROLE
comando en el clúster de la siguiente manera:
- CREATE ROLE test WITH REPLICATION PASSWORD 'testpassword' LOGIN;
Recibirás el siguiente resultado:
OutputCREATE ROLE
Este comando crea un rol llamado test
con la contraseña 'testpassword'
, que tiene permiso para replicar el clúster de base de datos.
PostgreSQL tiene una pseudobase de datos de replicación especial a la que se conecta la réplica , pero primero debe editar el /etc/postgresql/12/main/pg_hba.conf
archivo de configuración para permitir que su réplica acceda a ella. Por lo tanto, salga del símbolo del sistema de PostgreSQL ejecutando lo siguiente:
- q
Ahora que está nuevamente en el símbolo del sistema de su terminal, abra el /etc/postgresql/12/main/pg_hba.conf
archivo de configuración usando nano
:
- sudo nano /etc/postgresql/12/main/pg_hba.conf
Añade la siguiente línea al final del pg_hba.conf
archivo:
/etc/postgresql/12/main/pg_hba.conf
. . .host replication test your-replica-IP/32 md5
Esto garantiza que su servidor principal permita que su réplica se conecte a la pseudobase de datos de replicación mediante el rol, test
que creó anteriormente. El 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 pseudobase de datos especial que PostgreSQL usa para la replicación. Finalmente, el valor md5
es el tipo de autenticación utilizada. Si desea tener más de una réplica , simplemente agregue la misma línea nuevamente al final del archivo con la dirección IP de su otra réplica .
Para garantizar que se implementen estos cambios en el archivo de configuración, debe reiniciar el clúster principal mediante:
- sudo systemctl restart postgresql@12-main
Si el clúster principal se reinició correctamente, está configurado correctamente y listo para comenzar a transmitir una vez que se conecte la réplica . A continuación, pasará a configurar el clúster de réplica .
Paso 3: Realizar una copia de seguridad del clúster principal en la réplica
Como está configurando la replicación física con PostgreSQL en este tutorial, debe realizar una copia de seguridad física de los archivos de datos del clúster principal en el directorio de datos de la réplica . Para ello, primero deberá borrar todos los archivos del directorio de datos de la réplica . 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 la base de datos de la réplica :
- SHOW data_directory;
Una vez que tenga la ubicación del directorio de datos, ejecute el siguiente comando para eliminar todo:
- sudo -u postgres rm -r /var/lib/postgresql/12/main/*
Dado que el propietario predeterminado de los archivos en el directorio es el usuario postgres , deberá ejecutar el comando como postgres
using sudo -u postgres
.
Nota: Si en el caso extremadamente raro de que un archivo en el directorio esté dañado y el comando no funcione, elimine el main
directorio por completo y vuelva a crearlo con los permisos adecuados de la siguiente manera:
- sudo -u postgres rm -r /var/lib/postgresql/12/main
- sudo -u postgres mkdir /var/lib/postgresql/12/main
- sudo -u postgres chmod 700 /var/lib/postgresql/12/main
Ahora que el directorio de datos de la réplica está vacío, puedes realizar una copia de seguridad física de los archivos de datos del servidor principal . PostgreSQL tiene una utilidad pg_basebackup
que simplifica el proceso. Incluso te permite poner el servidor en modo de espera mediante esta -R
opción.
Ejecute el pg_basebackup
comando en la réplica de la siguiente manera:
- sudo -u postgres pg_basebackup -h primary-ip-addr -p 5432 -U test -D /var/lib/postgresql/12/main/ -Fp -Xs -R
-
La
-h
opción especifica un host no local. Aquí, debe ingresar la dirección IP de su servidor con el clúster principal . -
La
-p
opción especifica el número de puerto al que se conecta en el servidor principal . De manera predeterminada, PostgreSQL utiliza el puerto:5432
. -
La
-U
opción le permite especificar el usuario con el que se conecta al clúster principal . Este es el rol que creó en el paso anterior. -
La
-D
bandera es el directorio de salida de la copia de seguridad. Este es el directorio de datos de su réplica que vació justo antes. -
Especifica
-Fp
que los datos se deben generar en formato simple en lugar de como untar
archivo. -
-Xs
transmite el contenido del registro WAL a medida que se realiza la copia de seguridad del registro principal . -
Por último,
-R
crea un archivo vacío, llamadostandby.signal
, en el directorio de datos de la réplica . Este archivo le permite a su clúster de réplicas saber que debe funcionar como un servidor en espera. La-R
opción también agrega la información de conexión sobre el servidor principal alpostgresql.auto.conf
archivo. Este es un archivo de configuración especial que se lee siempre quepostgresql.conf
se lee el archivo normal, pero los valores del.auto
archivo anulan los valores del archivo de configuración normal.
Cuando el pg_basebackup
comando se conecta a la base de datos principal , se le solicitará que ingrese la contraseña para el rol que creó en el paso anterior. Según el tamaño del clúster de la base de datos principal , puede llevar algún tiempo copiar todos los archivos.
Ahora, la réplica tendrá todos los archivos de datos del servidor principal que necesita para comenzar la replicación. A continuación, pondrá la réplica en modo de espera y comenzará a replicar.
Paso 4: Reinicio y prueba de los clústeres
Ahora que se realizó una copia de seguridad de los archivos de datos del clúster principal en la réplica , el siguiente paso es reiniciar el clúster de la base de datos de réplica para ponerlo en modo de espera. Para reiniciar la base de datos de réplica , ejecute el siguiente comando:
- sudo systemctl restart postgresql@12-main
Si el clúster de réplica se reinició en modo de espera correctamente, ya debería haberse conectado al clúster de base de datos principal en la otra máquina. Para comprobar si la réplica se ha conectado al principal y si este está transmitiendo, conéctese al clúster de base de datos principal ejecutando lo siguiente:
- sudo -u postgres psql
Ahora consulte la pg_stat_replication
tabla en el clúster de base de datos principal de la siguiente manera:
- SELECT client_addr, state FROM pg_stat_replication;
Al ejecutar esta consulta en el clúster principal , se obtendrá un resultado similar a lo siguiente:
Output client_addr | state------------------+----------- your_replica_IP | streaming
Si tiene una salida similar, entonces el archivo principal se está transmitiendo correctamente a la réplica .
Conclusión
Ahora tienes dos servidores Ubuntu 20.04, cada uno con un clúster de base de datos PostgreSQL 12 ejecutándose con transmisión física entre ellos. Cualquier cambio que realices en el clúster de base de datos principal también aparecerá en el clúster de réplica .
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 cero posibilidades de perder datos críticos para la misión, puede leer la entrada en la documentación oficial de PostgreSQL .
Puede consultar nuestra página de temas de PostgreSQL para obtener más tutoriales y contenido.
Deja una respuesta