# HAPRoxy for Percona or Galera

## HAPRoxy for Percona or Galera

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

![](/files/Fmcfq1KYF17OZPfqk0Tz)

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

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

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

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

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

![](/files/fKwLbBYkD3XiojSznL29)

В предыдущем материале я подробно описал какие предварительные операции я проделывал над чистой 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**

![](/files/nTbLKj3DJalDShGCBeR7)

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

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


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://book.konstantinsecurity.com/readme/architect/load-balance/haproxy/haproxy-for-percona-or-galera.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
