Статус HAproxy показывает DOWN

Я установил кластер MariaDB Galera, который я протестировал, и он отлично работает на следующих серверах: db1 192.169.0.1 db2 192.169.0.2 db3 192.169.0.3

Все они работают на CentOS-6.5, а версия MariaDB — 10.0.

Моей целью было использовать HAproxy для балансировки нагрузки. Я установил и настроил HAproxy на отдельном сервере

db4 192.168.0.4 

без настройки кластера или установки MariaDB, только HAproxy. Проблема в том, что HAproxy, похоже, не работает, то есть не выполняет балансировку нагрузки. Он запускается нормально, и я могу получить к нему доступ через веб-интерфейс:

http://192.168.0.4:9000/haproxy

но состояние серверов показывает, что они не работают, даже если они на самом деле работают на своих соответствующих машинах. Конфигурация HAproxy выглядит следующим образом:

global
log 127.0.0.1 local0 notice
user haproxy
group haproxy

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

listen mariadb-cluster
bind 0.0.0.0:3306
mode tcp
option mysql-check user haproxy
balance roundrobin
server db1 192.168.0.1:3306 check
server db2 192.168.0.2:3306 check
server db4 192.168.0.3:3306 check

listen webinterface
bind 0.0.0.0:9000
mode http
stats enable
stats uri /haproxy
stats realm Strictly\ Private
stats auth admin:password

db1, db2, db3 и db4 — это просто имена хостов для каждого сервера. Поэтому, когда я запускаю команду #hostname на первом сервере, она будет отображать db1.


person The Georgia    schedule 03.10.2014    source источник
comment
вы открыли порт 3306 на сервере haproxy?   -  person zypro    schedule 26.04.2016


Ответы (3)


Я полагаю, что вы проверили журнал, где вы можете видеть входящие и существующие соединения или не направленные к узлу/серверу, которым они также предполагаются.

Я не знаю, была ли это опечатка или нет, но я полагаю, что вы включили db4 (машину haproxy) в качестве узла, верно? Это должна была быть db3)

Также проверьте, можете ли вы получить доступ к порту 3306 с машины HAproxy на каждый узел базы данных.

Если нет, проверьте, есть ли у пользователя haproxy, которого вы определили для процесса проверки, разрешения mysql. Если нет, войдите на один из ваших узловых серверов и:

mysql> GRANT USAGE ON *.* TO 'haproxy'@'%'; 

(в целях безопасности вы должны ограничить «%» IP-адресами, на которых работает HAproxy)

У меня такая же конфигурация, как и у вас, но добавлены параметры для ведения с весом узла и максимальным количеством соединений на узел. Я также предпочитаю использовать "leastcon" вместо "round robin", поэтому, пожалуйста, оцените, соответствует ли это вашей цели.

haproxy.cfg

global
    log         127.0.0.1 local0
    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     512
    user        haproxy
    group       haproxy
    daemon
    stats socket /var/lib/haproxy/stats mode 666

defaults
        log     global
        mode    http
        option  tcplog
        option  dontlognull
        retries 3
        option redispatch
        maxconn 1024
        timeout connect     3s
        timeout client      50s
        timeout server      50s
        timeout check       10s

listen website_cluster 0.0.0.0:3306
        mode tcp
        balance leastconn
        option tcpka
        option httpchk
        option mysql-check user haproxy
        stick store-request src
        stick-table type ip size 200k expire 30m
        server db1 192.168.0.1:3306 weight 40 check port 3306 inter 5000 rise 1 fall 3 maxconn 120
        server db2 192.168.0.2:3306 weight 30 check port 3306 inter 5000 rise 1 fall 3 maxconn 75
        server db3 192.168.0.3:3306 weight 30 check port 3306 inter 5000 rise 1 fall 3 maxconn 75

На сайте MariaDB также есть руководство, которое также может помочь вам пройти: здесь

person bigux    schedule 23.10.2014

Я также столкнулся с этой проблемой и потратил почти день только на то, чтобы узнать, что HAPROXY имеет 2 режима балансировки / проверки работоспособности бэкэнда. Проверка уровня 4 работает на уровне 4 OSI, а уровень 7 работает на уровне приложений. Я использовал option mysql-check, который проверяет уровень 7 и требует установки mysql-client на сервере/узле HAPROXY. У меня не было никакого пакета Mysql-клиента на машине/контейнере HAPROXY (докере). Затем я преобразовал проверку опции в option tcp-check, она работала нормально. Вот мой полный код для haproxy.cfg

global
    log haproxy-logger local0 notice
    fuser 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
    option tcp-check
    balance roundrobin
    server mysql1 mysql1:3306 check
    server mysql2 mysql2:3306 check weight 2
listen mysql-clusterstats
    bind 0.0.0.0:8080
    mode http
    stats enable
    stats uri /
    stats realm Strictly\ Private
    stats auth status:mypass

Наконец исправлено, переключив его на балансировку нагрузки уровня 4.

Более подробную информацию можно увидеть в моем блоге — HAProxy — Mysql кластер в Docker

person Avinash Barnwal    schedule 21.09.2016
comment
У меня была точно такая же проблема, и переход с mysql-check на tcp-check действительно решает проблему. Но моя конфигурация немного отличается от вашей тем, что мой haproxy работает на том же узле, что и сервер mariadb, где также установлен клиент mysql... поэтому мне причина до сих пор не ясна. Кстати, как я проверял, если я вообще не включаю проверку, проблема тоже исчезает (хотя отключать проверку работоспособности в продакшене не очень хорошая идея). - person bruin; 20.12.2016
comment
Сделал еще тесты. Мои проблемы с использованием mysql-check заключались в том, что я не установил пустой пароль для учетной записи haproxy_check. После установки пароля mysql-check тоже работает нормально. Стоит отметить, что я также столкнулся с другой проблемой, связанной с репликацией таблицы mysql.user: когда я создаю учетную запись haproxy_check с одного узла, она не реплицируется автоматически на остальные узлы. Оказывается, для этого мне нужно использовать другой оператор SQL или, по крайней мере, убедиться, что информация об учетной записи одинакова на всех узлах. Как проверено, следующие две команды воспроизводимы: - person bruin; 20.12.2016
comment
1. создайте пользователя: CREATE USER haproxy_check@'10.0.0.%'; 2. предоставить привилегии: GRANT USAGE ON *.* TO 'haproxy_check'@'10.0.0.%', ОПРЕДЕЛЕННЫЙ '' С ОПЦИЕЙ ПРЕДОСТАВЛЕНИЯ; ПОЛНЫЕ ПРИВИЛЕГИИ; Кстати, я использую MariaDB v10.1.19 с HAProxy v1.5.14 на CentOS 7.2. - person bruin; 20.12.2016

в моем случае соединение препятствовало SELinux.

person Mawardy    schedule 26.04.2019