Четкая,
Ровная балансировка
нагрузки на
фронтенд-кластере
Юрий Насретдинов
1
О компании
2
5M загрузок фото в день
270M пользователей
70K RPS на PHP-FPM
3K серверов
400K регистраций в сутки
50 языков перевода
План
• Архитектура Badoo
• Алгоритмы балансировки
• «Ручная» балансировка
• Автоматический подбор
весов
• Выводы, open-source
3
План
• Архитектура Badoo
• Алгоритмы балансировки
• «Ручная» балансировка
• Автоматический подбор
весов
• Выводы, open-source
4
Архитектура Badoo
5
Local Traffic Manager ®™
Global Traffic Manager ®™
mobile backend
web backend
Архитектура Badoo
• GTM выбирает ДЦ
• LTM передает мобильный трафик
на nginx
• Веб-трафик балансируется через
LTM
• Nginx проксирует запросы на
мобильный кластер
6
План
• Архитектура Badoo
• Алгоритмы балансировки
• «Ручная» балансировка
• Автоматический подбор
весов
• Выводы, open-source
7
Балансировка нагрузки
• Балансировка —
распределение нагрузки по
набору серверов
• Чем равномернее
распределение, тем меньше
нужно серверов и лучше User
Experience
8
Алгоритмы балансировки
• “Dumb”
• Round-robin
• Weighted round-robin
• “Smart”
9
“Dumb”
• Simple: proxy_pass server1
• Sticky: client_ip % cnt
• Random
10
Round-robin
• Каждый следующий запрос
на следующий (живой)
сервер
• Равномерное распределение
нагрузки в случае
одинаковых запросов
11
Weighted Round-robin
• Каждый сервер имеет
свой «вес»
• Чем больше вес, тем
больший процент
запросов сервер получит
12
“Smart”
• Least Connections
• Weighted Least Connections
• Weighted RR with dynamic
weights
• Response time balancing
13
План
• Архитектура Badoo
• Алгоритмы балансировки
• «Ручная» балансировка
• Автоматический подбор
весов
• Выводы, open-source
14
Ручная балансировка
15
16
Ручная балансировка
• Подбор весов делался
админами при
добавлении новых машин
• Разброс CPU usage 20-30%
17
План
• Архитектура Badoo
• Алгоритмы балансировки
• «Ручная» балансировка
• Автоматический подбор
весов
• Выводы, open-source
18
Автоматический подбор весов
• Статический: индекс
производительности
машины
• Динамический: менять вес
со временем, в
зависимости от нагрузки
19
Индекс производительности
20
CPU usagePerformance
Статический вес
• Производительность
непостоянна
• Особенно на виртуальных
машинах
• Нужно брать макс.
производительность?
21
Динамический вес
• Постепенное «уточнение весов»
• new = old * coef
• coef = (avg cpu) / (cur cpu)
• Предполагаем линейную
зависимость %CPU от веса
• Отрицательная обратная связь
22
23
24
Проблемы
• Как не перегрузить машину?
• Что делать, если веса не
применяются?
• Как удалять машины?
• Максимальный вес для LTM
— 100, как быть?
25
Как не перегрузить машину
• Ограничение на множитель
• coef > 0.9 — не меньше -10% за раз
• coef < 1.05 — не больше +5% за раз
• weight >= 20 — вес целый, поэтому
5% должно быть не меньше 1
• Обновление веса раз в 15 минут
26
Нарушение обратной связи
• Ограничения на:

Вес на ядро (max:min=3:1)

Общий вес (max=1000)

Число ядер (max=500)
27
Как удалять машины
• Машина не отвечает на
heartbeat
• На кластере достаточно
CPU, чтобы обработать
пик трафика без этой
машины
28
План
• Архитектура Badoo
• Алгоритмы балансировки
• «Ручная» балансировка
• Автоматический подбор
весов
• Выводы, open-source
29
Выводы
• Взвешенный round-robin работает
• Статические веса плохо работают
• Динамическое выставление весов дало
разброс всего 2,5%
• Админы избавлены от задачи ручного
подбора весов
• Большая экономия за счёт масштаба
(до 50 серверов в Badoo)
30
Open-source
31
Балансировщик: https://github.com/badoo/balancer/
Остальные проекты: https://tech.badoo.com/open-source/
Вопросы
Юрий Насретдинов
y.nasretdinov@corp.badoo.com
http://habr.ru/users/yourock/
32

Как мы сделали ровную балансировку нагрузки на фронтенд-кластере / Насретдинов Юрий (Badoo)