Home » Настройка отказоустойчивых серверов HAProxy с Keepalived и резервированными IP на Ubuntu 24
Настройка отказоустойчивых серверов HAProxy с Keepalived и резервированными IP на Ubuntu 24

Настройка отказоустойчивых серверов HAProxy с Keepalived и резервированными IP на Ubuntu 24

Давайте будем честными: поднимать продакшн-инфраструктуру без отказоустойчивости в 2024 году — это как кататься на мотоцикле без шлема. Технически можно, но зачем так рисковать? Сегодня разберём, как правильно настроить связку HAProxy + Keepalived на Ubuntu 24 для создания высокодоступного балансировщика нагрузки с автоматическим переключением на резервный сервер. Эта конфигурация поможет вам избежать простоев, когда основной сервер решит внезапно “отдохнуть”, а ваши пользователи получат seamless experience даже в критических ситуациях.

Как это работает: архитектура решения

Представьте себе двух охранников, которые дежурят у входа в здание. Один активно работает (Master), второй стоит рядом и готов в любой момент заменить коллегу (Backup). Примерно так работает наша связка HAProxy + Keepalived:

  • HAProxy — это наш load balancer, который принимает входящие запросы и распределяет их между серверами бэкенда
  • Keepalived — демон, который следит за состоянием сервисов и управляет виртуальным IP-адресом (VIP)
  • VRRP протокол — механизм, который позволяет серверам “договариваться” о том, кто сейчас главный

Схема работы выглядит так:


Internet → VIP (Virtual IP) → Master HAProxy → Backend Servers
                           ↓ (failover)
                           Backup HAProxy → Backend Servers

Когда Master-сервер падает, Backup автоматически перехватывает VIP и начинает обслуживать трафик. Переключение происходит за считанные секунды, и клиенты даже не замечают проблемы.

Подготовка инфраструктуры

Для нашей схемы понадобятся минимум два сервера. Если у вас их ещё нет, можно взять VPS серверы или выделенные серверы — главное, чтобы они были в одной сети и поддерживали настройку дополнительных IP.

Примерная конфигурация:

Сервер IP-адрес Роль
lb-master 10.0.0.10 Master HAProxy + Keepalived
lb-backup 10.0.0.11 Backup HAProxy + Keepalived
VIP 10.0.0.100 Виртуальный IP

Пошаговая настройка: от нуля до героя

Шаг 1: Установка пакетов

Начнём с установки необходимого софта на оба сервера:


sudo apt update
sudo apt install haproxy keepalived -y

# Включаем автозапуск
sudo systemctl enable haproxy
sudo systemctl enable keepalived

Шаг 2: Настройка HAProxy

Создаём конфигурацию HAProxy. Файл одинаковый для обоих серверов:


sudo nano /etc/haproxy/haproxy.cfg

Базовая конфигурация:


global
    log 127.0.0.1:514 local0
    chroot /var/lib/haproxy
    stats socket /run/haproxy/admin.sock mode 660 level admin
    stats timeout 30s
    user haproxy
    group haproxy
    daemon

defaults
    mode http
    log global
    option httplog
    option dontlognull
    option redispatch
    retries 3
    timeout connect 5000
    timeout client 50000
    timeout server 50000
    errorfile 400 /etc/haproxy/errors/400.http
    errorfile 403 /etc/haproxy/errors/403.http
    errorfile 408 /etc/haproxy/errors/408.http
    errorfile 500 /etc/haproxy/errors/500.http
    errorfile 502 /etc/haproxy/errors/502.http
    errorfile 503 /etc/haproxy/errors/503.http
    errorfile 504 /etc/haproxy/errors/504.http

# Веб-интерфейс статистики
listen stats
    bind *:8404
    stats enable
    stats uri /stats
    stats refresh 30s
    stats admin if TRUE

# Основной фронтенд
frontend web_frontend
    bind *:80
    bind *:443
    default_backend web_servers

# Пул бэкенд-серверов
backend web_servers
    balance roundrobin
    option httpchk GET /health
    server web1 10.0.0.20:80 check
    server web2 10.0.0.21:80 check
    server web3 10.0.0.22:80 check backup

Шаг 3: Настройка Keepalived на Master-сервере


sudo nano /etc/keepalived/keepalived.conf

Конфигурация для Master:


