Cómo Configurar Alta Disponibilidad y Failover Automático en PostgreSQL con Patroni y etcd

Hoy vamos a ver como configurar alta disponibilidad y failover automático en PostgreSQL utilizando Patroni y etcd, dos herramientas claves que proporcionan la automatización y estabilidad necesarias para mantener el sistema operativo de manera continua.

¿Qué es Patroni?

Patroni es una herramienta open-source que facilita la gestión de clústeres de PostgreSQL de alta disponibilidad. Patroni se basa en el uso de un sistema de consenso distribuido, como etcd, Consul o ZooKeeper, para gestionar el estado del clúster y asegurar que solo un nodo actúe como líder.

Además, está diseñado para integrarse fácilmente con Kubernetes y otros sistemas de orquestación de contenedores; y proporciona una API REST que permite monitorear y gestionar el clúster.

¿Qué es etcd?

Se trata de un sistema de almacenamiento distribuido de claves-valor que será el encargado de gestionar y de asegurarse de que solo un nodo sea promovido a líder en cualquier momento, evitando conflictos como el «split-brain”.

El número mínimo recomendado de nodos en etcd es tres para entornos de producción, ya que si solo tuviéramos uno y ese nodo falla, el clúster de Patroni perdería su capacidad para gestionar el failover. Además, como se requiere de un quorum para tomar decisiones, el sistema podría continuar operando incluso si uno de ellos fallara.

failover automatico en postgresql

Paso a Paso: Configuración de Patroni y etcd

Para configurar un clúster de alta disponibilidad con PostgreSQL utilizando Patroni y etcd necesitaremos los siguientes nodos:

Nodos de PostgreSQL: Nodo 1: 10.0.0.1 // Nodo 2: 10.0.0.2 // Nodo 3: 10.0.0.3

Nodos de etcd: etcd Nodo A: 10.0.0.4 // etcd Nodo B: 10.0.0.5 // etcd Nodo C: 10.0.0.6

Paso 1: Instalación de Patroni en Cada Nodo

sudo apt-get install python3-pip python3-dev libpq-dev
sudo pip3 install patroni[etcd]

Paso 2: Instalación y configuración de etcd en Cada Nodo

Instalación de etcd:

wget https://github.com/etcd-io/etcd/releases/download/v3.5.0/etcd-v3.5.0-linux-amd64.tar.gz
tar xzf etcd-v3.5.0-linux-amd64.tar.gz
sudo mv etcd-v3.5.0-linux-amd64/etcd* /usr/local/bin/

Configuración de etcd para Nodo A (lo haremos a través de un comando en línea al iniciar el servicio):

etcd --name etcd-a \
--initial-advertise-peer-urls http://10.0.0.4:2380 \ # URL utilizada por este nodo para conectarse con otros nodos etcd.
--listen-peer-urls http://10.0.0.4:2380 \ # Dirección donde el nodo escucha a sus pares.
--advertise-client-urls http://10.0.0.4:2379 \ # URL anunciada para que los clientes (como Patroni) se conecten a este nodo etcd.
--listen-client-urls http://10.0.0.4:2379 \ # Dirección donde este nodo escucha conexiones de clientes.
--initial-cluster-token etcd-cluster-1 \ # Identificador único para el clúster.
--initial-cluster etcd-a=http://10.0.0.4:2380,etcd-b=http://10.0.0.5:2380,etcd-c=http://10.0.0.6:2380 \ # Lista de nodos en el clúster etcd.
--initial-cluster-state new # Indica que este es un clúster recién creado.

Tendremos que repetir esta configuración en etcd Nodo B (10.0.0.5) y etcd Nodo C (10.0.0.6), ajustando las direcciones IP y nombres de nodo en consecuencia.

Paso 3: Configuración de Patroni en Cada Nodo PostgreSQL

Para este paso, editaremos el fichero patroni.yml en cada nodo.

Configuración de Patroni en el Nodo 1:

# Archivo de configuración de Patroni para el Nodo 1 (10.0.0.1)
scope: postgresql-ha # Nombre del clúster. Debe ser igual en todos los nodos.
namespace: /service/ # Directorio en etcd donde se almacenarán las claves del clúster.
name: postgresql1 # Nombre único de este nodo.

restapi:
listen: 10.0.0.1:8008 # IP y puerto donde este nodo escucha las solicitudes REST.
connect_address: 10.0.0.1:8008 # Dirección para que otros nodos se conecten vía REST.

etcd:
hosts: 10.0.0.4:2379,10.0.0.5:2379,10.0.0.6:2379 # Nodos etcd que gestiona el consenso.

postgresql:
listen: 10.0.0.1:5432 # IP y puerto de escucha de PostgreSQL.
connect_address: 10.0.0.1:5432 # Dirección para que otros nodos se conecten a este nodo.
data_dir: /var/lib/postgresql/data # Directorio de datos de PostgreSQL.

pgpass: /tmp/pgpass0 # Archivo que almacena las credenciales para replicación y superusuario.

authentication:
replication:
username: replicator # Usuario de replicación.
password: replicator_password # Contraseña de replicación.
superuser:
username: postgres # Superusuario de PostgreSQL.
password: postgres_password # Contraseña del superusuario.

parameters:
shared_buffers: "256MB" # Configuración de memoria compartida.

De nuevo, repetiremos esta configuración en el Nodo 2 (10.0.0.2) y en el Nodo 3 (10.0.0.3), ajustando las direcciones IP y nombres en consecuencia.

Paso 4: Iniciar Patroni y Verificar el Estado del Clúster

Una vez configurados todos los nodos de PostgreSQL y etcd, es momento de iniciar Patroni en cada nodo:

sudo patroni /ruta/al/archivo/patroni.yml

Luego, para verificar el estado del clúster, puedes usar el comando patronictl:

patronictl -c /ruta/al/archivo/patroni.yml list

Este comando mostrará el estado actual del clúster, indicando cuál es el líder y cuáles son los nodos secundarios.

Paso 5: Probar el Failover Automático

Para probar el failover automático, puedes apagar el nodo líder de PostgreSQL utilizando el siguiente comando:

sudo systemctl stop patroni

Conclusión

Configurar alta disponibilidad y failover automático en PostgreSQL con Patroni y etcd proporciona una solución robusta que garantiza la continuidad del servicio en entornos de producción. La configuración puede adaptarse tanto a entornos locales como a infraestructuras en la nube. Al implementar un sistema de consenso como etcd, aseguras que tu clúster sea resiliente y esté siempre disponible, minimizando tiempos de inactividad y maximizando la eficiencia.

¿Listo para implementar Patroni en tu entorno? No dudes en compartir tus preguntas o experiencias en los comentarios. ¡Estamos aquí para ayudarte! 😉

Échale un vistazo a nuestros servicios de soporte y mantenimiento PostgreSQL.

¿Aún no conoces Query Performance? Descubre cómo puede ayudarte en tu entorno Oracle. Más información en su página de LinkedIn.

Sígue a GPS en LinkedIn

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *