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

Ответ

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

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

  1. Распределение запросов: Использование алгоритмов (Round Robin, Least Connections, IP Hash).
  2. Проверка здоровья (Health Checks): Регулярные опросы серверов и исключение неработающих из ротации.
  3. Обеспечение сессионной устойчивости (Sticky Sessions): Направление запросов одного пользователя на один и тот же backend-сервер.
  4. Терминирование SSL: Разгрузка backend-серверов от задач шифрования/дешифрования.

Пример конфигурации Nginx как балансировщика:

http {
    upstream backend_servers {
        # Алгоритм Least Connections
        least_conn;
        server 10.0.1.10:8080;
        server 10.0.1.11:8080;
        server 10.0.1.12:8080 backup; # Резервный сервер
    }

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

Типы балансировщиков:

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

Использование: Веб-фермы, микросервисные архитектуры, кластеры баз данных.

Ответ 18+ 🔞

Давай разжую тебе про эту штуку, которая трафик размазывает по серверам, чтобы они не сдохли, как мухи осенью. Балансировщик нагрузки — это такой хитрый дирижёр, который стоит перед твоей кучей серверов и говорит: «Эй, ты, пятый сервер, уже пыхтишь, как паровоз, отдохни, пусть запрос к десятому пойдёт».

Зачем он, этот пиздопроебибна аппарат, вообще нужен?

  1. Чтоб не положить всё одним ударом. Один сервер — это как один мужик на стройке. А десять серверов с балансировщиком — это уже бригада, которая не разбежится, если одному кирпич на ногу упадёт. Масштабируемость, ёпта.
  2. Чтоб не было пиздеца, если что-то сломается. Балансировщик тыкает сервера палкой — «Ану, дышишь?». Не дышит — выкидывает из игры, пока не починят. Это отказоустойчивость, мать его.
  3. Чтоб ресурсы не простаивали, как лохи. Не будет так, что один сервер в ахуе от запросов, а остальные в шашки играют. Балансировщик раскидает нагрузку по уму. Эффективность, блядь.

Как он, сука, работает? Допустим, у тебя три одинаковых сервера. Алгоритмы есть разные:

  • Round Robin (по кругу): По очереди, как в детском саду. Первый запрос — первому серверу, второй — второму, третий — третьему, четвёртый — опять первому. Тупо, но справедливо.
  • Least Connections (наименьшее соединений): Умнее. Смотрит, на каком сервере меньше всего народу висит, и нового юзера туда посылает. Чтоб не создавать очереди, как в сраной поликлинике.
  • IP Hash (по айпишнику): Хитро. Берёт IP-адрес клиента, через какую-то магическую функцию превращает его в число и по нему определяет сервер. Это чтобы один и тот же пользователь всегда попадал на одну и ту же машину, если ему нужно, например, корзину в магазине не терять. Сессионная устойчивость называется.

Вот, смотри, как это в Nginx выглядит, простейший вариант:

http {
    upstream backend_servers {
        # Скажем ему использовать алгоритм "наименьших соединений"
        least_conn;
        server 10.0.1.10:8080; # Первая рабочая лошадка
        server 10.0.1.11:8080; # Вторая
        server 10.0.1.12:8080 backup; # А это резервный, на подхвате. Вступит в бой, если первые две загнутся.
    }

    server {
        listen 80; # Слушаем порт 80, как все приличные веб-сервера
        location / {
            # И всё, что приходит, просто пересылаем в нашу кучку серверов 'backend_servers'
            proxy_pass http://backend_servers;
        }
    }
}

А ещё они, блядь, бывают разных уровней, как этажи в доме:

  • L4 (Четвёртый уровень, транспортный): Работает с голыми TCP/UDP пакетами. Видит только IP-адреса и номера портов. Быстрый, как удар током, но тупой. Не заглядывает внутрь запроса, не видит, что ты там просишь — картинку котика или перевод денег.
  • L7 (Седьмой уровень, прикладной): Уже умнее. Работает с HTTP/HTTPS. Может читать заголовки, cookies, сам URL. Может сказать: «Все запросы на /api/ — на эту группу серверов, а все запросы на /static/ — на вот эту другую, где картинки лежат». Мощная хуйня, но чуть медленнее.

Где эту дичь применяют? Да везде, где больше одного сервера! Большие сайты, микросервисы (это когда одно приложение разбито на кучу мелких, которые между собой болтаются), иногда даже для баз данных, чтобы читающие запросы распределять. Короче, без этого сейчас — никуда, если, конечно, не хочешь получить в один прекрасный день полный овердохуища трафика на одинокий и несчастный сервак.