У меня есть 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 находится в полной репликации, моя запись на первом сервере возьмет на себя все остальное, но это не относилось к записи доступа пользователя. Однако все таблицы, поля, правки и тому подобное БЫЛИ реплицированы, что заставило меня поверить в то, что разрешения тоже, но, увы, этого не произошло.