
Una sola copia de una base de datos puede no ser suficiente para algunas aplicaciones. Tanto por motivos de seguridad como de rendimiento, disponer de una o varias réplicas de la base de datos puede ser clave. La configuración de un sistema de réplica con PostgreSQL es algo relativamente sencillo gracias al uso de Streaming Replication (SR), una característica que está disponible desde PostgreSQL 9.
En esta publicación se va a explicar como configurar y probar un sistema de réplica con dos bases de datos PostgreSQL 15 instaladas en Rocky Linux 9, asumiendo que ya se dispone de dos máquinas en las que se ha instalado previamente PostgreSQL. Si no es así, se puede consultar el tutorial para instalar PostgreSQL en una distribución basada en RHEL 9 como Rocky Linux 9 en una máquina Virtual Box. Una vez instalada la base de datos en una máquina virtual, simplemente se puede duplicar esta. Es necesario que cada una de las máquinas cuente con una dirección IP diferente, para configurar el acceso a la red en VirtualBox se puede seguir el tutorial publicado.
Tabla de contenidos
Creación de un usuario de réplica
En primer lugar, es necesario crear un usuario con permisos de replicación en la base de datos maestra u original, no es necesario hacerlo en la réplica ya que los usuarios también se replican. Para ello se debe ejecutar en la base de datos con un usuario que tenga permisos de administración un comando como el siguiente
CREATE USER replicator with replication password 'replicator';
En el que se indica que se cree un nuevo usuario replicator
con permisos de replicación (with replication
) cuya contraseña será replicator. Para un sistema en producción se debe cambiar esta contraseña por otra que sea segura.
Comprobar los parámetros para la réplica en postgresql.conf
La versión 15 de PosgreSQL ya viene configurada por defecto para el uso de Streaming Replication. Aún así, antes de continuar es una buena idea consultar en el archivo postgresql.conf
los valores de las opciones wal_level
y hot_standby
que deben ser respectivamente replica
y on
. Además, también se debe comprobar que el valor de max_val_senders
es por lo menos 10. Los valores se pueden consultar sin abrir el archivo usando psql
, para lo que se pueden escribir los siguientes comandos en la terminal.
psql -c "show wal_level"
psql -c "show max_wal_senders"
psql -c "show hot_standby"
Creación de una carpeta para el log
Antes de continuar es necesario crear una carpeta para el log, lo que se puede hacer en la ruta por defecto de PostgreSQL /var/lib/pgsql/
, simplemente se debe usar el comando mkdir
para la crear una carpeta llamada archivelog
.
mkdir /var/lib/pgsql/archivelog
La carpeta se debe crear tanto en el servidor maestro como en la réplica, ya que la estructura de archivos no se copia durante el proceso de réplica, solo los datos de la base de datos.
Una vez hecho esto, en el archivo postgresql.conf
se debe cambiar dos parámetros archive_mode
y archive_command
para activar el modo de archivado e indicar dónde se hace esto.
archive_mode = on
archive_command = 'test ! -f /var/lib/pgsql/archivelog/%f && cp %p /var/lib/pgsql/archivelog/%f'
Dar permisos para la réplica en pg_hba.conf
En el archivo pg_hba.conf
es necesario agregar una nueva línea para que el usuario replicator pueda realizar tareas de réplica a través de la red. Para ello al final del archivo se debe agregar una línea como la siguiente
host replication replicator 192.168.1.0/24 md5
La línea indica que el usuario replicador puede realizar tareas de réplica desde cualquier máquina en la red 192.168.1.x, si las IP de la red en la que se trabaja son diferentes será necesario modificar este parámetro.
Copia del servidor
En el servidor maestro es necesario asegurarse que se han actualizado todos los cambios de configuración, por lo que se debe reiniciar el servicio. Lo que se puede hacer a través del comando systemctl
.
sudo systemctl restart postgresql
Por otro lado, el servidor donde se hará la réplica es necesario que el servidor de PostgreSQL esté parado, para lo que también se debe usar el comando systemctl
.
sudo systemctl stop postgresql
En nuestro caso el servidor maestro se encuentra en la máquina 192.168.1.43. Para realizar la copia desde el servidor réplica se debe ejecutar el siguiente comando
pg_basebackup -h 192.168.1.43 -U replicator -p 5432 -D data -Fp -Xs -P -R
Una línea en la que se indica que se copie desde el servidor 192.168.1.43 (valor que se debe cambiar en función de dónde se encuentre el servidor maestro) usando para ello el usuario replicator
creado previamente. La copia se hace a través del puerto por defecto de PostgreSQL 5432 y se guarda en la carpeta data
(ubicación que también se debe cambiar dependiendo de la configuración de la base de datos).
Al ejecutar el comando se pedirá la contraseña del usuario replicator
para iniciar la réplica de la base de datos. Una vez terminado el proceso se puede comprobar que se han copiado todos archivos en la carpeta data
e iniciar el servidor PostgreSQL.
sudo systemctl start postgresql
Funcionamiento básico del sistema de réplica con PostgreSQL
Si todos los pasos se han ejecutado de forma correcta ahora se dispone de un sistema de réplica con dos bases de datos PostgreSQL que contienen la misma información. Copiando cualquier modificación en la base de datos maestra de forma automática en la réplica. Algo que se puede comprobar fácilmente creando una nueva base de datos en el servidor maestro y comprobando como esta aparece automáticamente en la réplica.
La base de datos de réplica es solamente de lectura. Si se intente ejecutar cualquier comando que modifique la información se obtendrá como respuesta un mensaje de error indicado que la base de datos es de solo lectura.
En este punto se puede usar la base de datos de réplica como un respaldo de la maestra para activar está en caso de que la primera no se encuentre disponible. También se puede usar para acelerar los procesos de lectura. Si algunas aplicaciones solo necesitan leer datos, una tarea más sencilla para la base de datos que realizar modificaciones, pueden recurrir a la base de datos de réplica para descargar de trabajo a la maestra.
Conclusiones
En esta publicación se ha visto cómo crear un sistema de réplica con PostgreSQL en Linux. Una opción que puede ser útil tanto para mejorar la seguridad como el rendimiento de las bases de datos PostgreSQL. Al disponer de una copia de la base de datos, la información siempre está duplicada, por lo que un fallo en una máquina no compromete la integridad de los datos. Además, esta segunda base de datos se puede utilizar para realizar tareas de lectura que suelen ser más habituales que las de escritura.
El sistema de réplica que se ha creado no es un sistema de alta disponibilidad, falta hacer que en caso de que la base de datos maestra caiga se active automáticamente la réplica, lo que se puede hacer con repmgr.
Imagen de Andrew Martin en Pixabay
Deja una respuesta