🌐 This article is in Russian. Read via Google Translate →

What is Load Balancing

Load Balancer (LB) — это сервер (или сервис), который распределяет входящие запросы между несколькими бэкенд-серверами. Зачем:

Algorithms

Пользователи
   ↓
[Cloudflare / CDN]
   ↓
[Load Balancer]   ← здесь
   ↓ ↓ ↓
[Server 1] [Server 2] [Server 3]
   ↓
[Database]

Round Robin

Round Robin

Самый простой: запрос 1 → server 1, запрос 2 → server 2, запрос 3 → server 3, запрос 4 → server 1, ...

Плюсы: простой, предсказуемый.

Минусы: не учитывает нагрузку. Если server 1 — мощный, а server 3 — слабый, нагрузка неравномерна.

Weighted Round Robin

Учитывает вес сервера: server 1 (weight=5) получает 5 запросов, server 2 (weight=3) — 3, server 3 (weight=2) — 2. Затем цикл.

Least Connections

Запрос идёт на сервер с наименьшим количеством активных соединений. Хорошо для долгих соединений (WebSocket, загрузка файлов).

Least Response Time

На сервер с минимальным временем отклика. Адаптивный — учитывает реальную скорость серверов.

IP Hash

Хеш от IP клиента определяет сервер. Один пользователь всегда попадает на один сервер. Полезно для кэша сессий.

Random

Случайный сервер. Простой, но неравномерный при малом числе запросов. Улучшение: Power of Two Choices — выбрать 2 случайных сервера, отправить на тот, у кого меньше нагрузка.

Consistent Hashing

Для распределённых кэшей (Redis, Memcached). Хеш ключа определяет ноду. Добавление/удаление ноды — перебалансирует минимум ключей.

Least Connections

L4 (Transport Layer)

Балансирует на уровне TCP/UDP. Смотрит только на IP:port, не на содержимое. Очень быстро (миллионы запросов/сек).

Примеры: HAProxy (TCP mode), AWS NLB, Linux Virtual Server (LVS), NGINX stream module.

Когда использовать: высокая производительность, не нужна маршрутизация по URL/заголовкам.

L7 (Application Layer)

