Что такое балансировщик нагрузки (Load Balancer) и зачем он нужен?

Ответ

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

Основные задачи:

  1. Распределение запросов: предотвращает перегрузку отдельных серверов.
  2. Повышение доступности: перенаправляет трафик от неработающих серверов к работающим (health checks).
  3. Горизонтальное масштабирование: позволяет легко добавлять новые серверы для обработки растущей нагрузки.
Типы алгоритмов балансировки: Алгоритм Принцип работы Плюсы Минусы
Round Robin Циклическое распределение Простота Не учитывает нагрузку серверов
Least Connections На сервер с наименьшим числом активных соединений Учет текущей загрузки Сложнее, требует отслеживания состояния
IP Hash Сервер выбирается на основе хеша IP-адреса клиента Поддержка sticky-сессий Неравномерность при малом числе клиентов
Weighted Round Robin RR, но с весами (больше вес — больше запросов) Учет мощности серверов Веса задаются статически

Пример конфигурации (псевдокод Nginx):

http {
    upstream my_backend {
        # Weighted Round Robin
        server backend1.example.com weight=3;
        server backend2.example.com;
        server backend3.example.com;
        # Алгоритм Least Connections
        least_conn;
    }

    server {
        listen 80;
        location / {
            proxy_pass http://my_backend;
        }
    }
}

Где располагается?

  • Уровень 4 (Transport, L4): Балансирует на основе IP и портов (TCP/UDP). Быстрее, но "слепой" к содержимому.
  • Уровень 7 (Application, L7): Балансирует на основе данных HTTP/HTTPS (URL, заголовки, cookies). Позволяет принимать более интеллектуальные решения (маршрутизация по пути URL).

Ответ 18+ 🔞

Да ты посмотри, что эти инженеры выдумали, блядь! Чтоб им в рот чих-пых! Сидят, значит, сервера, пыхтят, а народ ломится на сайт, как на халявную водку. Один сервер уже в агонии, глаза на лоб лезут, а ему ещё запросы суют: «Прими, блядь, прими!». Так нет же, придумали балансировщик нагрузки — этакий главный по тарелкам в столовой, который смотрит, у кого очередь короче, и туда тебя и направляет, чтоб не сдох никто.

Зачем эта мартышлюшка нужна, внатуре?

  1. Размазать нагрузку. Чтобы один бедолага-сервер не охуел от работы, а остальные в шашки играли.
  2. Не дать сдохнуть. Если какой сервер взял и откинулся (health check не прошёл), балансировщик такой: «А, пошёл ты на хуй!» — и трафик гонит к живым. Отказоустойчивость, ёпта!
  3. Масштабироваться. Народу припёрло — просто подкрутил конфиг, добавил ещё пару серваков в пул, и овердохуища мощности.

А как он, сука, решает, кому дать работу? Вот тут целая наука, блядь! Смотри таблицу, а то мозги набекрень.

Алгоритм Как работает Плюсы Минусы
Round Robin (По кругу) Как в детском саду: первому серверу дал, второму, третьему, и снова первому. Проще пареной репы. А если у одного сервака уже три тонны соединений, а у другого — ни хуя? Всё равно даст! Несправедливость!
Least Connections (Меньше всех занят) Смотрит, у кого меньше всего активных клиентов висит, тому и отдаёт. Уже умнее, нагрузку учитывает. Надо за всеми следить, считать, блядь. Головная боль.
IP Hash (По айпишнику) Считает хеш от IP клиента и на его основе сервер выбирает. Один и тот же клиент всегда к одному серверу попадёт. Sticky-сессии, ёба! Клиент не будет бегать туда-сюда. Если клиентов мало, может так получиться, что один сервер в говне, а другие отдыхают.
Weighted Round Robin (По кругу, но с весом) Тот же круг, но одному серверу можно сказать: «Ты, блядь, мощный, тебе 3 запроса», а слабому — один. Учитываем разное железо! Веса задать надо заранее, сам он не догадается.

Ну и как это выглядит в жизни? Вот смотри, как в Nginx это похапать. Код не трогаю, он святой.

http {
    upstream my_backend {
        # Weighted Round Robin, ёпта!
        server backend1.example.com weight=3; # Этот здоровяк, ему больше
        server backend2.example.com; # Этот стандартный
        server backend3.example.com;
        # А можно и так: least_conn; // Тогда по наименьшей загрузке
    }

    server {
        listen 80;
        location / {
            proxy_pass http://my_backend; // И всё, пошла жара!
        }
    }
}

И где этот ублюдок стоит? А тут два лагеря, блядь:

  • Уровень 4 (L4): Работает как тупой, но быстрый курьер. Видит только откуда и куда (IP да порты). «На, получи!» — и всё. Быстро, но без изысков.
  • Уровень 7 (L7): Уже хитрая жопа. Залезает внутрь HTTP-запроса, читает заголовки, смотрит URL. Может такое вытворять: «О, запрос к /api? На серверы с апихой! А запрос к /static? На серверы с картинками!». Умный, но потяжелее будет.

Вот так вот, блядь. Без этой штуки любое более-менее серьёзное приложение — как однохуйственно стоящий столб перед толпой: рано или поздно его свалят.