🏄🏻♂️ Балансировка нагрузки. Основные принципы
Балансировка нагрузки — это распределение трафика и задач между серверами. Сначала все компоненты веб-приложения могут быть на одном сервере, но потом его мощности может не хватить. Тогда можно улучшить сервер, добавить CPU/RAM (вертикальное масштабирование) или разделить задачи на несколько серверов (горизонтальное масштабирование).
В случае горизонтального масштабирование появляется несколько серверов, которые работают над одной задачей. Когда пользователь отправляет запрос, какой именно сервер должен взять на себя задачу обработки запроса? Именно для этого и нужна балансировка нагрузки.
✅ Что даёт балансировка нагрузки
➕ Отказоустойчивость. Если один сервер откажет, балансировщик распределит трафик между остальными элементами инфраструктуры.
➕ Оптимизация использования ресурсов. Например, если у вас два сервера под базы данных, балансировщик сделает так, чтобы оба были равно нагружены.
➕ Защита от DDoS-атак. Ее обеспечивает задержка ответа, когда фоновые серверы не видят клиента до подтверждения по TCP.
Три уровня распределения нагрузки
1️⃣ Сетевой. Балансировка осуществляется по следующему принципу: нужно сделать так, чтобы за один конкретный IP-адрес сервера отвечали разные физические машины. К сетевому уровню относятся решения, которые не терминируют на себе пользовательские сессии. Они просто перенаправляют трафик и не работают в проксирующем режиме. На сетевом уровне балансировщик просто решает, на какой сервер передавать пакеты. Сессию с клиентом осуществляет сервер.
2️⃣ Транспортный (L4). Клиент обращается к балансировщику, тот перенаправляет запрос одному из серверов, который и будет его обрабатывать. Выбор сервера, на котором будет обрабатываться запрос, может осуществляться в соответствии с самыми разными алгоритмами: путём простого кругового перебора, путём выбора наименее загруженного сервера из пула и т.п.
3️⃣ Прикладной (L7). В отличие от транспортного уровня, он анализирует клиентские запросы и перенаправляет их на разные серверы в зависимости от характера запрашиваемого контента. Примером L7-балансировщика является pgpool, который распределяет запросы к PostgreSQL по их содержанию: чтение — один сервер, запись — другой.
🆚 Балансировка или проксирование?
Балансировку нагрузки часто называют проксированием. Это не совсем так.
Всякий балансировщик – прокси-сервер, но не всякое проксирование является балансировкой
Прокси – посредник между клиентом и сервером. Принимает запрос от клиента и отправляет серверу, а затем получает ответ от сервера и передаёт клиенту
Прокси имеют другое назначение и функции: служат для повышения безопасности и производительности путем кэширования часто используемого контента и скрытия идентификации и местоположения серверов от клиентов.
Алгоритмы балансировки
🔹 Round Robin: запросы распределяются по кругу между всеми доступными серверами, без учета их загрузки или других параметров. Это самый простой и равномерный метод, но он не подходит для ситуаций, когда сервера имеют разную мощность или специализацию.
🔹Weighted Round Robin: запросы распределяются по кругу между всеми доступными серверами, но с учетом их веса, который отражает их мощность или приоритет. Это позволяет отправлять больше запросов на более производительные сервера.
🔹Least Connections: запросы направляются на тот сервер, который наименее загружен в данный момент. Это позволяет избегать перегрузки одного сервера.
🔹Least Response Time: запросы направляются на тот сервер, который имеет наименьшее суммарное время ответа. Это позволяет учитывать не только загрузку сервера, но и скорость сети.
🔹Sticky Sessions: запросы одного и того же клиента будет передаваться на один и тот же сервер. Если закреплённый за конкретным адресом сервер недоступен, запрос будет перенаправлен на другой сервер.
📎 Ссылки
1. Статья от Selectel
2. Видео
3. Алгоритмы балансировки нагрузок
4. Введение в современную сетевую балансировку и проксирование
5. Как Контур балансирует нагрузку в микросервисах
6. Балансировка нагрузки в Kubernetes
#инфраструктура
Балансировка нагрузки — это распределение трафика и задач между серверами. Сначала все компоненты веб-приложения могут быть на одном сервере, но потом его мощности может не хватить. Тогда можно улучшить сервер, добавить CPU/RAM (вертикальное масштабирование) или разделить задачи на несколько серверов (горизонтальное масштабирование).
В случае горизонтального масштабирование появляется несколько серверов, которые работают над одной задачей. Когда пользователь отправляет запрос, какой именно сервер должен взять на себя задачу обработки запроса? Именно для этого и нужна балансировка нагрузки.
✅ Что даёт балансировка нагрузки
➕ Отказоустойчивость. Если один сервер откажет, балансировщик распределит трафик между остальными элементами инфраструктуры.
➕ Оптимизация использования ресурсов. Например, если у вас два сервера под базы данных, балансировщик сделает так, чтобы оба были равно нагружены.
➕ Защита от DDoS-атак. Ее обеспечивает задержка ответа, когда фоновые серверы не видят клиента до подтверждения по TCP.
Три уровня распределения нагрузки
1️⃣ Сетевой. Балансировка осуществляется по следующему принципу: нужно сделать так, чтобы за один конкретный IP-адрес сервера отвечали разные физические машины. К сетевому уровню относятся решения, которые не терминируют на себе пользовательские сессии. Они просто перенаправляют трафик и не работают в проксирующем режиме. На сетевом уровне балансировщик просто решает, на какой сервер передавать пакеты. Сессию с клиентом осуществляет сервер.
2️⃣ Транспортный (L4). Клиент обращается к балансировщику, тот перенаправляет запрос одному из серверов, который и будет его обрабатывать. Выбор сервера, на котором будет обрабатываться запрос, может осуществляться в соответствии с самыми разными алгоритмами: путём простого кругового перебора, путём выбора наименее загруженного сервера из пула и т.п.
3️⃣ Прикладной (L7). В отличие от транспортного уровня, он анализирует клиентские запросы и перенаправляет их на разные серверы в зависимости от характера запрашиваемого контента. Примером L7-балансировщика является pgpool, который распределяет запросы к PostgreSQL по их содержанию: чтение — один сервер, запись — другой.
🆚 Балансировка или проксирование?
Балансировку нагрузки часто называют проксированием. Это не совсем так.
Всякий балансировщик – прокси-сервер, но не всякое проксирование является балансировкой
Прокси – посредник между клиентом и сервером. Принимает запрос от клиента и отправляет серверу, а затем получает ответ от сервера и передаёт клиенту
Прокси имеют другое назначение и функции: служат для повышения безопасности и производительности путем кэширования часто используемого контента и скрытия идентификации и местоположения серверов от клиентов.
Алгоритмы балансировки
🔹 Round Robin: запросы распределяются по кругу между всеми доступными серверами, без учета их загрузки или других параметров. Это самый простой и равномерный метод, но он не подходит для ситуаций, когда сервера имеют разную мощность или специализацию.
🔹Weighted Round Robin: запросы распределяются по кругу между всеми доступными серверами, но с учетом их веса, который отражает их мощность или приоритет. Это позволяет отправлять больше запросов на более производительные сервера.
🔹Least Connections: запросы направляются на тот сервер, который наименее загружен в данный момент. Это позволяет избегать перегрузки одного сервера.
🔹Least Response Time: запросы направляются на тот сервер, который имеет наименьшее суммарное время ответа. Это позволяет учитывать не только загрузку сервера, но и скорость сети.
🔹Sticky Sessions: запросы одного и того же клиента будет передаваться на один и тот же сервер. Если закреплённый за конкретным адресом сервер недоступен, запрос будет перенаправлен на другой сервер.
📎 Ссылки
1. Статья от Selectel
2. Видео
3. Алгоритмы балансировки нагрузок
4. Введение в современную сетевую балансировку и проксирование
5. Как Контур балансирует нагрузку в микросервисах
6. Балансировка нагрузки в Kubernetes
#инфраструктура