- Home »

Настройка отказоустойчивых серверов 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 — это тот, который никогда не сработает, но если сработает — то незаметно для пользователей. Успешной настройки!
В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.
Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.