
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.0
en my.cnf
.
Además (probablemente ya hayas hecho esto si has llegado hasta aquí):
- 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). - establecer
net.ipv4.conf.default.rp_filter = 2
en/etc/sysctl.conf
- establecer
net.ipv4.conf.default.accept_source_route = 0
en/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.