HAProxy для маршрутизации TCP и UDP: балансировка MySQL, PostgreSQL, DNS и игровых серверов | Готовые конфигурации | AdminWiki
Timeweb Cloud — сервера, Kubernetes, S3, Terraform. Лучшие цены IaaS.
Попробовать

HAProxy для маршрутизации TCP и UDP: балансировка MySQL, PostgreSQL, DNS и игровых серверов | Готовые конфигурации

09 июня 2026 7 мин. чтения
Содержание статьи

HAProxy - это не только балансировщик HTTP-трафика. Он эффективно маршрутизирует TCP и UDP потоки для баз данных, DNS-серверов, игровых серверов и систем мониторинга. Правильная настройка критически важна для производительности и надежности этих сервисов. В этом руководстве вы получите готовые, проверенные конфигурации для каждого сценария с подробными комментариями к каждому параметру. Мы разберем тонкую настройку таймаутов, оптимизацию под высокую нагрузку и меры безопасности для production-среды.

Основы маршрутизации TCP и UDP в HAProxy: в чём ключевая разница?

Выбор между TCP и UDP режимами в HAProxy определяет логику работы прокси и конечную производительность сервиса. Для баз данных, где важна гарантированная доставка данных, используется TCP. Для сервисов реального времени, таких как игры или DNS, где критична минимальная задержка, выбирают UDP.

TCP: надёжность и состояние для баз данных

TCP работает по модели установленного соединения (handshake). HAProxy в режиме mode tcp выступает прозрачным прокси, передавая байты между клиентом и сервером. Для баз данных, таких как MySQL или PostgreSQL, это обеспечивает надежную доставку SQL-запросов и результатов. Ключевые параметры - таймауты соединения. Слишком короткие таймауты обрывают долгие запросы, слишком длинные приводят к накоплению "висящих" соединений и исчерпанию файловых дескрипторов.

UDP: скорость и минимальная задержка для игр и DNS

UDP работает с дейтаграммами без установки соединения. В режиме mode udp HAProxy быстро перенаправляет пакеты, минимизируя overhead. Это важно для сервисов, где задержка (latency или ping) - ключевая метрика качества. Например, для многопользовательских игр пинг в 25-35 мс до серверов в Европе считается хорошим показателем. Специализированные протоколы, такие как MTProto для Telegram, также оптимизированы под низкие задержки в UDP. Настройка таймаутов timeout client и timeout server для UDP отличается от TCP: значения обычно короче, чтобы освобождать ресурсы под новые пакеты.

Готовые конфигурации HAProxy для рабочих сервисов (с комментариями)

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

Балансировка нагрузки для кластера MySQL/PostgreSQL

# Фронтенд для приема SQL-соединений на порту 3306
frontend mysql_frontend
    bind *:3306
    mode tcp                     # Критично! Режим TCP для баз данных
    option tcplog                # Логирование в TCP-формате
    timeout client 1h            # Долгий таймаут для длительных запросов/транзакций
    default_backend mysql_backend

# Бэкенд с репликами MySQL
backend mysql_backend
    mode tcp
    balance leastconn            # Распределение на наименее нагруженную реплику
    option mysql-check user haproxy_check # Health check от имени пользователя 'haproxy_check'
    timeout connect 5s           # Время на установку соединения с бэкендом
    timeout server 1h            # Соответствует timeout client
    server mysql-1 192.168.1.10:3306 check inter 2s fall 3 rise 2
    server mysql-2 192.168.1.11:3306 check inter 2s fall 3 rise 2
    # Для PostgreSQL используйте option pgsql-check

Для выбора алгоритма балансировки в разных сценариях полезно изучить практическое сравнение Round Robin, Least Connections и других стратегий.

Маршрутизация UDP-трафика для DNS-серверов (BIND, CoreDNS)

global
    # Для UDP важен планировщик и увеличение буферов
    tune.udp.max-sockbuf 16777216

defaults
    mode udp                     # Ключевой параметр для UDP-трафика
    timeout client 30s           # Короткие таймауты для DNS-запросов
    timeout server 30s
    retries 3                    # Попытки ретрая при неудаче

frontend dns_frontend
    bind *:53
    default_backend dns_backend

backend dns_backend
    balance roundrobin           # Простой алгоритм для DNS
    # Health check через TCP-порт 53 (большинство DNS-серверов его слушают)
    option tcp-check
    server dns-1 192.168.1.20:53 check port 53 inter 3s fall 2 rise 1
    server dns-2 192.168.1.21:53 check port 53 inter 3s fall 2 rise 1

Высокопроизводительный шлюз для игровых серверов (на примере UDP)

frontend game_frontend
    bind *:27015                # Пример для игрового сервера
    mode udp
    timeout client 30s          # Агрессивные таймауты для минимизации удержания ресурсов
    timeout server 30s
    default_backend game_backend

backend game_backend
    mode udp
    balance leastconn           # Пытается равномерно распределить игроков по серверам
    option socket-stats         # Сбор статистики по сокетам
    # Health check может быть сложным для игровых серверов, иногда используют внешние скрипты
    server game-1 192.168.1.30:27015 check inter 5s fall 2 rise 1
    server game-2 192.168.1.31:27015 check inter 5s fall 2 rise 1

Для комплексной настройки кластера игровых серверов, включая методы геомаршрутизации, обратитесь к пошаговому руководству по отказоустойчивому кластеру Counter-Strike 2.

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

frontend monitoring_frontend
    bind *:9090                # Пример для Prometheus или подобного API
    mode http                  # Для HTTP/HTTPS API возвращаемся к http режиму
    option http-keep-alive
    timeout client 60s
    default_backend monitoring_backend

