Балансировка нагрузки по слоям: L4, L7 и метрики, которые её проверяют
TL;DR
Балансировка нагрузки — это и политика, и реализация распределения единиц работы по здоровым бэкендам так, чтобы пул воспринимался как один ресурс — с явной платой за «слепую справедливость», локальность состояния и точность приложимых решений. Эскиз заставляет проговорить допущения об алгоритме.
Справочная ось: Load balancing (computing) в Википедии (EN).
Определение
Разделите где режется поток:
- на уровне 4 — по метаданным соединения (IP:порт) с малой информацией о полезной нагрузке;
- на уровне 7 — при знании прикладного протокола: маршрутизация HTTP, weighted‑доли, sticky‑куки.
Цикл похож: классификация → выбор → проверки здоровья → синхронизация с локальностью.
Зачем это нужно
Неверное ожидание проявится в «ломаных» метриках:
- растёт хвост p99, а процессоры «ничего не делают» — давление до разбора сообщения;
- ошибки кучкуются на одном репликанте при простом round‑robin;
- несимметричная утилизация намекает на горячее партиционирование или ошибочные веса.
Ясность про балансировщик снижает шум во время постмортемов.
Алгоритмы и паттерны
| Слой | Вариант расписания | Сильная сторона | Риск |
|---|---|---|---|
| L4 | хэширование по 5‑кортежу | ощущение stateless | перекос из‑за больших масс NAT |
| L4 | least‑connection | длинные сессии | нужно честное знание открытых соединений |
| L7 | weighted round‑robin | контроль долей | ошибки синхронизации весов при выкладках |
| L7 | липкость (affinity) | локальный контекст | горячие точки при отказах |
| L7 | агрессивный health + panic‑порог | отсекание «ядовитых» | слишком частые выпадения → thundering herd |
Тонкость гранулярности health‑чека (TCP open vs синтетический GET) — часть описания алгоритма.
Контекст HTTP
Посредники согласуются по семантике методов и кэширующим намёкам по RFC 9110; полная математика кэша в симуляторе может не кодироваться, но рассказ о слоях остаётся терминологически совместимым со стандартами.
Компромиссы
Справедливость ≠ минимальный хвост:
- случайизация улучшает распределение, но бьёт по локальности prefetch;
- липкость снижает шум для session‑store, но концентрирует домен отказа;
- дребезг health связывается с мультипликацией ретраев ниже по цепочке — рисуйте оба конца эффекта.
Практичные контуры часто: DNS или anycast → региональный L7 → подмножества с локальностью данных.
Как смоделировать в ArchiPanopticon
- Свяжите один прокси/шлюз минимум с двумя зеркальными сервисами.
- Базовый прогон при симметричных мощностях — сохраните медиану и хвост.
- Ослабьте один узел параметрами (дороже обработка, рост ошибок) — наблюдайте изоляцию.
- Сравните сценарий одной привязки upstream против разнесённой топологии.
- Завершите узлами метрик/трасс — голосование фактами палитры, а не уверенность «ведь round‑robin».
Меняйте за прогон один рычаг — сохранять причинно‑следственную честность.
FAQ
Round‑robin всегда плох?
Только когда длины сессий или мощности сильно отличаются — сначала опишите характер трафика.
Моделируем TLS?
Если узкое место не в установлении сеансов, пометьте упрощение явно интервьюеру.
Как показать sticky на холсте?
Косвенно — через session‑store или неравномерный поток к одному репликанту при сохранении смысла.
anycast против весового DNS?
Обычно обсуждение failover; достаточно верхнеуровнего ответа, если BGP не входит в уточняющую часть интервью.
Автоскейл заменит политики баланса?
Эластичность лечит смещённые долгие тренды; краткий шип давления сначала вскрывает дыры именно в балансе.
Читать дальше
- Wikipedia (EN): таксономия алгоритмов для быстрого сравнения семейств.
- RFC 9110 — как посредники сосуществуют с глаголами и свежестью ответов.
- Публикации NIST по отказоустойчивости — язык порогов health‑чеков и целей доступности.