Manual para agregar una IP VIP en Patroni para PostgreSQL en Alta Disponibilidad

Introducción

Este manual forma parte de nuestra serie de manuales dedicada a la Instalación y Configuración de PostgreSQL en Alta Disponibilidad (HA) utilizando Patroni y etcd. En este documento específico, explicaremos cómo añadir una IP VIP (Virtual IP) a un clúster de Patroni, lo que permitirá que una dirección IP flotante se asocie al nodo líder del clúster de PostgreSQL, mejorando la alta disponibilidad y la resiliencia del servicio.

En un entorno de alta disponibilidad, especialmente en soluciones de bases de datos como PostgreSQL, la capacidad de asegurar que la IP del nodo líder sea accesible desde los clientes es esencial. Usar una IP VIP en un sistema de alta disponibilidad permite que la IP asociada con el nodo activo cambie dinámicamente en caso de un failover, asegurando que los clientes siempre puedan conectarse al nodo que esté proporcionando el servicio.

Leer más

Manual de Instalación de PostgreSQL en Alta Disponibilidad con Patroni y etcd

1. Introducción

Este manual está diseñado para guiarte a través del proceso de instalación y configuración de una base de datos PostgreSQL en alta disponibilidad utilizando Patroni y etcd como servicio de coordinación. Patroni facilita la gestión del clúster de bases de datos PostgreSQL y asegura la conmutación por error automática, mientras que etcd proporciona la sincronización de la configuración entre los nodos del clúster.

Este tipo de configuración es ideal para entornos de producción donde se necesita garantizar alta disponibilidad y resistencia ante fallos de nodo.

2. Requisitos Previos

Antes de comenzar con la instalación, asegúrate de cumplir con los siguientes requisitos previos:

  • Sistema Operativo: GNU/Linux (En este caso emplearemos Debian).
  • Privilegios de root: Acceso a una cuenta con permisos de superusuario para realizar instalaciones y configuraciones del sistema.
  • Red: Tres servidores (o más) en la misma red con direcciones IP estáticas.
  • Conectividad SSH: Asegúrate de que todos los nodos puedan comunicarse entre sí mediante SSH.
  • Dependencias: Necesitarás herramientas como curl, wget, y otros paquetes necesarios para descargar e instalar componentes.

2.1 Elección de la Cantidad de Nodos en Alta Disponibilidad

Cuando se configura un clúster de PostgreSQL en alta disponibilidad con Patroni y etcd, una de las decisiones clave es el número de nodos que formarán parte del clúster. La cantidad de nodos tiene un impacto directo en la tolerancia a fallos, la capacidad de realizar conmutaciones por error y la disponibilidad general del sistema. A continuación, explicamos cómo calcular el número adecuado de nodos y por qué se recomienda utilizar un número impar de nodos en algunos casos.

¿Cuántos Nodos Necesito?

El número mínimo recomendado para configurar un clúster de alta disponibilidad es de tres nodos. Este número de nodos asegura que el sistema sea lo suficientemente robusto como para tolerar fallos de al menos un nodo sin que se pierda la disponibilidad o el consenso en el clúster.

Para calcular el número de nodos necesarios en un clúster con etcd, se sigue una fórmula relacionada con el quorum. El quorum es la cantidad mínima de nodos que deben estar disponibles para que el sistema tome decisiones de manera confiable. Esta fórmula es la siguiente:

quorum=nodos2+1quorum = \frac{nodos}{2} + 1

Por ejemplo:

  • Con 3 nodos: el quorum es de 2 nodos, lo que permite que el sistema siga funcionando si uno de los nodos falla.
  • Con 5 nodos: el quorum es de 3 nodos, permitiendo que el sistema siga operativo incluso si dos nodos fallan.
  • Con 7 nodos: el quorum es de 4 nodos, lo que permite una mayor tolerancia a fallos.

¿Por qué es importante tener un número impar de nodos?