vrrp_script chk_haproxy {
    script "/usr/bin/killall -0 haproxy"
    interval 2
    weight 2
    fall 3
    rise 2
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 101
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass your_secret_password
    }
    virtual_ipaddress {
        10.0.0.100
    }
    track_script {
        chk_haproxy
    }
    notify_master "/etc/keepalived/notify_master.sh"
    notify_backup "/etc/keepalived/notify_backup.sh"
    notify_fault "/etc/keepalived/notify_fault.sh"
}

Шаг 4: Настройка Keepalived на Backup-сервере

Аналогичный конфиг, но с изменёнными параметрами:


vrrp_script chk_haproxy {
    script "/usr/bin/killall -0 haproxy"
    interval 2
    weight 2
    fall 3
    rise 2
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass your_secret_password
    }
    virtual_ipaddress {
        10.0.0.100
    }
    track_script {
        chk_haproxy
    }
    notify_master "/etc/keepalived/notify_master.sh"
    notify_backup "/etc/keepalived/notify_backup.sh"
    notify_fault "/etc/keepalived/notify_fault.sh"
}

Шаг 5: Создание скриптов уведомлений

Создаём полезные скрипты для отслеживания состояния:


sudo nano /etc/keepalived/notify_master.sh

#!/bin/bash
echo "$(date): Becoming MASTER" >> /var/log/keepalived.log
systemctl restart haproxy

sudo nano /etc/keepalived/notify_backup.sh

#!/bin/bash
echo "$(date): Becoming BACKUP" >> /var/log/keepalived.log

sudo nano /etc/keepalived/notify_fault.sh

#!/bin/bash
echo "$(date): FAULT detected" >> /var/log/keepalived.log

Делаем скрипты исполняемыми:


sudo chmod +x /etc/keepalived/notify_*.sh

Шаг 6: Запуск сервисов

Запускаем всё на обоих серверах:


sudo systemctl start haproxy
sudo systemctl start keepalived

# Проверяем статус
sudo systemctl status haproxy
sudo systemctl status keepalived

Тестирование и диагностика

Проверим, работает ли наша конфигурация:


# Проверяем, на каком сервере находится VIP
ip addr show

# Смотрим логи keepalived
sudo tail -f /var/log/syslog | grep keepalived

# Проверяем статистику HAProxy
curl http://10.0.0.100:8404/stats

Для тестирования failover выключаем HAProxy на Master:


sudo systemctl stop haproxy

VIP должен автоматически перейти на Backup-сервер. Проверим:


# На backup-сервере должен появиться VIP
ip addr show

Продвинутые настройки и оптимизация

Мониторинг и алерты

Создадим простой скрипт для мониторинга:


sudo nano /usr/local/bin/check_cluster.sh

#!/bin/bash
VIP="10.0.0.100"
TELEGRAM_TOKEN="your_bot_token"
CHAT_ID="your_chat_id"

if ! curl -s --max-time 5 http://$VIP > /dev/null; then
    message="🚨 HAProxy cluster is DOWN!"
    curl -s -X POST "https://api.telegram.org/bot$TELEGRAM_TOKEN/sendMessage" \
         -d chat_id=$CHAT_ID \
         -d text="$message"
fi

Добавляем в cron для проверки каждую минуту:


sudo crontab -e
# Добавляем строку:
* * * * * /usr/local/bin/check_cluster.sh

Настройка логирования

Для централизованного логирования HAProxy настроим rsyslog:


sudo nano /etc/rsyslog.d/49-haproxy.conf

# Включаем UDP-порт для HAProxy
$ModLoad imudp
$UDPServerRun 514
$UDPServerAddress 127.0.0.1

# Направляем логи HAProxy в отдельный файл
local0.*    /var/log/haproxy.log
& stop

Перезапускаем rsyslog:


sudo systemctl restart rsyslog

Сравнение с альтернативными решениями

Решение Сложность настройки Производительность Возможности Стоимость
HAProxy + Keepalived Средняя Очень высокая Широкие Бесплатно
NGINX + Keepalived Средняя Высокая Средние Бесплатно
AWS ALB Простая Высокая Широкие Дорого
Cloudflare Load Balancer Очень простая Средняя Ограниченные Средняя

Интересные фишки и лайфхаки

Автоматическое добавление серверов

Можно настроить автоматическое обнаружение новых серверов через DNS:


