HAProxy, но все еще единая точка отказа

Я настраиваю тестовый кластер - Maria Galera Cluster на 3 физических узлах с HAProxy. Его работа, но я совершил некоторую ошибку новичка, которую я, может казаться, не разрешаю - так, надо надеяться, кто-то может бросить опытный взгляд и выручить меня?!

У меня есть 3 физических узла Node1: 10.1.1.120

Node2: 10.1.1.121

Node3: 10.1.1.124

Используя HAProxy виртуальный IP 10.1.1.113

И работая, когда я запрашиваю через виртуальный IP, я добираюсь...

$ 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 |
+----+-------------+-------------+------+---------+------+--------------------+-

И если я делаю IP на node1 - который является действительно, где мой виртуальный IP-адрес живет, НО имя хоста возвращается как node2.

Если я завершаю работу (или просто отключаю eth0) на node1, виртуальные сдвиги IP-адреса в другом месте, но @@ имя хоста все еще возвращается как node2.

Проблема возникает, если я завершаю работу node2, затем когда я пробую к mysql использование виртуального IP, я добираюсь:

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

(в этой точке, если я вхожу в систему какой-либо из локальных машин, не используя виртуальный IP, он будет работать).

Так, кажется, как будто часть HAProxy работает (поскольку это перемещается соответственно), но MariaDB пытается сделать свою собственную вещь и решил, что все должно быть направлено через Node2.

Я имею, не связывают адресный в моих .cnf файлах. Я использую порт 1306 для моего sql сервиса для предотвращения любых конфликтов с 3 306 при перезапуске сервиса на машину, которая, оказывается, имеет виртуальный IP и отправляет 3306 одновременно.

Мой keepalived файл... (не уверенный, если это корректно, но все узлы установлены освоить, и приоритеты 100,101, и 102 соответственно - кажется, не имеет значение),

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

и мой 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

Любые предложения с благодарностью получили - я разочаровывающе близко к получению этой всей работы, просто не совсем там!

3
задан 23 February 2015 в 01:02
1 ответ

четко установите bind-address=0.0.0.0 в my.cnf.

Дополнительно (вы, вероятно, уже сделали это, если вы так далеко):

  1. удостоверьтесь, что каждый хост имеет ip-адрес 10. 1.1.113 (если используется keepalived, то через фиктивный интерфейс как /32).
  2. set net.ipv4.conf.default.rp_filter = 2 в /etc/sysctl.conf
  3. set net.ipv4.conf.default.accept_source_route = 0 в /etc/sysctl.conf

Это позволяет MySQL LISTEN на всех интерфейсах, и позволяет MySQL RESPOND на интерфейсе, для которого пакет не предназначен.

Сетевой интерфейс на узле 1 (10.1.1.120) получает пакет как "10.1.1.13" на интерфейсе, соответствующем 10.1.1.120. Обычно это сбрасывается, говоря "это не для меня". Это происходит на уровне "Internet" модели TCP/IP.

Однако, в положениях 2 и 3 выше сказано "просто прими это, это может быть для нас", что затем переходит на MySQL ("прикладной" уровень модели TCP/IP). MySQL видит, что мы привязаны ко всем адресам, один из которых 10.1.1.113 (положение 1), и обрабатывает его.

.
1
ответ дан 3 December 2019 в 07:27

Теги

Похожие вопросы