Как мы учились чинить самолеты в воздухе / Евгений Коломеец (Virtuozzo)
Юрий Насретдинов, Badoo
1. Badoo в облаках
(решение для запуска cli-скриптов в облаке собственной разработки)
!
Юрий Насретдинов, Badoo
2. Badoo
• 195+ млн пользователей
• PHP-FPM: 40+ тыс запросов в сек
• 160 тыс регистраций в день
• 4 млн фото / видео в день
• 50 языков интерфейса
• 2 000+ серверов
3. О чём этот доклад
• Как мы запускали cron-задания до введения «облака»
• Требования к новому «облаку»
• Существующие решения
• Общая архитектура
• Концепция «заданий»
• Распределение нагрузки
• Отказоустойчивость
4. Cron
• 1 000 различных скриптов (cron-заданий)
• Время работы — от 0,1 сек до нескольких суток
• Мало CPU-bound скриптов (в основном нужна
память или сеть)
• Параллельная обработка с помощью fork()
• 2 000 000 строк кода
11. Существующие решения:
SLURM
• SLURM мы больше всего исследовали
• 2 базовых алгоритма балансировки: round-robin
и последовательная полная загрузка машины
• Заточен под математические расчеты, MPI
• Не учитывает нагрузку на машине?
12. Существующие решения:
Gearman
• Создан для синхронной обработки событий
• Непрозрачный failover
• Предполагает наличие фиксированных
worker’ов
• Нам придется переписывать весь наш код
16. Введение в строй новой машины
• Админ: Поставить сервер в стойку
• Админ: Поставить ОС (xCAT)
• Админ: Поставить PHP и phproxyd (puppet)
Админ: Прописать heartbeat в cron
•
• Программист: радоваться
19. «Задания»
• Задание — запуск скрипта (!)
• Генерируются с заданной периодичностью или
добавляются через специальный API
• Должно обрабатываться строго одним потребителем
• CAP-теорема (Consistency, Availability, Partition Tolerance)
• «Поколения» заданий
20. Распределение нагрузки
• «Попугаи»
• Round-robin (по машинам с наибольшим
количеством свободных «попугаев»)
• Виртуальное потребление ресурсов
Учитывается только свободные CPU и
•
память на машине
22. Распределение нагрузки
• Много «облачных» машин (около 100)
• Хотим добавить все машины (около 1000)
• Если машина загружена выше 70% —
новые задания на неё не попадают
•
Алгоритм постоянно улучшается с учётом
потребностей и полученных результатов
24. Реализация: phproxyd
• Демон на C, писался для других целей
• Умеет запускать PHP-скрипты
А также следить за ними
•
Пишется на Go примерно за 2 дня
•
• Что мы и сделали
25. Реализация: управляющая логика
• Несколько процессов, работающих в while(true)
• Раз в 10 минут всем посылается SIGTERM
• Максимальное время простоя «облака» — 10 минут
• Генерация заданий — один процесс
• Запуск заданий — N процессов, зависит от общего
числа машин в облаке
28. Отказоустойчивость
•
• Проблемы с сетью
Проблемы с конфигурацией машин
•
«Падение» базы данных
•
«Падение» мастер-узла
•
«Падение» машины в облаке
29. Падение «облачной» машины
• Машина не отвечает нам по сети, но может продолжать
выполнять отданные ей задания
• Решение — alarm(2), SIGALRM
• Если задание выполняется больше отведенного времени,
благодаря alarm(2) мы можем быть уверены, что оно
завершилось
• Максимальный простой определяется временем работы
скрипта
30. Проблемы с сетью
• Heartbeat перестанет работать — мониторинг
это увидит
• Жесткие таймауты на обращения к phproxyd
• PHP-скрипты «зависнут» — через 10 минут
придет SIGTERM
• Нарушение связности сети: alarm(2) нас спасет