El uso de un número impar de nodos es fundamental cuando se utilizan tecnologías de consenso, como etcd o Raft, que son responsables de mantener la consistencia de los datos en el clúster. Esto se debe a que el consenso depende de un proceso de votación entre los nodos para tomar decisiones. Si hay un número par de nodos, existe el riesgo de que no se pueda alcanzar un consenso en caso de un fallo, ya que no se podría determinar qué nodo tiene la mayoría.

Por ejemplo:

  • Si el clúster tiene 2 nodos y uno de ellos falla, el otro nodo quedaría sin quorum, ya que no puede decidir por sí mismo si el nodo caído debe ser promovido o no.
  • Con 3 nodos, si uno falla, los otros dos pueden seguir trabajando y decidir qué hacer con el nodo caído.

Por lo tanto, siempre que se utilicen servicios de coordinación y consenso (como etcd o Consul), es recomendable tener un número impar de nodos en el clúster para garantizar que siempre se pueda alcanzar el quorum y evitar problemas de «split-brain» (división del clúster).

¿Cuándo se podrían usar nodos pares?

En algunos casos, los nodos pares pueden ser adecuados, pero solo para ciertos tipos de servicios que no dependen de un proceso de consenso, como en la distribución de carga o en clústeres de Kubernetes donde los nodos de worker no participan en decisiones críticas de consenso. Algunos ejemplos de estos casos son:

  • Balanceadores de carga: En servicios como HAProxy o NGINX, los nodos de balanceo pueden ser pares, ya que su objetivo es distribuir el tráfico sin necesidad de consenso.
  • Servidores de aplicaciones: Si el servicio solo necesita alta disponibilidad pero no se requiere un proceso de consenso entre los nodos, los nodos de aplicaciones pueden ser pares.

Resumen

  • Para clústeres de alta disponibilidad que utilizan Patroni y etcd, 3 nodos es el mínimo recomendado, y se debe utilizar un número impar para garantizar el consenso y la disponibilidad en caso de fallos.
  • 5 nodos es ideal para entornos más grandes o donde se espera una mayor carga, ya que proporciona más tolerancia a fallos.
  • El número de nodos puede ser par en servicios que no requieren consenso, como balanceadores de carga o servidores de aplicaciones.
Leer más

SQL Server: Cheat Sheet para Desarrolladores y Administradores

Introducción a SQL:

¿Qué es SQL? SQL (Structured Query Language) es un lenguaje de programación diseñado para gestionar y manipular datos almacenados en sistemas de gestión de bases de datos relacionales (RDBMS). Con SQL, puedes realizar diversas operaciones, desde consultas básicas hasta tareas avanzadas de administración de bases de datos.

¿Por qué SQL es Importante? En el corazón de muchas aplicaciones y sistemas, SQL desempeña un papel crucial al permitir a los desarrolladores o administradores interactuar con bases de datos de manera eficiente. Con SQL, puedes extraer información específica, realizar actualizaciones, insertar datos y mucho más.

Estructura de la Guía:

  1. Conexión a la Base de Datos: Iniciaremos nuestro viaje aprendiendo cómo conectarnos a una base de datos, estableciendo los cimientos para nuestras futuras operaciones.

  2. Consultas Básicas: Exploraremos cómo realizar consultas simples a una sola tabla, aplicando condiciones, ordenando resultados y resumiendo datos.

  3. Manipulación de Datos: Aprenderemos a insertar, actualizar y eliminar datos, habilidades esenciales para la gestión efectiva de información.

  4. Funciones Útiles: Descubriremos funciones incorporadas que nos ayudarán a extraer información valiosa de nuestras bases de datos.

  5. Optimización de Consultas: Mejoraremos la eficiencia de nuestras consultas, utilizando índices y prácticas recomendadas.

  6. Administración y Mantenimiento: Exploraremos comandos clave para respaldar, restaurar y monitorear nuestras bases de datos.

  7. Ampliando el Cheat Sheet con Ejemplos Prácticos: Abordaremos situaciones más complejas, desde la copia de bases de datos hasta la gestión avanzada de permisos.

Leer más