# В HAProxy конфиге
server-template web 10 app.example.com:80 check resolvers mydns

Интеграция с Let’s Encrypt

Для автоматического обновления SSL-сертификатов:


sudo nano /etc/haproxy/renewal-hook.sh

#!/bin/bash
# Объединяем сертификаты для HAProxy
cat /etc/letsencrypt/live/example.com/fullchain.pem \
    /etc/letsencrypt/live/example.com/privkey.pem \
    > /etc/haproxy/certs/example.com.pem

# Перезагружаем HAProxy
sudo systemctl reload haproxy

Мониторинг с Prometheus

Добавляем экспорт метрик для Prometheus:


# В HAProxy конфиге
frontend prometheus
    bind *:8405
    http-request use-service prometheus-exporter if { path /metrics }
    no log

Частые проблемы и их решения

Проблема: Split-brain

Когда оба сервера думают, что они Master:


# Решение: более строгие проверки
vrrp_script chk_haproxy {
    script "/usr/bin/curl -f http://localhost:8404/stats || exit 1"
    interval 2
    fall 3
    rise 2
}

Проблема: Медленное переключение

Уменьшаем тайм-ауты:


vrrp_instance VI_1 {
    # ...
    advert_int 1
    preempt_delay 5
    # ...
}

Проблема: Проблемы с ARP

Принудительное обновление ARP-таблиц:


# В notify_master.sh
arping -c 3 -I eth0 10.0.0.100

Безопасность и best practices

  • Используйте сильные пароли для VRRP аутентификации
  • Настройте firewall для ограничения доступа к служебным портам
  • Регулярно обновляйте пакеты безопасности
  • Мониторьте логи на предмет подозрительной активности
  • Используйте отдельную VLAN для служебного трафика

# Базовые правила UFW
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow from 10.0.0.0/24 to any port 8404
sudo ufw --force enable

Интеграция с системами автоматизации

Конфигурацию можно автоматизировать с помощью Ansible. Создадим простой playbook:


---
- name: Deploy HAProxy + Keepalived cluster
  hosts: loadbalancers
  become: yes
  vars:
    vip_address: "10.0.0.100"
    master_priority: 101
    backup_priority: 100
    
  tasks:
    - name: Install packages
      apt:
        name:
          - haproxy
          - keepalived
        state: present
        update_cache: yes

    - name: Configure HAProxy
      template:
        src: haproxy.cfg.j2
        dest: /etc/haproxy/haproxy.cfg
      notify: restart haproxy

    - name: Configure Keepalived
      template:
        src: keepalived.conf.j2
        dest: /etc/keepalived/keepalived.conf
      notify: restart keepalived

Производительность и масштабирование

Для высоконагруженных проектов стоит обратить внимание на:

  • Настройка ядра для максимальной производительности
  • Использование nbproc для многопроцессорных систем
  • Тонкая настройка таймаутов под конкретные задачи
  • Кэширование на уровне HAProxy

# Оптимизация sysctl
sudo nano /etc/sysctl.d/99-haproxy.conf

# Увеличиваем лимиты соединений
net.core.somaxconn = 4096
net.ipv4.tcp_max_syn_backlog = 4096
net.netfilter.nf_conntrack_max = 131072

# Оптимизация TCP
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_tw_reuse = 1

Вывод и рекомендации

Связка HAProxy + Keepalived — это проверенное временем решение для создания отказоустойчивых балансировщиков нагрузки. В отличие от облачных решений, здесь вы получаете полный контроль над конфигурацией и не зависите от внешних сервисов.

Когда использовать:

  • Для критически важных приложений, где недопустимы простои
  • При необходимости точной настройки балансировки
  • Для проектов с предсказуемой нагрузкой
  • Когда бюджет ограничен, а требования высоки

Когда НЕ использовать:

  • Для простых статических сайтов
  • При недостатке экспертизы в команде
  • Если есть возможность использовать managed-решения

Настроенная правильно связка может обслуживать сотни тысяч соединений в секунду и обеспечивать availability на уровне 99.9%+. Главное — не забывать про мониторинг, регулярные бэкапы конфигураций и тестирование сценариев отказа.

Помните: лучший failover — это тот, который никогда не сработает, но если сработает — то незаметно для пользователей. Успешной настройки!


В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.

Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.

Leave a reply

Your email address will not be published. Required fields are marked