Как мы сделали ровную балансировку нагрузки на...

32
Четкая, Ровная балансировка нагрузки на фронтенд-кластере Юрий Насретдинов 1

Upload: ontico

Post on 06-Jan-2017

1.285 views

Category:

Engineering


7 download

TRANSCRIPT

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

Четкая, Ровная балансировка нагрузки на фронтенд-кластереЮрий Насретдинов

1

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

О компании

2

5M загрузок фото в день

270M пользователей

70K RPS на PHP-FPM3K серверов

400K регистраций в сутки

50 языков перевода

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

План• Архитектура Badoo • Алгоритмы балансировки • «Ручная» балансировка • Автоматический подбор весов

• Выводы, open-source

3

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

План• Архитектура Badoo • Алгоритмы балансировки • «Ручная» балансировка • Автоматический подбор весов

• Выводы, open-source

4

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

Архитектура Badoo

5

Local Traffic Manager ®™

Global Traffic Manager ®™

mobile backend

web backend

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

Архитектура Badoo• GTM выбирает ДЦ • LTM передает мобильный трафик на nginx

• Веб-трафик балансируется через LTM

• Nginx проксирует запросы на мобильный кластер

6

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

План• Архитектура Badoo • Алгоритмы балансировки • «Ручная» балансировка • Автоматический подбор весов

• Выводы, open-source

7

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

Балансировка нагрузки• Балансировка — распределение нагрузки по набору серверов

• Чем равномернее распределение, тем меньше нужно серверов и лучше User Experience

8

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

Алгоритмы балансировки

• “Dumb” • Round-robin • Weighted round-robin • “Smart”

9

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

“Dumb”• Simple: proxy_pass server1 • Sticky: client_ip % cnt • Random

10

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

Round-robin• Каждый следующий запрос на следующий (живой) сервер

• Равномерное распределение нагрузки в случае одинаковых запросов

11

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

Weighted Round-robin• Каждый сервер имеет свой «вес»

• Чем больше вес, тем больший процент запросов сервер получит

12

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

“Smart”• Least Connections • Weighted Least Connections • Weighted RR with dynamic

weights • Response time balancing

13

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

План• Архитектура Badoo • Алгоритмы балансировки • «Ручная» балансировка • Автоматический подбор весов

• Выводы, open-source

14

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

Ручная балансировка

15

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

16

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

Ручная балансировка• Подбор весов делался админами при добавлении новых машин

• Разброс CPU usage 20-30%

17

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

План• Архитектура Badoo • Алгоритмы балансировки • «Ручная» балансировка • Автоматический подбор весов

• Выводы, open-source

18

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

Автоматический подбор весов

• Статический: индекс производительности машины

• Динамический: менять вес со временем, в зависимости от нагрузки

19

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

Индекс производительности

20

CPU usagePerformance

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

Статический вес• Производительность непостоянна

• Особенно на виртуальных машинах

• Нужно брать макс. производительность?

21

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

Динамический вес• Постепенное «уточнение весов» • new = old * coef • coef = (avg cpu) / (cur cpu) • Предполагаем линейную зависимость %CPU от веса

• Отрицательная обратная связь

22

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

23

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

24

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

Проблемы• Как не перегрузить машину? • Что делать, если веса не применяются?

• Как удалять машины? • Максимальный вес для LTM

— 100, как быть?

25

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

Как не перегрузить машину

• Ограничение на множитель • coef > 0.9 — не меньше -10% за раз • coef < 1.05 — не больше +5% за раз • weight >= 20 — вес целый, поэтому

5% должно быть не меньше 1 • Обновление веса раз в 15 минут

26

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

Нарушение обратной связи

• Ограничения на: Вес на ядро (max:min=3:1)Общий вес (max=1000)Число ядер (max=500)

27

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

Как удалять машины• Машина не отвечает на

heartbeat • На кластере достаточно

CPU, чтобы обработать пик трафика без этой машины

28

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

План• Архитектура Badoo • Алгоритмы балансировки • «Ручная» балансировка • Автоматический подбор весов

• Выводы, open-source

29

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

Выводы• Взвешенный round-robin работает • Статические веса плохо работают • Динамическое выставление весов дало разброс всего 2,5%

• Админы избавлены от задачи ручного подбора весов

• Большая экономия за счёт масштаба (до 50 серверов в Badoo)

30

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

Open-source

31

Балансировщик: https://github.com/badoo/balancer/

Остальные проекты: https://tech.badoo.com/open-source/

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

ВопросыЮрий Насретдинов [email protected] http://habr.ru/users/yourock/

32