Implementación de Clúster PXC con Balanceo de Carga y Respaldo Caliente en Docker

Configuración del Clúster de Base de Datos PXC

Para establecer un entorno de base de datos de alta disponibilidad en Docker, primero descargue la imagen oficial de Percona XtraDB Cluster:

docker pull percona/percona-xtradb-cluster

A continuación, asigne un alias a la imagen para simplificar su uso en comandos posteriores:

docker tag percona/percona-xtradb-cluster imagen_pxc

Cree una red de Docker aislada con un rango de subred específico para los componentes de la base de datos:

docker network create --subnet=10.20.0.0/24 red_bd

Defina volúmenes dedicados para almacenar los datos de cada nodo del clúster y para backups:

docker volume create --name vol_datos1
docker volume create --name vol_datos2
docker volume create --name vol_datos3
docker volume create --name vol_datos4
docker volume create --name vol_datos5
docker volume create --name vol_respaldo

Despliegue el clúster PXC con cinco nodos. Es esencial esperar a que el nodo principle esté operativo y accesible antes de iniciar los nodos secundarios para garantizar una unión correcta al clúster.

# Nodo principal del clúster
docker run -d -p 4306:3306 -e MYSQL_ROOT_PASSWORD=Pwd$ecure789 -e CLUSTER_NAME=CLUS_PXC_PRINCIPAL -e XTRABACKUP_PASSWORD=Pwd$ecure789 -v vol_datos1:/var/lib/mysql -v vol_respaldo:/respaldo --privileged --name=bd_primaria --net=red_bd --ip 10.20.0.10 imagen_pxc
# Primer nodo secundario
docker run -d -p 4307:3306 -e MYSQL_ROOT_PASSWORD=Pwd$ecure789 -e CLUSTER_NAME=CLUS_PXC_PRINCIPAL -e XTRABACKUP_PASSWORD=Pwd$ecure789 -e CLUSTER_JOIN=bd_primaria -v vol_datos2:/var/lib/mysql --privileged --name=bd_secundaria1 --net=red_bd --ip 10.20.0.11 imagen_pxc
# Segundo nodo secundario
docker run -d -p 4308:3306 -e MYSQL_ROOT_PASSWORD=Pwd$ecure789 -e CLUSTER_NAME=CLUS_PXC_PRINCIPAL -e XTRABACKUP_PASSWORD=Pwd$ecure789 -e CLUSTER_JOIN=bd_primaria -v vol_datos3:/var/lib/mysql --privileged --name=bd_secundaria2 --net=red_bd --ip 10.20.0.12 imagen_pxc
# Tercer nodo secundario
docker run -d -p 4309:3306 -e MYSQL_ROOT_PASSWORD=Pwd$ecure789 -e CLUSTER_NAME=CLUS_PXC_PRINCIPAL -e XTRABACKUP_PASSWORD=Pwd$ecure789 -e CLUSTER_JOIN=bd_primaria -v vol_datos4:/var/lib/mysql --privileged --name=bd_secundaria3 --net=red_bd --ip 10.20.0.13 imagen_pxc
# Cuarto nodo secundario
docker run -d -p 4310:3306 -e MYSQL_ROOT_PASSWORD=Pwd$ecure789 -e CLUSTER_NAME=CLUS_PXC_PRINCIPAL -e XTRABACKUP_PASSWORD=Pwd$ecure789 -e CLUSTER_JOIN=bd_primaria -v vol_datos5:/var/lib/mysql -v vol_respaldo:/respaldo --privileged --name=bd_secundaria4 --net=red_bd --ip 10.20.0.14 imagen_pxc

Balanceo de Carga con HAProxy

Instale la imagen oficial de HAProxy desde Docker Hub:

docker pull haproxy

En el host, cree un archivo de configuración para HAProxy. Ajuste los parámetros según las necesidades de red y rendimiento.

vi /ruta/config/haproxy.conf

Contenido del archivo de configuración:

global
    chroot /usr/local/etc/haproxy
    log 127.0.0.1 local5 info
    daemon

defaults
    log global
    mode http
    option httplog
    option dontlognull
    timeout connect 5000
    timeout client  50000
    timeout server  50000

listen  interfaz_monitoreo
    bind  0.0.0.0:9090
    mode  http
    stats uri   /estado
    stats realm  Estadisticas\ Globales
    stats auth  admin_user:AccessKey99

listen  balanceo_mysql
    bind  0.0.0.0:3306
    mode  tcp
    balance  roundrobin
    option  tcplog
    option  mysql-check user haproxy_check
    server  nodo_bd1 10.20.0.10:3306 check weight 1 maxconn 2000
    server  nodo_bd2 10.20.0.11:3306 check weight 1 maxconn 2000
    server  nodo_bd3 10.20.0.12:3306 check weight 1 maxconn 2000
    server  nodo_bd4 10.20.0.13:3306 check weight 1 maxconn 2000
    server  nodo_bd5 10.20.0.14:3306 check weight 1 maxconn 2000
    option  tcpka

