Перейти к основному контенту
Tech Path Finder
КурсыИнтервьюКод-ревьюБлог
Tech Path Finder

Персонализированный путеводитель в IT. Квизы, мок-интервью, код ревью и аналитика прогресса.

@potapov_me

Платформа

  • Курсы
  • Прогресс
  • Мок-интервью
  • Код ревью
  • Живое ревью с ИИ
  • Тренажёр переговоров
  • Закладки

Контент

  • Блог
  • Главная
  • Обратная связь

Компания

  • О проекте
  • Тарифы
  • Условия использования
  • Конфиденциальность
  • Согласие на обработку данных
  • Cookie
  • Реквизиты

Аккаунт

  • Войти
  • Зарегистрироваться
  • Профиль

© 2026 Tech Path Finder. Все права защищены.

·ИП Потапов К.С.·Политика конфиденциальности·
Сделано с ❤️ в России
  1. Health checks глубокий
health_checks_deep

Health checks глубокий

Кастомные HTTP/TCP проверки, agent checks, inter/fall/rise

Health checks глубокий

Кастомные HTTP/TCP проверки, agent checks, интервалы, уведомления.

#Типы health checks

#TCP health check

backend web_servers server web1 192.168.1.10:8080 check

Поведение:

  • HAProxy пытается установить TCP соединение
  • Успех = SYN → SYN-ACK получены
  • Неудача = connection refused/timeout

#HTTP health check

backend web_servers option httpchk GET /health http-check expect status 200 server web1 192.168.1.10:8080 check

Поведение:

  • HAProxy отправляет HTTP GET /health
  • Проверяет статус код 200
  • Таймаут по timeout server

#HTTP health check параметры

#Метод и URI

backend web_servers # GET запрос option httpchk GET /health # POST запрос # option httpchk POST /health # Без метода (HEAD по умолчанию) # option httpchk /health

#Заголовки в health check

backend web_servers option httpchk GET /health http-check send-verbal http-check send-hdr Host "api.example.com" http-check send-hdr User-Agent "HAProxy Health Check/1.0" http-check send-hdr Accept "application/json" server web1 192.168.1.10:8080 check

Параметры:

  • http-check send-verbal — отправлять HTTP заголовки
  • http-check send-hdr — добавить заголовок

#Body в health check

backend web_servers option httpchk POST /health http-check send-verbal http-check send-hdr Content-Type "application/json" http-check send-body '{"check": true, "service": "api"}' http-check expect status 200 server web1 192.168.1.10:8080 check

#Ожидания (expect)

#Status code

backend web_servers option httpchk GET /health # Ожидать 200 http-check expect status 200 # Ожидать 2xx # http-check expect status 2xx # Ожидать не 5xx # http-check expect ! status 5xx server web1 192.168.1.10:8080 check

#String в body

backend web_servers option httpchk GET /health http-check expect string "status: ok" server web1 192.168.1.10:8080 check

Поведение:

  • HAProxy ищет строку в body ответа
  • Нашёл = сервер здоров
  • Не нашёл = сервер нездоров

#Regex

backend web_servers option httpchk GET /health http-check expect regex "status.*ok" server web1 192.168.1.10:8080 check

#Header

backend web_servers option httpchk GET /health http-check expect hdr Content-Type -m json server web1 192.168.1.10:8080 check

Параметры:

  • hdr — проверить заголовок
  • -m json — match substring

#Multiple expect

backend web_servers option httpchk GET /health http-check expect status 200 http-check expect hdr Content-Type -m json http-check expect string "healthy" server web1 192.168.1.10:8080 check

Поведение:

  • Все условия должны выполниться (AND)
  • Одно не выполнилось = сервер нездоров

#Интервалы и пороги

#inter, fall, rise

backend web_servers server web1 192.168.1.10:8080 check inter 5s fall 3 rise 2

Параметры:

  • inter 5s — интервал между проверками (по умолчанию 2s)
  • fall 3 — количество неудач для пометки DOWN (по умолчанию 3)
  • rise 2 — количество успехов для пометки UP (по умолчанию 2)

Расчёт времени:

  • Обнаружение отказа: fall × inter = 3 × 5s = 15s
  • Восстановление: rise × inter = 2 × 5s = 10s

#fastinter

backend web_servers server web1 192.168.1.10:8080 check inter 5s fastinter 1s

Поведение:

  • fastinter 1s — интервал 1s когда сервер DOWN
  • Быстрее обнаружение восстановления
  • После rise успешных проверок — возврат к inter 5s

#downinter

backend web_servers server web1 192.168.1.10:8080 check inter 5s downinter 10s

Поведение:

  • downinter 10s — интервал когда сервер DOWN
  • Снижение нагрузки на нездоровый сервер
  • По умолчанию = inter

#Health check на отдельном порту

backend web_servers server web1 192.168.1.10:8080 check port 8081

Использование:

  • Порт 8080 для трафика
  • Порт 8081 для health checks
  • Sidecar health check сервис

#Health check с другого IP

backend web_servers server web1 192.168.1.10:8080 check addr 10.0.0.10

Использование:

  • Health checks через management network
  • Разделение трафика и мониторинга

#Agent checks

#Базовая настройка

backend web_servers server web1 192.168.1.10:8080 check agent-check agent-port 9999 server web2 192.168.1.11:8080 check agent-check agent-port 9999

Как работает:

  1. HAProxy подключается к порту 9999
  2. Агент возвращает статус: UP, DOWN, DRAIN, MAINT
  3. HAProxy обновляет статус сервера

#Формат ответа агента

UP          # Сервер здоров
DOWN        # Сервер нездоров
DRAIN       # Не принимать новые соединения
MAINT       # Maintenance mode

