Estou configurando um cluster de teste - Maria Galera Cluster em 3 nós físicos com o HAProxy. Está funcionando, mas eu cometi algum tipo de erro de iniciante que não consigo resolver - por isso espero que alguém possa me interessar e me ajudar, por favor!
Eu tenho 3 nós físicos
Nó1: 10.1.1.120
Node2: 10.1.1.121
Nó3: 10.1.1.124
Usando o HAProxy, um IP virtual de 10.1.1.113
Em funcionamento, quando eu consultar através do IP virtual eu recebo ...
$ 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 |
+----+-------------+-------------+------+---------+------+--------------------+-
E se eu fizer ip a no node1 - é de fato onde meu endereço IP virtual está vivo, MAS o nome do host volta como node2 .
Se eu desligar (ou apenas desativar eth0) no node1, o endereço IP virtual mudará para outro lugar, mas o @@ hostname ainda retornará como node2.
O problema vem se eu desligar o node2, então quando eu tento mysql usando o IP virtual eu recebo:
**ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 0 "Internal error/check (Not system error)"**
(neste ponto, se eu fizer login em qualquer uma das máquinas locais sem usar o IP virtual, ele funcionará).
Então, parece que a parte HAProxy está funcionando (já que isso se move apropriadamente), mas o MariaDB está tentando fazer o que quer e decidiu que tudo precisa ser roteado via Node2.
Eu não tenho nenhum endereço de ligação nos meus arquivos .cnf. Estou usando a porta 1306 para meu serviço sql para evitar conflitos com o 3306 ao reiniciar o serviço em uma máquina que por acaso tenha o IP virtual e publique 3306 ao mesmo tempo.
Meu arquivo keepalived é ... (não tenho certeza se isso está correto, mas todos os nós são definidos como master e as prioridades são 100,101 e 102, respectivamente - não parece fazer diferença)
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
}
}
e meu haproxy.cfg é:
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
Qualquer sugestão recebida com gratidão por favor - estou frustrantemente perto de fazer tudo isso funcionar, mas não exatamente lá!