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 и
память на машине
23. Распределение нагрузки
•
Много «облачных» машин (около 100)
•
Хотим добавить все машины (около 1000)
•
Если машина загружена выше 70% —
новые задания на неё не попадают
•
Алгоритм постоянно улучшается с учётом
потребностей и полученных результатов
25. Реализация: phproxyd
•
Демон на C, писался для других
целей
•
Умеет запускать PHP-скрипты
•
А также следить за ними
•
Пишется на Go примерно за 2 дня
•
Что мы и сделали
26. Реализация: управляющая логика
•
Несколько процессов, работающих в
while(true)
•
Раз в 10 минут всем посылается SIGTERM
•
Максимальное время простоя «облака» — 10
минут
•
Генерация заданий — один процесс
•
Запуск заданий — N процессов, зависит от
общего числа машин в облаке
30. Падение «облачной» машины
•
Машина не отвечает нам по сети, но может
продолжать выполнять отданные ей задания
•
Решение — alarm(2), SIGALRM
•
Если задание выполняется больше
отведенного времени, благодаря alarm(2) мы
можем быть уверены, что оно завершилось
•
Максимальный простой определяется
временем работы скрипта
31. Проблемы с сетью
•
Heartbeat перестанет работать —
мониторинг это увидит
•
Жесткие таймауты на обращения к
phproxyd
•
PHP-скрипты «зависнут» — через 10
минут придет SIGTERM
•
Нарушение связности сети: alarm(2) нас
спасет