badoo в облаках. Решение для запуска cli-скриптов в облаке...

35
Badoo в облаках (решение для запуска cli-скриптов в облаке собственной разработки) Юрий Насретдинов, Badoo

Upload: sqalab

Post on 08-Jul-2015

455 views

Category:

Education


5 download

DESCRIPTION

Доклад Юрия Насретдинова на конференции Application Developer Days-4. г.Минск 13 декабря 2013

TRANSCRIPT

Page 1: Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разработки

Badoo в облаках(решение для запуска cli-скриптов в облаке собственной разработки)

!Юрий Насретдинов, Badoo

Page 2: Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разработки

Badoo• 199+ млн пользователей

• PHP-FPM: 40+ тыс запросов в сек

• 160 тыс регистраций в день

• 4 млн фото / видео в день

• 50 языков интерфейса

• 2 000+ серверов

Page 3: Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разработки

О чём этот доклад• Как мы запускали cron-задания до введения

«облака»

• Требования к новому «облаку»

• Существующие решения

• Общая архитектура

• Концепция «заданий»

• Распределение нагрузки

• Отказоустойчивость

Page 4: Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разработки

Cron• 1 000 различных скриптов (cron-заданий)

• Время работы — от 0,1 сек до нескольких суток

• Мало CPU-bound скриптов (в основном нужна память или сеть)

• Параллельная обработка с помощью fork()

• 2 000 000 строк кода

Page 5: Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разработки

Cron: mcron

sendSMS.php anonChat.php #1 moderation.php

config

scripts1 scripts2

facebook.php anonChat.php #2

errorlogs.php

translate.php anonChat.php #9

cleanup.php

scripts50

Page 6: Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разработки

Cron: mcron

sendSMS.php anonChat.php #1 moderation.php

config

scripts1 scripts2

facebook.php anonChat.php #2

errorlogs.php

translate.php anonChat.php #9

cleanup.php

scripts50

Page 7: Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разработки

Cron: mcron

sendSMS.php facebook.php

anonChat.php #1 moderation.php

config

scripts1 scripts3

google.php anonChat.php #2 anonChat.php #3

migration.php

translate.php errorlogs.php

anonChat.php #9 cleanup.php

scripts50

Page 8: Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разработки

Cron: недостатки• Жесткая привязка скриптов к конкретным машинам

• «Ручная» балансировка нагрузки

• Сложный мониторинг запуска заданий

• Ручной перенос скриптов в случае «падения»

• Downtime — несколько часов

Page 9: Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разработки

«Облако»

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

• Отказоустойчивость

• Понятный мониторинг

• Запуск заданий по расписанию

Page 10: Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разработки

Существующие решения:• Gearman

• SLURM

• Mesos

• ZooKeeper

• Beanstalk

• Scalr

Page 11: Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разработки

Существующие решения:

• SLURM мы больше всего исследовали

• 2 базовых алгоритма балансировки: round-robin и последовательная полная загрузка машины

• Заточен под математические расчеты, MPI

• Не учитывает нагрузку на машине?

SLURM

Page 12: Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разработки

Существующие решения:

• Создан для синхронной обработки событий

• Непрозрачный failover

• Предполагает наличие фиксированных worker’ов

• Нам придется переписывать весь наш код

Gearman

Page 13: Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разработки

Решили писать своё решение

Page 14: Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разработки

Общая архитектура

phproxyd phproxyd phproxyd phproxyd

Page 15: Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разработки

Общая архитектура

phproxyd phproxyd phproxyd phproxyd

Page 16: Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разработки

Введение в строй новой машины

• Админ: Поставить сервер в стойку

• Админ: Поставить ОС (xCAT)

• Админ: Поставить PHP и phproxyd (puppet)

• Админ: Прописать heartbeat в cron

• Программист: радоваться

Page 17: Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разработки

Добавление нового скрипта

Никакой консоли, никакого SVN, никаких mcron через SSH!

Page 18: Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разработки
Page 19: Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разработки

«Задания»• Задание — запуск скрипта (!)

• Генерируются с заданной периодичностью или добавляются через специальный API

• Должно обрабатываться строго одним потребителем

• CAP-теорема (Consistency, Availability, Partition Tolerance)

• «Поколения» заданий

Page 20: Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разработки

Распределение нагрузки• «Попугаи»

• Round-robin с весами (по машинам с наибольшим количеством свободных «попугаев»)

• Виртуальное потребление ресурсов

• Учитывается только свободные CPU и память на машине

Page 21: Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разработки

Распределение нагрузкиобновляется каждые 10 секунд

1000 300

600 250

2000 230

1000 200

2000 180

round-robin

Page 22: Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разработки

Распределение нагрузки

Page 23: Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разработки

Распределение нагрузки

• Много «облачных» машин (около 100)

• Хотим добавить все машины (около 1000)

• Если машина загружена выше 70% — новые задания на неё не попадают

• Алгоритм постоянно улучшается с учётом потребностей и полученных результатов

Page 24: Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разработки

Реализация• Java?

• Erlang?

• C?

• Go?

• PHP !

Page 25: Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разработки

Реализация: phproxyd• Демон на C, писался для других целей

• Умеет запускать PHP-скрипты

• А также следить за ними

• Пишется на Go примерно за 2 дня

• Что мы и сделали

Page 26: Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разработки

Реализация: управляющая логика

• Несколько процессов, работающих в while(true)

• Раз в 10 минут всем посылается SIGTERM

• Максимальное время простоя «облака» — 10 минут

• Генерация заданий — один процесс

• Запуск заданий — N процессов, зависит от общего числа машин в облаке

Page 27: Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разработки

Пример скрипта (до «облака»)

Page 28: Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разработки

Пример скрипта (наше время)

Page 29: Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разработки

Отказоустойчивость• «Падение» машины в облаке

• Проблемы с сетью

• Проблемы с конфигурацией машин

• «Падение» базы данных

• «Падение» мастер-узла

Page 30: Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разработки

Падение «облачной» машины

• Машина не отвечает нам по сети, но может продолжать выполнять отданные ей задания

• Решение — alarm(2), SIGALRM

• Если задание выполняется больше отведенного времени, благодаря alarm(2) мы можем быть уверены, что оно завершилось

• Максимальный простой определяется временем работы скрипта

Page 31: Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разработки

Проблемы с сетью• Heartbeat перестанет работать — мониторинг это увидит

• Жесткие таймауты на обращения к phproxyd

• PHP-скрипты «зависнут» — через 10 минут придет SIGTERM

• Нарушение связности сети: alarm(2) нас спасет

Page 32: Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разработки

Проблемы с конфигурацией

Проблемы с конфигурацией машин решает мониторинг

Page 33: Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разработки

Падение управляющей машины

Другая машина автоматически становится «мастером» (без задержки)

Page 34: Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разработки

«Падение» базы данных

• Master-slave репликация

• В случае «падения» мастера переключение происходит автоматически с помощью service ip

Page 35: Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разработки

ВопросыЮрий Насретдинов, Badoo (http://badoo.com/)

!http://habrahabr.ru/company/badoo/http://habrahabr.ru/users/yourock/

@[email protected]