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.