Skip to main content

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
    }
}