Despliegue dos contenedores de HAProxy para redundancia. Inicie el servicio dentro de cada contenedor tras su creación.

# Primer servidor de balanceo
docker run -it -d -p 5001:9090 -p 5002:3306 -v /ruta/config:/usr/local/etc/haproxy --name haproxy1 --privileged --net=red_bd --ip 10.20.0.20 haproxy
docker exec -it haproxy1 bash
haproxy -f /usr/local/etc/haproxy/haproxy.conf
# Segundo servidor de balanceo
docker run -it -d -p 5003:9090 -p 5004:3306 -v /ruta/config:/usr/local/etc/haproxy --name haproxy2 --privileged --net=red_bd --ip 10.20.0.21 haproxy
docker exec -it haproxy2 bash
haproxy -f /usr/local/etc/haproxy/haproxy.conf

Alta Disponibilidad con Keepalived

Dentro de cada contenedor de HAProxy, instale y configure Keepalived para gestionar una IP virtual.

# En haproxy1
docker exec -it haproxy1 bash
apt-get update
apt-get install vim keepalived
vim /etc/keepalived/keepalived.conf

Configuración para el primer servidor HAProxy:

vrrp_instance  INSTANCIA_VRRP {
    state  MASTER
    interface  eth0
    virtual_router_id  101
    priority  150
    advert_int  1
    authentication {
        auth_type  PASS
        auth_pass  VrrpAuth@123
    }
    virtual_ipaddress {
        10.20.0.200
    }
}

Inicie el servicio Keepalived y verifique la IP virtual desde el host.

service keepalived start
# En el host
ping 10.20.0.200

Repita el proceso en el segundo servidor HAProxy, con una prioridad menor para respaldo.

# En haproxy2
docker exec -it haproxy2 bash
apt-get update
apt-get install vim keepalived
vim /etc/keepalived/keepalived.conf

Configuración para el segundo servidor HAProxy:

vrrp_instance  INSTANCIA_VRRP {
    state  BACKUP
    interface  eth0
    virtual_router_id  101
    priority  100
    advert_int  1
    authentication {
        auth_type  PASS
        auth_pass  VrrpAuth@123
    }
    virtual_ipaddress {
        10.20.0.200
    }
}

Inicie Keepalived en este contenedor también.

service keepalived start
# En el host
ping 10.20.0.200

Para implementar un respaldo doble en el host, instale y configure Keepalived directamente en el sistema operativo del host. Ajuste la configuración para apuntar a la IP virtual de los contenedores.

# Instalar en el host
yum -y install keepalived
# Editar configuración
vi /etc/keepalived/keepalived.conf

Configuración del host con Keepalived:

vrrp_instance VI_HOST {
    state MASTER
    interface eth0
    virtual_router_id 202
    priority 200
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass  HostVrrp#456
    }
    virtual_ipaddress {
        192.168.1.100
    }
}

virtual_server 192.168.1.100 9090 {
    delay_loop 3
    lb_algo rr
    lb_kind NAT
    persistence_timeout 50
    protocol TCP
    real_server 10.20.0.200 9090 {
        weight 1
    }
}

virtual_server 192.168.1.100 3306 {
    delay_loop 3
    lb_algo rr
    lb_kind NAT
    persistence_timeout 50
    protocol TCP
    real_server 10.20.0.200 3306 {
        weight 1
    }
}

Inicie el servicio Keepalived en el host.

service keepalived start

Respaldo y Restauración de Datos

Para realizar un respaldo en caliente de la base de datos, entre al nodo principal del clúster PXC y utilice la herramienta de respaldo nativa.

docker exec -it bd_primaria bash
apt-get update
apt-get install percona-xtrabackup-24
innobackupex --user=root --password=Pwd$ecure789 /respaldo/completo_$(date +%F)

En caso de necseitar una restauración en frío, detenga y elimine los nodos secundarios. Limpei los datos del nodo principal y restaure desde el respaldo.

# Detener y eliminar nodos secundarios
docker stop bd_secundaria1 bd_secundaria2 bd_secundaria3 bd_secundaria4
docker rm bd_secundaria1 bd_secundaria2 bd_secundaria3 bd_secundaria4
# En el nodo principal, restaurar datos
docker exec -it bd_primaria bash
rm -rf /var/lib/mysql/*
innobackupex --user=root --password=Pwd$ecure789 --apply-back /respaldo/completo_2024-01-15/
innobackupex --user=root --password=Pwd$ecure789 --copy-back /respaldo/completo_2024-01-15/

Tras la restauración, recree los nodos secundarios para reconstruir el clúster PXC con los comandos de despliegue anteriores, asegurándose de que el nodo principal esté activo.

Etiquetas: Docker PXC HAProxy Keepalived MySQL

Publicado el 7-14 02:58