Cookie-based sessions, source IP persistence, stick-tables
Session stickiness обеспечивает направление запросов от одного клиента на один и тот же backend сервер.
Проблема:
Запрос 1 (login) → Server 1 → Сессия создана на Server 1
Запрос 2 (profile) → Server 2 → Server 2 не знает о сессии!
Решение — stickiness:
Запрос 1 (login) → Server 1 → Сессия + cookie=SRV1
Запрос 2 (profile) → cookie=SRV1 → Server 1 → Сессия найдена
backend web_servers
balance roundrobin
cookie SERVERID insert indirect nocache
server web1 192.168.1.10:8080 check cookie web1
server web2 192.168.1.11:8080 check cookie web2
server web3 192.168.1.12:8080 check cookie web3Как работает:
Set-Cookie: SERVERID=web1SERVERID=web1 идут на web1Параметры cookie:
insert — HAProxy добавляет cookieindirect — cookie только от HAProxy к клиенту (backend не видит)nocache — добавляет Cache-Control: no-cache для кэшейbackend web_servers
cookie SERVERID insert prefix indirect nocache
server web1 192.168.1.10:8080 check cookie web1
server web2 192.168.1.11:8080 check cookie web2Поведение:
# Backend установил свою сессию:
Set-Cookie: SESSIONID=abc123
# HAProxy добавляет prefix:
Set-Cookie: SERVERIDweb1SESSIONID=abc123
Преимущество:
backend web_servers
cookie SERVERID rewrite indirect nocache
server web1 192.168.1.10:8080 check cookie web1
server web2 192.168.1.11:8080 check cookie web2Поведение:
rewrite — заменяет существующие cookiebackend web_servers
balance source
server web1 192.168.1.10:8080 check
server web2 192.168.1.11:8080 check
server web3 192.168.1.12:8080 checkКак работает:
Преимущества:
Недостатки:
Когда использовать:
backend web_servers
stick-table type ip size 100k expire 1h
# Сохраняем сервер для IP
stick on src
# Выбираем сервер по stick-table
stick store-request src
server web1 192.168.1.10:8080 check
server web2 192.168.1.11:8080 checkКак работает:
IP → web1backend web_servers
stick-table type string size 100k expire 1h store server_id
# Сохраняем сервер для cookie
stick on hdr(cookie) -m str SESSIONID
server web1 192.168.1.10:8080 check
server web2 192.168.1.11:8080 checkПараметры:
type string — ключ строка (значение cookie)store server_id — хранит ID сервераbackend web_servers
stick-table type ip size 100k expire 1h
stick on src
stick store-request src
# Если сервер DOWN, выбрать новый
stick store-request src if !SERVER_DOWN
server web1 192.168.1.10:8080 check
server web2 192.168.1.11:8080 checkbackend api_servers
balance url_param session_id
server api1 192.168.1.10:8080 check
server api2 192.168.1.11:8080 checkКак работает:
GET /api/data?session_id=abc123 → hash → web2
GET /api/data?session_id=abc123 → hash → web2
GET /api/data?session_id=xyz789 → hash → web1
Когда использовать:
backend api_servers
balance hdr(X-User-ID)
server api1 192.168.1.10:8080 check
server api2 192.168.1.11:8080 checkКак работает:
X-User-ID: 12345 → hash → web2
X-User-ID: 12345 → hash → web2
X-User-ID: 67890 → hash → web1
Когда использовать:
backend secure_servers
balance ssl_fc_session_id
server web1 192.168.1.10:8443 check ssl
server web2 192.168.1.11:8443 check sslКак работает:
Преимущества:
Недостатки:
backend web_servers
cookie SERVERID insert indirect nocache
stick-table type ip size 100k expire 2h
stick on src
stick store-request src
server web1 192.168.1.10:8080 check
server web2 192.168.1.11:8080 checkПараметры:
expire 2h — сессия действительна 2 часа# Показать stick-table
echo "show table web_servers" | socat /var/run/haproxy/admin.sock stdio
# Удалить запись
echo "clear table web_servers key ip 192.168.1.100" | socat /var/run/haproxy/admin.sock stdio
# Показать сервер для IP
echo "show table web_servers type ip key 192.168.1.100" | socat /var/run/haproxy/admin.sock stdiofrontend ws_front
bind *:80
acl is_websocket hdr(Upgrade) -i websocket
use_backend ws_servers if is_websocket
backend ws_servers
balance source
timeout tunnel 1h
server ws1 192.168.1.10:8080 check
server ws2 192.168.1.11:8080 checkВажно:
timeout tunnel 1h для долгоживущих соединенийbalance source для IP-based stickinessbackend web_servers
# Балансировка
balance roundrobin
# Cookie-based stickiness
cookie SERVERID insert indirect nocache maxlife 8h
# Stick-table для fallback
stick-table type ip size 100k expire 2h
# Сохраняем IP → сервер
stick on src
# Серверы
server web1 192.168.1.10:8080 check cookie web1 weight 10
server web2 192.168.1.11:8080 check cookie web2 weight 10
server web3 192.168.1.12:8080 check cookie web3 weight 5 backupПараметры:
maxlife 8h — максимальное время жизни cookieweight — приоритет серверовbackup — резервный серверcurl -v http://example.com/ 2>&1 | grep Set-Cookie
# Set-Cookie: SERVERID=web1echo "show table web_servers" | socat /var/run/haproxy/admin.sock stdio# Логирование выбора сервера
log-format "%ci:%cp %ft %b/%s %ST %B %{+Q}r cookie=%[res.cooki(SERVERID)]"# Хорошо (уникальное имя)
cookie SERVERID insert
# Плохо (может конфликтовать)
cookie SESSIONID insert# Баланс между стабильностью и гибкостью
cookie SERVERID insert indirect nocache maxlife 4h
stick-table type ip size 100k expire 2h# Всегда имейте fallback на случай если сервер DOWN
stick store-request src if !SERVER_DOWNИзучим HTTP rewrite и модификацию запросов/ответов.
Вопросы ещё не добавлены
Вопросы для этой подтемы ещё не добавлены.