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

Кластер HAProxy + Percona XtraDB

Я пытаюсь настроить HAproxy вместе с Percona XtraDB Cluster на серии из 3 экземпляров EC2. Я нашел в Интернете несколько руководств, посвященных этой конкретной проблеме, но я немного застрял.

И серверы Percona, и серверы HAproxy работают под управлением ubuntu 12.04. Версия HAProxy - 1.4.18,

Когда я запускаю HAProxy, я получаю следующую ошибку: Сервер pxc-back / db01 ВЫКЛЮЧЕН, причина: ошибка сокета, продолжительность проверки: 2 мс.

Я не совсем уверен, в чем может быть проблема. Я подтвердил следующее:

  1. Порты групп безопасности EC2 открыты
  2. Залил мои файлы конфигурации в поисках проблем. В настоящее время я их не вижу.
  3. Убедился, что xinetd установлен
  4. Убедился, что я использую правильный IP-адрес сервера mysql.

Любая помощь с этим приветствуется.

Вот моя текущая конфигурация

Балансировщик нагрузки

/etc/haproxy/haproxy.cfg

global
  log 127.0.0.1 local0
  log 127.0.0.1 local1 notice
  maxconn 4096
  user haproxy
  group haproxy
  debug
  #quiet
  daemon

defaults
  log global
  mode http
  option tcplog
  option dontlognull
  retries 3
  option redispatch
  maxconn 2000
  contimeout 5000
  clitimeout 50000
  srvtimeout 50000

frontend pxc-front
  bind 0.0.0.0:3307
  mode tcp
  default_backend pxc-back

frontend stats-front
  bind 0.0.0.0:22002
  mode http
  default_backend stats-back

backend pxc-back
  mode tcp
  balance leastconn
  option httpchk
  server db01 10.86.154.105:3306 check port 9200 inter 12000 rise 3 fall 3

backend stats-back 
  mode http
  balance roundrobin
  stats uri /haproxy/stats

MySql сервер

/etc/xinetd.d/mysqlchk

# default: on
# description: mysqlchk
service mysqlchk
{
# this is a config for xinetd, place it in /etc/xinetd.d/
        disable = no
        flags           = REUSE
        socket_type     = stream
        port            = 9200
        wait            = no
        user            = nobody
        server          = /usr/bin/clustercheck
        log_on_failure  += USERID
        #only_from       = 0.0.0.0/0
        # recommended to put the IPs that need
        # to connect exclusively (security purposes)
        per_source      = UNLIMITED
}

MySql сервер

/ etc / services

Добавлена ​​строка mysqlchk 9200 / tcp # mysqlchk

MySql сервер

/ usr / bin / clustercheck

# GNU nano 2.2.6 File: /usr/bin/clustercheck
#!/bin/bash
#
# Script to make a proxy (ie HAProxy) capable of monitoring Percona XtraDB Cluster nodes properly
#
# Author: Olaf van Zandwijk <olaf.vanzandwijk@nedap.com>
# Documentation and download: https://github.com/olafz/percona-clustercheck
#
# Based on the original script from Unai Rodriguez
#

MYSQL_USERNAME="testuser"
MYSQL_PASSWORD=""
ERR_FILE="/dev/null"
AVAILABLE_WHEN_DONOR=0

#
# Perform the query to check the wsrep_local_state
#
WSREP_STATUS=`mysql --user=${MYSQL_USERNAME} --password=${MYSQL_PASSWORD} -e "SHOW STATUS LIKE 'wsrep_local_state';" 2>${ERR_FILE} | awk '{if (NR!=1){print $2}}' 2>${ERR_FILE}`

if [[ "${WSREP_STATUS}" == "4" ]] || [[ "${WSREP_STATUS}" == "2" && ${AVAILABLE_WHEN_DONOR} == 1 ]]
then
    # Percona XtraDB Cluster node local state is 'Synced' => return HTTP 200
    /bin/echo -en "HTTP/1.1 200 OK\r\n"
    /bin/echo -en "Content-Type: text/plain\r\n"
    /bin/echo -en "\r\n"
    /bin/echo -en "Percona XtraDB Cluster Node is synced.\r\n"
    /bin/echo -en "\r\n"
else
    # Percona XtraDB Cluster node local state is not 'Synced' => return HTTP 503
    /bin/echo -en "HTTP/1.1 503 Service Unavailable\r\n"
    /bin/echo -en "Content-Type: text/plain\r\n"
    /bin/echo -en "\r\n"
    /bin/echo -en "Percona XtraDB Cluster Node is not synced.\r\n"
    /bin/echo -en "\r\n"
fi

У меня была проблема где telnet 127.0.0.1 9200 дал ответ 503 Server unavailable, но когда я выполнил /usr/bin/clustercheck как root показал, что все в порядке.

С помощью этой команды я смог выполнить clustercheck как пользователь nobody и получил настоящую ошибку MySQL в /tmp/cluster.log:

sudo -H -u nobody bash -c "/usr/bin/clustercheck clustercheckuser clustercheckpassword! 0 /tmp/cluster.log"

И /tmp/cluster.log содержит:

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysql/mysql.sock' (13)

Проблема заключалась в том каталоге, где mysql.sock был обнаружен, не имел флага выполнения (+ x) и поэтому не читался пользователем nobody и исправление было:

chmod o+x /var/run/mysql

Выполните следующие действия и опубликуйте результаты здесь.

  1. xinetd запущен.
  2. Создайте тестового пользователя mysql testuser как вы упомянули
  3. проверить прослушивание TCP-порта (9200) с помощью netstat -nlt
  4. Если вы включили iptables, разрешите порт 9200
  5. если порт открыт и находится в состоянии прослушивания, установите клиент telnet на узел percona и попробуйте выполнить telnet через telnet 127.0.0.1 9200
  6. Если xinetd работает, вы должны увидеть ответ http.
  7. если нет, выполнить /usr/bin/clustercheck

Как только вы это сделаете, опубликуйте результаты здесь.