С весом:

UP 50       # Установить вес 50
DOWN 0      # Вес 0 = DOWN

#Пример агента (Python)

from http.server import HTTPServer, BaseHTTPRequestHandler import psutil class HealthHandler(BaseHTTPRequestHandler): def do_GET(self): # Проверка CPU и памяти cpu = psutil.cpu_percent() mem = psutil.virtual_memory().percent if cpu > 90 or mem > 90: status = "DOWN" else: status = "UP" self.send_response(200) self.end_headers() self.wfile.write(f"{status}\n".encode()) HTTPServer(('0.0.0.0', 9999), HealthHandler).serve_forever()

#Agent check с интервалом

backend web_servers server web1 192.168.1.10:8080 check \ agent-check agent-port 9999 \ agent-inter 5s

Параметр:

  • agent-inter 5s — интервал agent checks

#Комбинация checks

#HTTP + Agent

backend web_servers option httpchk GET /health http-check expect status 200 server web1 192.168.1.10:8080 check \ agent-check agent-port 9999

Поведение:

  • Оба checks должны быть успешны
  • HTTP check не прошёл = DOWN
  • Agent вернул DOWN = DOWN

#TCP + Agent

backend db_servers server db1 192.168.1.10:3306 check \ agent-check agent-port 9999

#On-marked-down

backend web_servers on-marked-down shutdown-sessions server web1 192.168.1.10:8080 check

Поведение:

  • При пометке сервера DOWN — закрыть все активные сессии
  • Полезно для баз данных (не держать мёртвые соединения)

#On-server-down

backend web_servers on-server-down deny server web1 192.168.1.10:8080 check

Поведение:

  • При DOWN всех серверов — deny новые запросы
  • Защита от отправки на dead backend

#Уведомления при изменении статуса

#Email уведомления

backend web_servers server web1 192.168.1.10:8080 check \ email-alert mailer mymailer \ email-alert-on up email-alert-on down mailer mymailer mail from haproxy@example.com smtp 127.0.0.1:25

#Webhook уведомления

backend web_servers server web1 192.168.1.10:8080 check \ http-check expect status 200 \ on-marked-down send-email alert@example.com # Или через external script # peer notify-on-change script /etc/haproxy/notify.sh

#Health check для разных методов

#GET для всех

backend web_servers option httpchk GET /health http-check expect status 200 server web1 192.168.1.10:8080 check server web2 192.168.1.11:8080 check

#Разные endpoints для разных серверов

backend web_servers server web1 192.168.1.10:8080 check \ inter 5s fall 3 rise 2 \ addr 192.168.1.10 port 8081 server web2 192.168.1.11:8080 check \ inter 10s fall 5 rise 3 \ addr 192.168.1.11 port 8082

#Full Example: Production health checks

backend api_servers # HTTP health check option httpchk GET /health http-check send-verbal http-check send-hdr Host "api.example.com" http-check send-hdr User-Agent "HAProxy Health Check/1.0" http-check expect status 200 http-check expect hdr Content-Type -m json http-check expect string "healthy" # Серверы с настройками server api1 192.168.1.10:8080 check \ inter 5s fastinter 1s downinter 10s \ fall 3 rise 2 \ agent-check agent-port 9999 agent-inter 10s server api2 192.168.1.11:8080 check \ inter 5s fastinter 1s downinter 10s \ fall 3 rise 2 \ agent-check agent-port 9999 agent-inter 10s server api3 192.168.1.12:8080 check \ inter 5s fastinter 1s downinter 10s \ fall 3 rise 2 \ backup backend db_servers # MySQL health check option mysql-check user haproxy password healthcheck server db1 192.168.1.20:3306 check \ inter 10s fall 5 rise 2 server db2 192.168.1.21:3306 check \ inter 10s fall 5 rise 2 backend redis_servers # Redis health check option tcp-check tcp-check send PING\r\n tcp-check expect string +PONG server redis1 192.168.1.30:6379 check \ inter 5s fall 3 rise 2 server redis2 192.168.1.31:6379 check \ inter 5s fall 3 rise 2

#Troubleshooting health checks

#Проверка статуса

# Статус серверов echo "show servers state" | socat /var/run/haproxy/admin.sock stdio # Детальная статистика echo "show stat" | socat /var/run/haproxy/admin.sock stdio

#Логи health checks

# Логирование health checks log-health-checks # Формат лога log-format "%ci:%cp %ft %b/%s %ST %B %{+Q}r health=%[check.status]"

#Debug health check

# Ручная проверка endpoint curl -v http://192.168.1.10:8080/health # Проверка TCP порта nc -zv 192.168.1.10 8080 # Проверка agent nc -zv 192.168.1.10 9999

#Best Practices

#Интервалы

# ✅ Хорошо (баланс между скоростью и нагрузкой) inter 5s fall 3 rise 2 # 15s до DOWN, 10s до UP # ❌ Слишком агрессивно (ложные срабатывания) # inter 1s fall 3 rise 2 # 3s до DOWN # ❌ Слишком медленно (долгое обнаружение) # inter 30s fall 3 rise 2 # 90s до DOWN

#Expect

# ✅ Хорошо (конкретные проверки) http-check expect status 200 http-check expect string "healthy" # ❌ Плохо (слишком общо) # http-check expect status 2xx # Может скрыть проблемы

#Agent checks

# ✅ Хорошо (дополнение к HTTP check) option httpchk GET /health agent-check agent-port 9999 # ❌ Плохо (только agent check) # agent-check agent-port 9999 # Нет проверки HTTP

Далее: Логирование и аудит