Назад | Перейти на главную страницу

HAProxy отправляет трафик только на один узел

У меня есть HAProxy с IP 10.60.61.20 и три узла MariaDB с IP .21, .22, .23, все, конечно, в одной подсети. У меня есть синхронизированный кластер MariaDB, и они могут читать / писать друг другу, но когда я настраиваю HAProxy, он отправляет трафик только на 10.60.61.21 (первый узел). Даже после того, как я отключил mysql на первом узле, HAProxy сообщает, что произошла ошибка подключения, и не отправляет трафик на два других узла. Кто-нибудь видел это раньше? Я только что построил 4 сервера Ubuntu 12.04, 3 для узлов, а другой - HAProxy. Вот мой файл .conf HAProxy:

global
    log 127.0.0.1 local0 notice
    user haproxy
    group haproxy

defaults
    log global
    retries 2
    timeout connect 3000
    timeout server 5000
    timeout client 5000

listen mysql-cluster
    bind 0.0.0.0:3306
    mode tcp
    option mysql-check user haproxy_check
    balance roundrobin
    server mariadb1 10.60.61.22:3306 check
    server mariadb2 10.60.61.21:3306 check
    server mariadb3 10.60.61.23:3306 check

Любая помощь будет оценена.

Я бы проверил журнал на haproxy балансировщик нагрузки.

# less /var/log/haproxy.log

Тебе следует увидеть ВВЕРХ и ВНИЗ Сообщения. Если вы заметили, что он не дает сбоев достаточно быстро, вы всегда можете изменить:

server mariadb1 10.60.61.22:3306 check
server mariadb2 10.60.61.21:3306 check
server mariadb3 10.60.61.23:3306 check

К чему-то более агрессивному, например fail over after 2 failed checks, check ever second:

server mariadb1 10.60.61.22:3306 check fall 2 inter 1000
server mariadb2 10.60.61.21:3306 check fall 2 inter 1000
server mariadb3 10.60.61.23:3306 check fall 2 inter 1000

DigitalOcean имеет отличный учебник на этом.

я буду угадать ваша проблема на стороне приложения.

Поскольку это режим TCP, он будет балансировать TCP-соединения между различными серверами а не транзакции sql. Это означает, что если ваше приложение не использует бассейн подключений, но просто поддерживает одно открытое соединение, это соединение останется открытым для одного сервера. Если ваше приложение не пытается повторить попытку при неудачных соединениях, HAProxy не сможет волшебным образом переместить неудачное TCP-соединение на другой сервер.

Я думаю, что простым тестом было бы запускать что-то вроде следующей команды против IP-адреса haproxy снова и снова (однако не запускайте ее в одном сеансе консоли):

mysql -u monitor -p -e "show variables like 'server_id'"

Спасибо всем за ваш вклад. Я наконец-то решил эту проблему. Во время установки я обратился к первому хосту MariaDB и сказал, по сути, (я не являюсь профессионалом в mysql): «предоставить пользователю haproxy_check доступ к любой базе данных с полными разрешениями». Но я не делал этого и с другими серверами. Таким образом, HAProxy смог войти на первый сервер, используя правильное имя пользователя / пароль, но эти разрешения пользователя не реплицировались в другие базы данных, поэтому мне пришлось вручную войти на каждый сервер MariaDB и создать запись для этого пользователя для входа в любая база данных. Как только это произошло, все сразу заработало. Еще раз спасибо всем за понимание. Я предположил, что, поскольку мой кластер galera находится в полной репликации, моя запись на первом сервере возьмет на себя все остальное, но это не относилось к записи доступа пользователя. Однако все таблицы, поля, правки и тому подобное БЫЛИ реплицированы, что заставило меня поверить в то, что разрешения тоже, но, увы, этого не произошло.