Backup de MySQL en Azure Utilizando Azure Automation

Introducción

La seguridad y la disponibilidad de los datos son elementos fundamentales en cualquier infraestructura tecnológica. En este artículo, detallaremos el proceso de configuración de un backup automatizado para una base de datos MySQL alojada en una máquina virtual (VM) Linux en Azure. Utilizaremos Azure Automation y una Identidad Administrada por Usuario (UMI) para lograr una autenticación segura y eficiente.

backup Incremental y Full

Una de las características destacadas de este script es su capacidad para realizar backups incrementales diarios, seguidos de un full  backup  los domingos. Esto se logra gracias a la configuración del Binary Log en MySQL, que permite identificar y respaldar solo las actualizaciones realizadas desde el último backup.

Personalización del Horario de backup

Si deseas modificar el horario de los backups incrementales, especialmente si no deseas realizar el full backup  solo los domingos, el script es altamente personalizable. Los parámetros dayOfWeek y dayfullbackup te permiten ajustar fácilmente estos horarios según tus necesidades.

Leer más

Cluster PostgreSQL 13

En esta ocasión veremos como instalar y configurar un cluster en alta disponibilidad de base de datos bajo PostgreSQL 13.

n primer lugar agregamos el repositorio 

wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
echo "deb http://apt.postgresql.org/pub/repos/apt/ $(lsb_release -cs)-pgdg main" | sudo tee /etc/apt/sources.list.d/postgresql-pgdg.list > /dev/null
Leer más

FATAL [search_phase_execution_exception] all shards failed :: {«path»:»/.kibana/doc/

En este POST veremos como solucionar este problema al iniciar Kibana, para solventarel problema creé un nuevo indice vació y mapee el antiguo al nuevo creado.

Al realizar un status del servicio podemos ver los siguientes errores:

May 24 11:29:01 kibana kibana[5107]: ason\":\"all shards failed\",\"phase\":\"query\",\"grouped\":true,\"failed_shards\":[]},\"status\":503}',\n  toStrin
May 24 11:29:01 kibana kibana[5107]:  FATAL  [search_phase_execution_exception] all shards failed :: {"path":"/.kibana/doc/_count","query":{},"body":"{\
Leer más

MySQL [ERROR] Can’t init tc log

Al intentar iniciar el servicio de mariadb comprobamos que no inicia

/etc/init.d/mysql status
mariadb.service – MariaDB database server
Loaded: loaded (/lib/systemd/system/mariadb.service; enabled; vendor preset: enabled)
Active: failed (Result: exit-code) since Thu 2018-08-09 12:43:52 CEST; 1min 3s ago
Process: 1241 ExecStart=/usr/sbin/mysqld $MYSQLD_OPTS $_WSREP_NEW_CLUSTER $_WSREP_START_POSITION (code=exited, status=1/FAILURE)
Process: 1151 ExecStartPre=/bin/sh -c [ ! -e /usr/bin/galera_recovery ] && VAR= || VAR=`/usr/bin/galera_recovery`; [ $? -eq 0 ] && systemctl set-environment _WSREP_START_POSITION=$VAR || exit 1 (code=exited, status=0/SUCCESS)
Process: 1148 ExecStartPre=/bin/sh -c systemctl unset-environment _WSREP_START_POSITION (code=exited, status=0/SUCCESS)
Process: 1145 ExecStartPre=/usr/bin/install -m 755 -o mysql -g root -d /var/run/mysqld (code=exited, status=0/SUCCESS)
Main PID: 1241 (code=exited, status=1/FAILURE)
Status: «MariaDB server is down»

Revisando el log comprobamos el siguiente error:

tail -3 /var/log/mysql/error.log
2018-08-09 12:45:00 139927639765568 [ERROR] Can’t init tc log
2018-08-09 12:45:00 139927639765568 [ERROR] Aborting

 

Eliminamos el log TC y iniciamos el servicio  de nuevo

rm /var/lib/mysql/tc.log

/etc/init.d/mysql start

 

:wq!