Balanceador Galera Haproxy
Ahora procederemos a configurar un balanceador en alta disponibilidad usando HAProxy y Keepalived
En primer lugar instalaremos los paquetes necesarios
apt install haproxy net-tools keepalived
Procederemos a configurar HAProxy, para ello deberemos de crear un usuario en nuestro Cluster de Galera, para las peticiones de conectividad.
CREATE USER 'haproxy'@'%'; GRANT PROCESS ON *.* TO 'haproxy'@'%';
Ahora configuraremos HAProxy Editamos el archivo de configuración
global log /dev/log local0 log /dev/log local1 notice chroot /var/lib/haproxy stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners stats timeout 30s user haproxy group haproxy daemon # Default SSL material locations ca-base /etc/ssl/certs crt-base /etc/ssl/private # See: https://ssl-config.mozilla.org/#server=haproxy&server-version=2.0.3&config=intermediate ssl-default-bind-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM> ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256 ssl-default-bind-options ssl-min-ver TLSv1.2 no-tls-tickets defaults log global mode http option httplog option dontlognull timeout connect 5000 timeout client 50000 timeout server 50000 errorfile 400 /etc/haproxy/errors/400.http errorfile 403 /etc/haproxy/errors/403.http errorfile 408 /etc/haproxy/errors/408.http errorfile 500 /etc/haproxy/errors/500.http errorfile 502 /etc/haproxy/errors/502.http errorfile 503 /etc/haproxy/errors/503.http errorfile 504 /etc/haproxy/errors/504.http listen galera_cluster bind 0.0.0.0:3306 mode tcp #option tcplog option tcpka option mysql-check user haproxy balance source server db1 192.168.15.221:3306 check server db2 192.168.15.222:3306 check server db3 192.168.15.223:3306 check listen stats bind 0.0.0.0:8080 mode http option httplog stats enable stats uri / stats realm Strictly\ Private stats auth admin:MIPASSWORD
En las opciones de configuración pondremos en el balance source, existe la opción de roundrobin, o leastconn, pero teniendo en cuenta que es un sistema de tolerancia y no de reparto de carga, la mejor opción es la de source.
Una vez configurado, procederemos a probar.
En primer lugar arrancaremos el HAProxy
service haproxy start
Suponiendo que la IP de nuestro HAProxy sea la 192.168.15.222, desde cualquier máquina de la red, ejecutaremos:
mysql -uroot -pMYPASSWORD -h192.168.15.222 -e "show variables like 'wsrep_node_name' ;"
Nos devolverá algo así
+-----------------+-------+ | Variable_name | Value | +-----------------+-------+ | wsrep_node_name | Nodo1 | +-----------------+-------+
Si tenemos algún fallo del tipo "Layer7 wrong status: Host '193.168.15.224' is blocked because of many connection errors; unblock with 'mariadb-admin flush-hosts'" En la interfaz gráfica ejecutaremos el comando:
mariadb-admin flush-hosts
Interfaz gráfica (en el puerto 8080)
A continuación dejaremos el servicio configurado para que arranque con nuestra máquina
systemctl enable haproxy
Ahora que esto funciona, vamos con el keepalived.
Para ello la IP que hemos configurado (La 192.168.15.224) será nuestra IP flotante, es decir se mantendrá como IP de acceso independientemente de a que servidor HAProxy ataquemos.
Por esto, vamos a repetir la configuración en otra máquina a la cual le asignaremos la IP 192.168.15.226, y la que acabamos de configurar será la 192.168.15.225. Esto puede resultar un poco lioso, pero vamos a ver porqué. Cada equipo tiene una IP la 225 en el que acabamos de configurar, y la 226 en otro equipo nuevo.
Ambos tienen IP diferentes, pero comparten una IP global a través del Keealived.
nano /etc/keepalived/keepalived.conf
Y escribiremos esto:
global_defs { notification_email { sistemas@ateinco.com.com } notification_email_from sistemas@ateinco.com smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id LVS_DEVEL } vrrp_script chk_haproxy { script "killall -0 haproxy" interval 1 weight -2 } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 mcast_src_ip 192.168.15.225 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 876543 } virtual_ipaddress { 192.168.15.224/24 dev eth0 label eth0:1 } track_interface { eth0 } track_script { chk_haproxy } }
Como vemos el equipo en la configuración de Keepalived tiene dos IP (la 225 y la 224) y un valor importante el priority que hemos puesto en 100
Ahora modificaremos el fichero /etc/sysctl.conf
Y agregaremos este valor
net.ipv4.ip_nonlocal_bind = 1
Además comprobaremos que la IP de nuestra tarjeta de red y el nombre de la interfaz están bien configurados en nuestro ejemplo de keepalived hemos puesto eth0, pero puede ser ens18, ens19, etc. Ahora arrancamos keepalived
systemctl start keepalived
Y comprobamos que todo funciona, volvemos a ejecutar:
mysql -uroot -pMYPASSWORD -h192.168.15.222 -e "show variables like 'wsrep_node_name' ;"
Si todo está correcto habilitamos keepalived al inicio
systemctl enable keepalived
Ahora ya tenemos un nodo configurado. Vamos al otro.
Básicamente la configuración es gemela a la de este nodo, salvo por la configuración de keepalived
Tendremos que cambiar la IP que será la 192.168.15.226 y la priority que la pondremos a 99
global_defs { notification_email { sistemas@ateinco.com.com } notification_email_from sistemas@ateinco.com smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id LVS_DEVEL } vrrp_script chk_haproxy { script "killall -0 haproxy" interval 1 weight -2 } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 mcast_src_ip 192.168.15.225 priority 99 advert_int 1 authentication { auth_type PASS auth_pass 876543 } virtual_ipaddress { 192.168.15.224/24 dev eth0 label eth0:1 } track_interface { eth0 } track_script { chk_haproxy } }