﻿# Отказоустойчивый HAProxy

> [HTML Version](fail-safe-haproxy.html)

HAProxy — инструмент обеспечения высокой доступности и балансировки нагрузки. В архитектуре системы ELMA365 HAProxy используется для построения отказоустойчивой архитектуры при организации высокодоступного кластера ELMA365. В зависимости от выстраиваемой архитектуры выбирается необходимая конфигурация HAProxy. В статье описана установка HAProxy и keepalived для ОС Ubuntu Linux 20.04 и 22.04.

Установка состоит из шести этапов:

1. [Подготовка нод (серверов)](#prepare-nodes).

2. [Установка HAProxy](#install-haproxy).

3. [Установка keepalived](#install-keepalived).

4. [Настройка keepalived](#set-up-keepalived).

5. [Настройка базовой конфигурации HAProxy](#set-up-haproxy-configuration).

6. [Добавление конфигураций для балансировки компонентов ELMA365](#add-configurations).

## Шаг 1. Подготовка нод (серверов)

1. Создайте две ноды (сервера) с последовательно пронумерованными именами хостов:

- **haproxy-server1.your\_domain**, **192.168.1.1**;

- **haproxy-server2.your\_domain**, **192.168.1.2**.

2. Создайте сопоставления имён хостов в DNS-сервере и внесите соответствующую А-запись для виртуального IP:

````
haproxy-server.your\_domain A 192.168.1.13

````
Если такой возможности нет, внесите нужные записи в `/etc/hosts`.

3. Включите параметры ядра `net.ipv4.ip\_nonlocal\_bind`, `net.ipv4.ip\_forward`, выполнив следующие команды:

````
sudo echo net.ipv4.ip\_nonlocal\_bind=1 >> /etc/sysctl.conf  
sudo echo net.ipv4.ip\_forward=1 >> /etc/sysctl.conf  
sudo sysctl -p

## ````
Шаг 2. Установка HAProxy

1. Установите HAProxy на все узлы, выполнив команду:

````
sudo apt install haproxy -y

2. ````
Запустите сервис HAProxy на всех узлах и добавьте его в автозагрузку:

````
sudo systemctl enable --now haproxy

## ````
Шаг 3. Установка keepalived

Установите keepalived на все узлы:

````
sudo apt update  
sudo apt install keepalived

## ````
Шаг 4. Настройка keepalived

1. Создайте директорию keepalived:

````
sudo mkdir -p /usr/libexec/keepalived

2. ````
Создайте файл скрипта `haproxy\_check.sh` для отслеживания работоспособности HAProxy:

````
sudo nano /usr/libexec/keepalived/haproxy\_check.sh

3. ````
Добавьте в файл haproxy\_check.sh скрипт проверки работоспособности HAProxy:

````
\#\!/bin/bash  
/bin/kill -0 \$(cat /var/run/haproxy.pid)

4. ````
Создайте файл конфигурации keepalived на каждой ноде:

````
sudo nano /etc/keepalived/keepalived.conf

5. ````
Добавьте в файл `keepalived.conf` пример конфигураций keepalived для узла **haproxy-server1.your\_domain**:

````
global\_defs \{  
  router\_id haproxy-server1  
  enable\_script\_security  
  script\_user root  
\}  
  
vrrp\_script haproxy\_check \{  
  script "/usr/libexec/keepalived/haproxy\_check.sh"  
  interval 2  
  weight 2  
\}  
  
vrrp\_instance VI\_1 \{  
  interface eth0  
  virtual\_router\_id 101  
  priority 100  
  advert\_int 2  
  state MASTER  
  virtual\_ipaddress \{  
    192.168.1.13  
  \}  
  track\_script \{  
    haproxy\_check  
  \}  
  authentication \{  
    auth\_type PASS  
    auth\_pass SecretPassword  
  \}  
\}

6. ````
Добавьте в файл \[OBJECT\] пример конфигураций keepalived для узла **haproxy-server2.your\_domain**:

````
global\_defs \{  
  router\_id haproxy-server2  
  enable\_script\_security  
  script\_user root  
\}  
  
vrrp\_script haproxy\_check \{  
  script "/usr/libexec/keepalived/haproxy\_check.sh"  
  interval 2  
  weight 2  
\}  
  
vrrp\_instance VI\_1 \{  
  interface eth0  
  virtual\_router\_id 101  
  priority 90  
  advert\_int 2  
  state BACKUP  
  virtual\_ipaddress \{  
    192.168.1.13  
  \}  
  track\_script \{  
    haproxy\_check  
  \}  
  authentication \{  
    auth\_type PASS  
    auth\_pass SecretPassword  
  \}  
\}

````
Где введённые параметры:

- \[OBJECT\] — ID роутера, уникальное значение на каждом узле;

- \[OBJECT\] — пользователь, от имени которого будут запускаться скрипты VRRP;

- \[OBJECT\] — наименование интерфейса, к которому будет привязан keepalived;

- \[OBJECT\] — ID виртуального роутера, общее значение на всех узлах;

- \[OBJECT\] — приоритет нод внутри виртуального роутера;

- \[OBJECT\] — тип роли ноды в виртуальном роутере;

- \[OBJECT\] — виртуальный IP;

- \[OBJECT\] — тип аутентификации в виртуальном роутере;

- \[OBJECT\] — пароль.

7. Перезапустите keepalived на всех узлах:

````
sudo systemctl restart keepalived

## ````
Шаг 5. Настройка базовой конфигурации HAProxy

1. Переместите конфигурационный файл по умолчанию:

````
sudo mv /etc/haproxy/haproxy.cfg\{,.original\}

2. ````
Создайте и откройте для редактирования новый конфигурационный файл с помощью команды:

````
sudo nano /etc/haproxy/haproxy.cfg

````
Пример базовой конфигурационный HAProxy для файла haproxy.cfg

Базовая часть описывает параметры работы сервера HAProxy: режим работы, таймауты, количество подключений, включение web‑интерфейса и т.д. В примере приведена необходимая конфигурация параметров для работы сервера HAProxy. Подробнее об используемых параметрах читайте в официальной документации [HAProxy Documentation](https://docs.haproxy.org/).

````
global  
    maxconn 100000  
    log /dev/log local0  
    log /dev/log local1 notice  
    chroot /var/lib/haproxy  
    stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners  
    stats timeout 30s  
    user haproxy  
    group haproxy  
    daemon  
  
  
  
defaults  
    mode tcp  
    log global  
    retries 2  
    timeout queue 5s  
    timeout connect 5s  
    timeout client 60m  
    timeout server 60m  
    timeout check 15s  
  
  
  
listen stats  
    mode http  
    bind haproxy-server.your\_domain:7000  
    stats enable  
    stats uri /  
  
  
  
\### Web ELMA365 ###  
  
\### Web ELMA365 ###  
  
  
  
\### PostgreSQL ###  
  
\### PostgreSQL ###  
  
  
  
\### RabbitMQ ###  
  
\### RabbitMQ ###  
  
  
  
\### S3 MinIO ###  
  
\### S3 MinIO ###  
  
  
  
\### Docs Server ###  
  
\### Docs Server ###
````

3. ````
Перезапустите HAProxy:

````
sudo systemctl restart haproxy

## ````
Шаг 6. Добавление конфигураций для балансировки компонентов ELMA365

Конфигурации компонентов ELMA365 добавляются в файл \[OBJECT\] по необходимости. 

В зависимости от выстраиваемой архитектуры добавьте конфигурации:

- [HAProxy для PostgreSQL](haproxy-postgresql.md);

- [HAProxy для RabbitMQ](haproxy-rabbitmq.md);

- [HAProxy для Redis Sentinel](haproxy-redis.md);

- [HAProxy для S3 Minio](haproxy-s3-minio.md);

- [HAProxy для web ELMA365](haproxy-web-elma365.md);

- [HAProxy для сервера документов](haproxy-docs-server.md).