# HAPRoxy for Percona or Galera

## HAPRoxy for Percona or Galera

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

![](https://296194292-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FLoAqAoOfr7XVUQw7Gff8%2Fuploads%2Fgit-blob-315896c8d09601c7176c78ab582e4c85b4e01f05%2F687a9532176415b2444ba2046be343ab.png?alt=media)

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

**Хочу отметить, что эта инструкция родилась в процессе внедрения Zabbix в стенах компании** [**Acronis**](http://habrahabr.ru/company/acronis/)**. В процессе экспертизы и проведенных мною исследований, она доказала свое право на жизнь и благополучно служит нам верой и правдой день ото дня.**

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

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

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

![](https://296194292-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FLoAqAoOfr7XVUQw7Gff8%2Fuploads%2Fgit-blob-11caee274de078ee840771f40bca879119a5dcb2%2Fa0dc8d6dede9c986e6e9dbdd21a09bc0.png?alt=media)

В предыдущем материале я подробно описал какие предварительные операции я проделывал над чистой CentOS 6.4, мои рекомендации актуальный и тут, все пакеты будут указаны с учетом рекомендаций в [предыдущем материале](http://habrahabr.ru/post/198354/):

**Репозитории подключены, система в актуальном состоянии, переходим к установке 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**

![](https://296194292-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FLoAqAoOfr7XVUQw7Gff8%2Fuploads%2Fgit-blob-90183ac70be5a8cf4aa475368b4e11b8a22bf59b%2F228a2ad9cb1bd5da53f55365a08b1afc.png?alt=media)

[Тут можно скачать шаблон для импорта в zabbix](http://sycraft.info/share/zbx_haproxy-mysql-10222013.xml)

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