HAPRoxy for Percona or Galera

HAPRoxy for Percona or Galera

https://habr.com/ru/companies/acronis/articles/198448/

Очень короткая статья, про то как можно использовать HAProxy в качестве балансировщика для multi-master серверов MySQL, таких как Percona или Galera.

Хочу отметить, что эта инструкция родилась в процессе внедрения Zabbix в стенах компании Acronis. В процессе экспертизы и проведенных мною исследований, она доказала свое право на жизнь и благополучно служит нам верой и правдой день ото дня.

Для тех кто не знаком с HAProxy, цитата о предназначении продукта:

При увеличении нагрузки или посещаемости проекта, рано или поздно вертикальное маштабирование (увеличение ресурсов сервера, таких как память, скорость диска и т.д) упирается в некий предел и не дает ощутимого прироста. В таком случае в ход идет горизонтальное масштабирование — добавление новых серверов c перераспределением нагрузки между ними.

От слов к делу, установка и настройка очень просты:

В предыдущем материале я подробно описал какие предварительные операции я проделывал над чистой CentOS 6.4, мои рекомендации актуальный и тут, все пакеты будут указаны с учетом рекомендаций в предыдущем материале:

Репозитории подключены, система в актуальном состоянии, переходим к установке HAProxy:

# Ставим haproxy

yum install haproxy mariadb-client php-mysql php-cli -y

# Пишем конфиги

mv /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.old

[root@rs-haproxy ~]# nano /etc/haproxy/haproxy.cfg

global

# Если хочется увидеть отладочную информацию, то этот пункт стоит закоментировать

# А этот напротив, раскоментировать

# Мы будем использовать этот сокет для мониторинга в zabbix

# Укажите действующий адрес на сервера и порт, на котором будет слушать наш haproxy

# roundrobin — последовательно пишет во все сервера, это хорошо в режиме чтения но может вызвать проблемы если таким образом записывать в базу

# leastconn этот режим отлично подходит при использовании haproxy в качестве failover прокси, используется последний работающий сервер и только он

# httpchk заставляет haproxy проверять сервер на его готовность перед отправкая каждого из запросов

# Ниже список серверов, их порт и порт на который будет происходит подключение для проверки жизнеспособности

# Сервера с флагом backup используются только если остальные сервера не доступны

Теперь перейдем к серверам нашей percona или galera

# Настраиваем механизм проверки наших баз данных, для этого понадобиться xinetd

yum install -y xinetd

[root@xtrabackup-node-01 ~]# nano /etc/xinetd.d/mysqlchk

default: on

# порт проверки который мы указали выше

# Адреса с которых разрешена проверка состояния службы MySQL

# Очень важно добавить эту запись, иначе ничего не получиться

root@xtrabackup-node-01 ~]# nano /etc/services

mysqlchk 50005/tcp # mysqlchk

# Добавляем службу в автозагрузку и запускаем ее

chkconfig xinetd on

# Разрешаем доступ к порту проверки

iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 50005 -j ACCEPT

# Добавляем права для доступа clustercheck

GRANT PROCESS ON . TO 'clustercheckuser'@'localhost' IDENTIFIED BY 'clustercheckpassword!';

# Проверяем все ли у нас получилось, должно получится что то вроде

[root@xtrabackup-node-01 ~]# /usr/bin/clustercheck

HTTP/1.1 200 OK

# Теперь проверим работу с нашего haproxy хоста

[root@rs-haproxy ~]# telnet адрес 50005

Готово! нужно проделать эту операцию на всех нодах percona/galera

Мониторинг HAProxy для MYSQL в Zabbix

# Это основной инструмент для нашего скрипта, установим его

yum install -y socat

# Настроим sudo для zabbix, если это не было сделано раньше

usermod -s /bin/bash zabbix

# Создаем папку для наших скриптов

mkdir -p /etc/zabbix/scripts/

# Собственно сам скрипт

rm -f /etc/zabbix/scripts/haproxy.mysql nano /etc/zabbix/scripts/haproxy.mysql

if [[ -z $1 || -z $2 ]]; then
 servers=`echo "show stat" | sudo socat /var/run/haproxy stdio | sed 's/,/\ /g' | awk '{print $2}' | grep -v -e "pxname" -e '^$'`
  if [[ -n ${servers} ]]; then
    JSON="{ \"data\":["
    for DEV in ${servers}; do
      JSON=${JSON}"{ \"{#SRV}\":\"${DEV}\"},"
    done
    JSON=${JSON}"]}"
   echo ${JSON}
  fi
  exit 0
else

server="$2"
# echo $server
if [ ${1} = "qcur" ]; then
# echo $1
echo "show stat" | sudo socat /var/run/haproxy stdio | grep "MySQL,${server}"| sed 's/,/\ /g' | awk '{print $3}'
  exit 0
  fi
 if [ ${1} = "qmax" ]; then
echo "show stat" | sudo socat /var/run/haproxy stdio | grep "MySQL,${server}" | sed 's/,/\ /g' | awk '{print $4}'
  exit 0
  fi
if [ ${1} = "scur" ]; then
echo "show stat" | sudo socat /var/run/haproxy stdio | grep "MySQL,${server}" | sed 's/,/\ /g' | awk '{print $5}'
  exit 0
  fi
  if [ ${1} = "smax" ]; then
echo "show stat" | sudo socat /var/run/haproxy stdio | grep "MySQL,${server}" | sed 's/,/\ /g' | awk '{print $6}'
  exit 0
  fi
    if [ ${1} = "econ" ]; then
echo "show stat" | sudo socat /var/run/haproxy stdio | grep "MySQL,${server}" | sed 's/,/\ /g' | awk '{print $14}'
  exit 0
  fi
if [ ${1} = "qlimit" ]; then
echo "show stat" | sudo socat /var/run/haproxy stdio | grep "MySQL,${server}" | sed 's/,/\ /g' | awk '{print $26}'
  exit 0
  fi
  fi

Скрипт сам обнаруживает доступные сервера и передает их zabbix Проверим это:

[root@rs-haproxy ~]# echo «show stat» | sudo socat /var/run/haproxy stdio | sed 's/,/\ /g' | awk '{print $2}' | grep -v -e «pxname» -e '^$'

# Минимальные настроки для нашего zabbix-agent

echo Timeout=30 >> /etc/zabbix/zabbix_agentd.conf

# Применяем права на исполнение новому скрипту

chown zabbix:zabbix -R /etc/zabbix/scripts/

Передаем zabbix наши UserParameter

mkdir -p /etc/zabbix/zabbix_agentd.d/

echo 'UserParameter=haproxy.mysql[*],/etc/zabbix/scripts/haproxy.mysql "$1" "$2"' >> /etc/zabbix/zabbix_agentd.d/haproxy.mysql.conf

Теперь проверим правильно ли работает наш скрипт:

su zabbix

# Вот так работает наше автоматическое обнаружение серверов bash-4.1$ /etc/zabbix/scripts/haproxy.mysql

{ «data»:[{ "{#SRV}":«FRONTEND»},{ "{#SRV}":«10.100.100.246»},{ "{#SRV}":«BACKEND»},]}

# Спросим любые данные

bash-4.1$ /etc/zabbix/scripts/haproxy.mysql qcur FRONTEND

Похоже что все в порядке! Перезагружаем службу и любуемся логами

/etc/init.d/zabbix-agent restart && tail -f -n 100 /var/log/zabbix/zabbix_agentd.log

Вот так выглядит наш шаблон под haproxy

Тут можно скачать шаблон для импорта в zabbix

Спасибо за внимание!

Last updated