Балансирует на уровне HTTP. Может смотреть на URL, заголовки, cookies, метод. Может маршрутизировать: /api/* → api-серверы, /static/* → static-серверы.

Примеры: HAProxy (HTTP mode), Nginx, AWS ALB, Envoy, Traefik, Caddy.

Когда использовать: нужна умная маршрутизация, A/B тесты, sticky sessions по cookie.

IP Hash

LB периодически проверяет, жив ли бэкенд. Если нет — исключает из пула.

GET /health HTTP/1.1
Host: server1.example.com

→ 200 OK
→ Сервер здоров, в пуле

→ Timeout / 500 Error
→ Сервер исключён, трафик не идёт

Активный (LB опрашивает) и пассивный (LB видит ошибки от клиентов).

Nginx Load Balancer

Для приложений, которые хранят сессию в памяти (а не в Redis): один пользователь всегда на одном сервере.

Методы:

Лучше всё-таки хранить сессии в Redis — stateless-архитектура проще.

HAProxy

LB расшифровывает HTTPS, бэкенды общаются с LB по HTTP (без шифрования внутри сети — если доверенная).

Плюсы:

Минус: трафик между LB и бэкендами без шифрования. В публичных сетях — небезопасно. В VPC (AWS) — обычно приемлемо.

Cloud Load Balancers

РешениеУровеньДля когоСтоимость
HAProxyL4, L7High-load вебБесплатно (open source)
NginxL7 (и L4 stream)Веб-сервер + LBБесплатно (NGINX Plus — платный)
EnvoyL7Service mesh, микросервисыБесплатно
TraefikL7Docker/KubernetesБесплатно
CaddyL7Простые сайтыБесплатно
AWS ALBL7AWSPay-as-you-go
AWS NLBL4AWS, высокая нагрузкаPay-as-you-go
CloudflareL7Глобальный LB + CDNБесплатно / платные планы
Yandex ALBL7Yandex CloudPay-as-you-go

Health Checks

global
    maxconn 50000
    log /dev/log local0

defaults
    mode http
    timeout connect 5s
    timeout client 30s
    timeout server 30s

frontend web
    bind *:80
    bind *:443 ssl crt /etc/ssl/cert.pem
    redirect scheme https if !{ ssl_fc }
    default_backend servers

backend servers
    balance roundrobin
    option httpchk GET /health
    server web1 10.0.1.10:8080 check
    server web2 10.0.1.11:8080 check
    server web3 10.0.1.12:8080 check

Conclusion

upstream backend {
    least_conn;
    server 10.0.1.10:8080 max_fails=3 fail_timeout=30s;
    server 10.0.1.11:8080 max_fails=3 fail_timeout=30s;
    server 10.0.1.12:8080 max_fails=3 fail_timeout=30s;
}

server {
    listen 80;
    location / {
        proxy_pass http://backend;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

Масштабирование

Горизонтальное (scale out)

Добавляем серверы. 1 → 10 → 100. LB автоматически распределяет нагрузку.

Главное: stateless-приложение (сессии в Redis, файлы в S3, БД отдельно).

Вертикальное (scale up)

Увеличиваем ресурсы существующего сервера (CPU, RAM, диск). До какого-то предела — потом упираемся.

Auto-scaling

Автоматическое добавление/удаление серверов по нагрузке (CPU > 70% — добавить, < 30% — убрать). AWS Auto Scaling, Kubernetes HPA, GCP Managed Instance Groups.

Blue-Green и Canary

Blue-Green Deployment

Два идентичных окружения — Blue (текущая версия) и Green (новая). LB переключает 100% трафика на Green. Если проблема — мгновенный rollback на Blue.

Canary Deployment

Новая версия получает 1-5% трафика. Мониторим ошибки. Если ОК — увеличиваем до 50%, потом до 100%. Если проблема — откат.

Идеально для zero-downtime deployments.

FAQ

Что такое Load Balancing? Load Balancer (LB) — сервер/сервис, который распределяет входящие запросы между несколькими бэкенд-серверами. Зачем: масштабирование (1 сервер не справляется — 10 серверов справляются), отказоустойчивость (если один упал, LB перекидывает трафик на другие), гибкость (добавили серверы — увеличили ёмкость), SSL-терминация (LB расшифровывает HTTPS, бэкенды работают по HTTP).

Какие алгоритмы балансировки? Round Robin — по очереди. Weighted Round Robin — с учётом весов серверов. Least Connections — на сервер с наименьшим числом активных соединений. Least Response Time — на самый быстрый сервер. IP Hash — по хешу IP клиента (для sticky sessions). Random — случайный. Consistent Hashing — для распределённых кэшей (Redis).

Чем L4 отличается от L7? L4 (Transport Layer) — балансирует на уровне TCP/UDP, смотрит только на IP:port, не на содержимое. Очень быстро (миллионы запросов/сек). Примеры: HAProxy TCP mode, AWS NLB. L7 (Application Layer) — балансирует на уровне HTTP, может смотреть на URL, заголовки, cookies, метод. Может маршрутизировать: /api/* → api-серверы, /static/* → static-серверы. Примеры: HAProxy HTTP mode, Nginx, AWS ALB.

Что такое Health Check в Load Balancer? LB периодически проверяет, жив ли бэкенд: GET /health. Если нет (timeout или 500) — исключает из пула, трафик не идёт на мёртвый сервер. Активный (LB опрашивает) и пассивный (LB видит ошибки от клиентов).

Что такое Sticky Sessions? Один пользователь всегда попадает на один сервер. Нужно для приложений, которые хранят сессию в памяти (а не в Redis). Методы: cookie-based (LB ставит cookie с server ID), IP Hash (хеш от IP, неточно из-за NAT). Лучше всё-таки хранить сессии в Redis — stateless-архитектура проще.

👉 Site Analyzer → — проверьте, есть ли CDN, WAF и балансировщик на вашем сайте.