HAProxy mas ainda único ponto de falha

3

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á!

    
por user3566845 23.02.2015 / 00:02

1 resposta

1

Defina explicitamente bind-address=0.0.0.0 em my.cnf .

Além disso (você provavelmente já fez isso se estiver longe):

  1. garanta que cada host tenha o endereço IP 10.1.1.113 (se estiver usando keepalived e, em seguida, por meio de uma interface fictícia como / 32).
  2. definir net.ipv4.conf.default.rp_filter = 2 em /etc/sysctl.conf
  3. definir net.ipv4.conf.default.accept_source_route = 0 em /etc/sysctl.conf

Isso permite que o MySQL OUÇA em todas as interfaces, e permite que o MySQL RESPONDA em uma interface que o pacote não é para.

A interface de rede no node1 (10.1.1.120) obtém o pacote como "10.1.1.13" na interface correspondente a 10.1.1.120. Normalmente, isso seria descartado dizendo "isso não é para mim". Isso está acontecendo na camada "Internet" do modelo TCP / IP.

No entanto, as provisões 2 e 3 acima dizem "apenas aceite, pode ser para nós", que então passa para o MySQL (camada "Application" do modelo TCP / IP). O MySQL vê que estamos ligados a todos os endereços, um deles é 10.1.1.113 (provisão 1) e o processa.

    
por 04.07.2015 / 21:34