# конспект · шаг 1 из 1
Конспект раздела: upstream
Раздел про то, что происходит, когда бэкенд не один.
Две задачи группы
БАЛАНСИРОВКА кому отдать этот запрос → метод + веса
УСТОЙЧИВОСТЬ что делать, когда упал → max_fails, next_upstream, backup, down
Выбор метода
| Вопрос | Ответ |
|---|---|
| бэкенды однородные, запросы короткие | round-robin |
| запросы разной длительности | least_conn |
| разное железо у серверов | least_time header (открыт всем с 1.31) |
| сессии в памяти бэкенда | sticky cookie (с 1.29.6 и в открытой версии) |
| кеширующий слой, важна попадаемость | hash $request_uri consistent |
| несколько балансировщиков перед общим пулом | random two least_conn |
Липкость - не отказоустойчивость. Настоящее лечение - сессии снаружи (Redis, база), тогда любой метод годится.
Что настраивают всегда
upstream app {
zone app 64k; # общие счётчики на всех воркеров
resolver 127.0.0.11 valid=5s; # если бэкенды по именам в docker
server app-1:8000 max_fails=3 fail_timeout=15s resolve;
server app-2:8000 resolve;
keepalive 32; # с 1.29.7 по умолчанию
}
location /api/ {
proxy_pass http://app;
proxy_set_header Host $host; # иначе Host: app
proxy_next_upstream error timeout; # коды добавляют осознанно, см. ловушку
}
Выкладка без простоя
пометить сервер down → nginx -s reload → обновить → вернуть в строй → reload
Что показал стенд
| опыт | результат |
|---|---|
| пять долгих запросов, следом шесть лёгких | round-robin грузит занятых, least_conn отдаёт всё свободному |
ip_hash, смена последнего октета адреса |
привязка не рвётся: считаются первые три |
| рост группы с трёх серверов до четырёх, 300 ключей | hash переносит 76%, consistent - 26% |
падение сервера при четырёх воркерах без zone |
четыре отдельных открытия падения, по одному на процесс |
http_502 в proxy_next_upstream |
бэкенд, штатно отвечающий 502, выключает всю группу |
| шесть запросов к литеральному адресу против группы | шесть соединений против одного |
| контейнер сменил адрес | без reload 502, после reload 200, с resolve - сам |
Свежее
keepalive 32в upstream включён по умолчанию с 1.29.7, но только в группе;least_timeоткрыт для всех с 1.31.0;sticky(cookie,route,learn) сdrainдоступен с 1.29.6;resolveу сервера группы работает в открытой версии с ветки 1.27 (нужныzoneиresolverвнутри группы);backupнесовместим сhash,ip_hash,random;slow_startв открытой версии по-прежнему нет.
Чек-лист: что ты должен уметь объяснить
- Почему round-robin может перегрузить один сервер при простое соседнего.
- Что увидит бэкенд в
Host, если не поставитьproxy_set_header. - Как nginx узнаёт, что сервер упал, без активных проверок.
- Чем опасен
non_idempotentвproxy_next_upstream. - Что означает
no live upstreamsи почему это не всегда «всё упало». - Зачем группе строка
zoneи что меняется без неё. - Когда nginx спрашивает DNS про имена бэкендов и что будет, если имя не резолвится.
Комментарии
Пока нет комментариев. Будь первым!
Оставить комментарий