PostgreSQL en Alta Disponibilidad

En esta nueva guía, vamos a utilizar la instalación de PostgreSQL que hicimos en uno de los últimos artículos para configurar un entorno en alta disponibilidad. En este caso, vamos a utilizar 2 servidores Ubuntu para disponer de PosgreSQL en alta disponibilidad.

La documentación oficial ofrece varias alternativas de cara al diseño de la alta disponibilidad en PostgreSQL. Analizando las diferentes opciones, vamos a configurar un entorno con disco compartido (Shared Disk Failover) mediante NFS.

Con la arquitectura clara, vamos a empezar con la configuración.

Cambiar ubicación de la base de datos de PostgreSQL

Primero, necesitamos que ambos servidores dispongan de un volumen compartido. Nosotros utilizaremos un disco compartido mediante el protocolo NFS, pero se pueden utilizar otras tecnologías en función de la infraestructura que tengamos disponible (disco compartidos por fibra, iSCSI, etc…).

Una vez configurado el volumen compartido en ambos servidores podremos continuar.

Utilizamos df para comprobar que la ruta esta compartida

Lo primero que necesitaremos es conocer la ruta actual de los datos de nuestro PostegreSQL. Esto lo podemos sacar con la sentencia show data_directory; desde el administrador de PostgreSQL.

show data_directory nos muestra el directorio de datos de PostgreSQL

Una vez sabemos donde se almacenan nuestras bases de datos, vamos a parar el motor de PostgreSQL, ejecutando service postgresql stop, y procedemos a copiar los datos en la ruta que tenemos compartida.

Paramos la base de datos PostgreSQL

Vamos a utilizar rsync -av para sincronizar los datos de la ruta origen a la ruta compartida.

Una vez copiados los datos, y validados, procedemos a modificar la ruta de datos de PostgreSQL en el fichero de configuración. En nuestro caso, el fichero se encontraba en /etc/postgresql/12/main/postgresql.conf pero la ruta puede varias en función de la versión de PostgreSQL instalada.

Editamos con vim el fichero

Debemos modificar la variable data_directory con la ruta compartida donde hemos copiado los datos. Una vez editado el fichero, salimos guardando los datos.

Editamos la variable data_directory

Una vez guardado el fichero de configuración, procedemos a iniciar la base de datos con service postgresql start y comprobar que tenemos acceso a nuestras bases de datos.

Como tarea opcional, una vez validado que los datos son correctos, podemos eliminar el directorio antiguo para recuperar ese espacio disponible. Si no nos hace falta, podemos mantener esos datos como copia de seguridad.

Volvemos a parar el servicio con service postgresql stop y nos conectamos a la segunda maquina.

Al igual que hicimos en la primera maquina, modificamos el fichero de configuración de PostgreSQL e indicamos la ruta nueva del directorio de datos:

Finalmente, iniciamos al servicio y validamos que los datos son los mismos que en la maquina principal.

Con esta configuración, podemos iniciar el servicio si detectamos alguna incidencia en uno de los nodos.

No es posible tener activo/activo, por lo que debemos tener siempre parado el motor de PostgreSQL en uno de los dos nodos. Si iniciamos el motor de PostgreSQL en ambas maquinas, recibiremos algunos errores como los siguientes y se apaga el servicio en las maquinas.

Como punto negativo, esta solución es completamente manual. Debemos modificar nuestras aplicaciones para conectar a uno y otro servidor, por lo que en caso de fallo no dispondríamos de una solución automatizada. Esta se podría resolver utilizando sistemas de IPs virtuales como KeepAlived, por ejemplo.

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.