Горизонтальное масштабирование
Проектирование и разработка распределенных программных систем, лекция 6
Масштабирование
Вертикальное: добавляем железа, чтобы узел системы стал производительнее.
Горизонтальное: добавляем узлов, чтобы распределить работу между ними.
Плюсы вертикального масштабирования
Вертикальное масштабирование очень простое (нажать пару кнопок в панели управления облаком и перезагрузить узел).
Плюсы горизонтального масштабирования
Минусы горизонтального масштабирования
Плюсы и минусы
Горизонтальное масштабирование — это сложно и дорого, поэтому в первую очередь производительность повышают за счет железа и оптимизаций.
Но с какого-то этапа развития большого проекта плюсы начинают перевешивать минусы.
Логика масштабирования бэкендов
Функциональное разделение
Разделить слабо связанные между собой части в разные сервисы.
Например, можно отделить от основного сервиса:
Зачем нужно функциональное разделение
Shared Nothing
В подходе Shared Nothing каждый узел системы самодостаточен и способен самостоятельно обработать запрос пользователя. Поэтому у системы нет единой точки отказа.
Shared Nothing
Не всегда рационально полностью следовать подходу Shared Nothing. Например, можно использовать общую БД. Но всегда нужно понимать, какие есть общие ресурсы у нод одного вида.
Stateless
Stateless означает, что в памяти бэкенда не хранится никакого состояния между запросами. Бэкенд забывает о пользователе сразу же после ответа на запрос.
За счет этого последовательные запросы могут обрабатываться разными бэкендами, а сервера могут безболезненно перезапускаться.
Применимость stateless
Stateless-бэкенды хорошо подходят для веба, но могут быть неприменимы в некоторых случаях:
Архитектура
Балансировщик нагрузки (фронтенд)
Узел, который принимает все входящие запросы и распределяет их между бэкендами.
Чем равномернее распределение, тем меньше нужно бэкендов.
Балансировка нагрузки через DNS
DNS сервер — это первый узел, который принимает запрос от посетителя и возвращает IP-адрес приложения.
В настройках DNS можно указать несколько записей с разными IP-адресами.
Балансировка нагрузки через DNS
example.com IN A 216.40.104.1
example.com IN A 216.40.104.2
example.com IN A 216.40.104.3
example.com IN A 216.40.104.4
Round-robin DNS
Меняем порядок записей после каждого запроса.
Клиент обычно выбирает первый IP-адрес из списка.
GeoDNS
Можно настроить DNS-сервер, чтобы он отдавал разные IP-адреса в зависимости от местоположения пользователя. Тогда каждый пользователь сможет получать IP-адрес ближайшего к нему сервера.
Плюсы балансировки через DNS
Минусы балансировки через DNS
Балансировщики нагрузки
Алгоритмы балансировки нагрузки
Умная балансировка нагрузки
Health checks
Чтобы не перенаправлять запросы на недоступные сервера, балансировщик нагрузки должен следить за их доступностью.
Активные и пассивные хелсчеки
Active health check — балансировщик периодически отправляет запросы к бэкенду и проверяет, что он отдает корректный ответ.
Passive health check — балансировщик проверяет ответы бэкенда на запросы пользователя, и если приходит некорректный ответ, то бэкенд временно помечается как недоступный.
Кластеры балансировщиков
Чтобы балансировщик нагрузки не был единой точкой отказа, можно ставить несколько балансировщиков нагрузки в кластере.
Режимы работы кластера
active-passive: активный балансировщик обслуживает запросы, а пассивный следит за его состоянием и встает на его место в случае падения
active-active: оба балансировщика обслуживают запросы и готовы подменить друг друга, если один из них упадет
Балансировка балансировщиков
Переключение между балансировщиками происходит с помощью VRRP (Virtual Router Redundancy Protocol) / CARP (Common Address Redundancy Protocol) и плавающих IP-адресов.
Ссылки
Ссылки