HAProxy pero sigue siendo un único punto de falla

HAProxy pero sigue siendo un único punto de falla

Estoy configurando un clúster de prueba: Maria Galera Cluster en 3 nodos físicos con HAProxy. Está funcionando, pero cometí algún tipo de error de principiante que parece que no puedo resolver, así que espero que alguien pueda echar un vistazo experto y ayudarme, ¡¿por favor?!

Tengo 3 nodos físicos Nodo1: 10.1.1.120

Nodo2: 10.1.1.121

Nodo3: 10.1.1.124

Usando HAProxy una IP virtual de 10.1.1.113

En funcionamiento, cuando consulto a través de la IP virtual me sale...

$ mysql -uroot -pPassword -P 3306 -h 10.1.1.113 -e "select @@hostname; show processlist;"
+------------+
| @@hostname |
+------------+
| node2      |
+------------+
+----+-------------+-------------+------+---------+------+--------------------+------------------+----------+
| Id | User        | Host        | db   | Command | Time | State              | Info                 | Progress |
+----+-------------+-------------+------+---------+------+--------------------+------------------+----------+
|  1 | system user |             | NULL | Sleep   |   37 | NULL               | NULL                 |    0.000 |
|  2 | system user |             | NULL | Sleep   |   37 | wsrep aborter idle | NULL             |    0.000 |
| 45 | root        | node1:55877 | NULL | Query   |    0 | init               | show processlist |    0.000 |
+----+-------------+-------------+------+---------+------+--------------------+-

Y si lo hagoip unennodo1- ahí es donde se encuentra mi dirección IP virtual, PERO el nombre de host aparece comonodo2.

Si apago (o simplemente desactivo eth0) en el nodo1, la dirección IP virtual se desplaza a otra parte, pero el nombre de host @@ aún regresa como nodo2.

El problema surge si cierro el nodo2, cuando intento usar MySQL usando la IP virtual obtengo:

**ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 0 "Internal error/check (Not system error)"**

(en este punto, si inicio sesión en cualquiera de las máquinas locales sin usar la IP virtual, funcionará).

Entonces, parece que la parte HAProxy está funcionando (ya que se mueve apropiadamente), pero MariaDB está tratando de hacer lo suyo y ha decidido que todo debe enrutarse a través del Nodo2.

No tengo ninguna dirección de enlace en mis archivos .cnf. Estoy usando el puerto 1306 para mi servicio SQL para evitar conflictos con 3306 al reiniciar el servicio en una máquina que tiene la IP virtual y la publicación 3306 al mismo tiempo.

Mi archivo keepalived es... (no estoy seguro si esto es correcto, pero todos los nodos están configurados como maestros y las prioridades son 100,101 y 102 respectivamente; no parece hacer una diferencia)

global_defs {
  router_id geordi
}
vrrp_script haproxy {
  script "killall -0 haproxy"
  interval 1
  weight 1
}

vrrp_instance 51 {
  virtual_router_id 51
  priority 101
  state MASTER
  interface eth0
  virtual_ipaddress {
    10.1.1.113 dev eth0
  }
  track_script {
    haproxy
  }
}

y mi haproxy.cfg es:

global
    log /dev/log    local0
    log /dev/log    local1 notice
    chroot /var/lib/haproxy
    user haproxy
    group haproxy
    daemon

defaults
    log global
    mode    http
    option  dontlognull
    contimeout 5000
    clitimeout 50000
    srvtimeout 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 mysql_proxy 10.1.1.113:3306
        mode tcp 
        balance roundrobin
        option tcpka 
        option httpchk
        option mysql-check user haproxy
        server node1 10.1.1.120:1306 check 
        server node2 10.1.1.121:1306 check 
        server node3 10.1.1.124:1306 check

Cualquier sugerencia recibida con gratitud, por favor. Estoy frustrantemente cerca de que todo esto funcione, ¡pero no del todo!

Respuesta1

Establecido explícitamente bind-address=0.0.0.0en my.cnf.

Además (probablemente ya hayas hecho esto si has llegado hasta aquí):

  1. asegúrese de que cada host tenga la dirección IP 10.1.1.113(si usa keepalived, entonces a través de una interfaz ficticia como /32).
  2. establecer net.ipv4.conf.default.rp_filter = 2en/etc/sysctl.conf
  3. establecer net.ipv4.conf.default.accept_source_route = 0en/etc/sysctl.conf

Esto permite a MySQL ESCUCHAR en todas las interfaces y permite a MySQL RESPONDER en una interfaz para la que no estaba destinado el paquete.

La interfaz de red en el nodo1 (10.1.1.120) recibe el paquete como "10.1.1.13" en la interfaz correspondiente a 10.1.1.120. Normalmente esto se eliminaría diciendo "eso no es para mí". Esto sucede en la capa "Internet" del modelo TCP/IP.

Sin embargo, las disposiciones 2 y 3 anteriores dicen "simplemente acéptelo, puede que sea para nosotros", que luego pasa a MySQL (capa "Aplicación" del modelo TCP/IP). MySQL ve que estamos vinculados a todas las direcciones, una de ellas es 10.1.1.113 (disposición 1), y la procesa.

información relacionada