backend monitoring_backend
    mode http
    balance roundrobin
    option httpchk GET /api/v1/status # Специфичный health check для API
    http-check expect status 200
    server monitor-1 192.168.1.40:9090 check inter 10s
    server monitor-2 192.168.1.41:9090 check inter 10s
    # Бэкендом могут быть микросервисы на FastAPI, где Pydantic обеспечивает валидацию данных

При выборе между HAProxy, Nginx и Keepalived для подобных задач поможет практическое сравнение решений для распределения трафика.

Тонкая настройка HAProxy: таймауты, keepalive и оптимизация под высокую нагрузку

Готовая конфигурация - это половина дела. Точная настройка параметров предотвращает зависания, утечки памяти и деградацию производительности под нагрузкой.

Таймауты (timeout): как предотвратить зависание соединений

  • timeout connect: определяет максимальное время для установки TCP-соединения с бэкенд-сервером. Значение 3-5 секунд обычно достаточно. Слишком малое значение приведет к отказу при замедленном ответе бэкенда, слишком большое - к задержкам при его недоступности.
  • timeout client: время бездействия со стороны клиента. Для игровых UDP-серверов устанавливайте 30-60 секунд, для баз данных - часы (например, 1h).
  • timeout server: время бездействия со стороны сервера. Должно быть согласовано с timeout client.

Неправильные таймауты - частая причина "висящих" соединений, которые исчерпывают лимиты файловых дескрипторов.

Оптимизация keepalive-соединений для производительности

Для HTTP-режима директива option http-keep-alive позволяет переиспользовать одно TCP-соединение для нескольких HTTP-запросов. Это снижает нагрузку на CPU за счет сокращения операций установки соединения (TCP handshake) и уменьшает задержку. Параметр timeout http-keep-alive задает время жизни неактивного keepalive-соединения. В TCP-режиме keepalive эмулируется длинными таймаутами клиента и сервера.

Конфигурация для высоких нагрузок и минимизации задержки

global
    maxconn 100000               # Максимальное количество одновременных соединений
    nbthread 4                   # Количество потоков (вместо устаревшего nbproc)
    tune.bufsize 32768           # Увеличение буфера для больших пакетов
    # Для UDP критично:
    tune.udp.max-sockbuf 16777216

defaults
    timeout connect 3s
    timeout client 30s           # Коротко для игр/VoIP
    timeout server 30s
    retries 2

Также настройте системные лимиты Linux: увеличьте net.core.somaxconn и лимиты файловых дескрипторов (ulimit -n). Стабильность и низкая задержка - приоритет для игровых и VoIP-сервисов.

Обеспечение надёжности и безопасности в production-среде

Конфигурация HAProxy должна быть не только рабочей, но и безопасной, отказоустойчивой.

Health Checks и отказоустойчивость

Проверки работоспособности (check) автоматически исключают неисправные бэкенды из балансировки. Параметры inter (интервал проверки), fall (число неудач для перевода в DOWN) и rise (число успехов для возврата в UP) требуют калибровки. Для баз данных используйте специализированные проверки (option mysql-check). Для HTTP-сервисов - option httpchk с ожиданием определенного статуса.

Базовые ACL для контроля трафика

frontend restricted_frontend
    bind *:3306
    mode tcp
    # Разрешаем доступ только из внутренней сети администраторов
    acl admin_network src 10.0.0.0/24
    tcp-request connection reject if !admin_network
    default_backend mysql_backend

Это простая, но эффективная мера, которую часто упускают.

Безопасность ОС и права доступа к конфигурации

Неправильные права доступа к конфигурационному файлу haproxy.cfg - распространенная ошибка. Установите права chmod 640 и владельца root:haproxy. Применение chmod 777 не решает проблему "Permission denied", если включены SELinux или AppArmor. Вместо этого проверьте контексты SELinux (ls -Z /etc/haproxy/haproxy.cfg) и при необходимости установите правильный контекст (chcon -t haproxy_config_t /etc/haproxy/haproxy.cfg). Это напрямую влияет на надежность запуска HAProxy.

Практическое применение: от тестирования до интеграции с Kubernetes

Как проверить и отладить конфигурацию перед запуском

Никогда не запускайте сырую конфигурацию в продакшен. Используйте команду валидации:

haproxy -c -f /etc/haproxy/haproxy.cfg

Она выявит синтаксические ошибки. После запуска проверяйте логи: journalctl -u haproxy. Тестируйте функциональность с помощью curl (для HTTP), nc (netcat) для TCP/UDP или специализированных утилит вроде dig для DNS. Для быстрой настройки веб-серверов можно использовать готовые конфигурации Nginx в качестве бэкендов для тестов.

HAProxy в экосистеме Kubernetes: краткий обзор

Понимание базовой конфигурации HAProxy - фундамент для работы в Kubernetes. HAProxy может развертываться как внешний LoadBalancer для сервисов типа LoadBalancer или как основа для Ingress-контроллера (HAProxy Ingress Controller). В этом случае он управляет внешним трафиком, направляя его к подам внутри кластера. Принципы балансировки, настройки health check (через readiness probes) и безопасности остаются актуальными. Для проектирования масштабируемых API в таких средах полезны стратегии из руководства по сравнению REST, GraphQL и gRPC.

Интеграция HAProxy с современным стеком технологий, включая микросервисы на FastAPI или балансировку трафика к AI-сервисам, требует надежной инфраструктуры. Для работы с нейросетями через единый API, например, можно рассмотреть использование агрегатора, такого как AiTunnel, который предоставляет доступ к множеству моделей через один интерфейс и упрощает управление.

Поделиться:
Сохранить гайд? В закладки браузера