Кастомные HTTP/TCP проверки, agent checks, inter/fall/rise
Кастомные HTTP/TCP проверки, agent checks, интервалы, уведомления.
backend web_servers
server web1 192.168.1.10:8080 checkПоведение:
backend web_servers
option httpchk GET /health
http-check expect status 200
server web1 192.168.1.10:8080 checkПоведение:
timeout serverbackend web_servers
# GET запрос
option httpchk GET /health
# POST запрос
# option httpchk POST /health
# Без метода (HEAD по умолчанию)
# option httpchk /healthbackend 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 — добавить заголовок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 checkbackend 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 checkbackend web_servers
option httpchk GET /health
http-check expect string "status: ok"
server web1 192.168.1.10:8080 checkПоведение:
backend web_servers
option httpchk GET /health
http-check expect regex "status.*ok"
server web1 192.168.1.10:8080 checkbackend 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 substringbackend 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Поведение:
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 = 15srise × inter = 2 × 5s = 10sbackend web_servers
server web1 192.168.1.10:8080 check inter 5s fastinter 1sПоведение:
fastinter 1s — интервал 1s когда сервер DOWNrise успешных проверок — возврат к inter 5sbackend web_servers
server web1 192.168.1.10:8080 check inter 5s downinter 10sПоведение:
downinter 10s — интервал когда сервер DOWNinterbackend web_servers
server web1 192.168.1.10:8080 check port 8081Использование:
backend web_servers
server web1 192.168.1.10:8080 check addr 10.0.0.10Использование:
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Как работает:
UP, DOWN, DRAIN, MAINTUP # Сервер здоров
DOWN # Сервер нездоров
DRAIN # Не принимать новые соединения
MAINT # Maintenance mode
С весом:
UP 50 # Установить вес 50
DOWN 0 # Вес 0 = DOWN
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()backend web_servers
server web1 192.168.1.10:8080 check \
agent-check agent-port 9999 \
agent-inter 5sПараметр:
agent-inter 5s — интервал agent checksbackend web_servers
option httpchk GET /health
http-check expect status 200
server web1 192.168.1.10:8080 check \
agent-check agent-port 9999Поведение:
backend db_servers
server db1 192.168.1.10:3306 check \
agent-check agent-port 9999backend web_servers
on-marked-down shutdown-sessions
server web1 192.168.1.10:8080 checkПоведение:
backend web_servers
on-server-down deny
server web1 192.168.1.10:8080 checkПоведение:
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:25backend 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.shbackend 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 checkbackend 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 8082backend 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# Статус серверов
echo "show servers state" | socat /var/run/haproxy/admin.sock stdio
# Детальная статистика
echo "show stat" | socat /var/run/haproxy/admin.sock stdio# Логирование health checks
log-health-checks
# Формат лога
log-format "%ci:%cp %ft %b/%s %ST %B %{+Q}r health=%[check.status]"# Ручная проверка 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# ✅ Хорошо (баланс между скоростью и нагрузкой)
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# ✅ Хорошо (конкретные проверки)
http-check expect status 200
http-check expect string "healthy"
# ❌ Плохо (слишком общо)
# http-check expect status 2xx # Может скрыть проблемы# ✅ Хорошо (дополнение к HTTP check)
option httpchk GET /health
agent-check agent-port 9999
# ❌ Плохо (только agent check)
# agent-check agent-port 9999 # Нет проверки HTTPinter/fall/rise для контроля чувствительностиfastinter для быстрого обнаружения восстановленияИзучим логирование и аудит: rsyslog, форматы, correlation ID.
Вопросы ещё не добавлены
Вопросы для этой подтемы ещё не добавлены.