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

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

Upload: ontico

Post on 17-Dec-2014

488 views

Category:

Documents


2 download

DESCRIPTION

HighLoad++ 2013

TRANSCRIPT

Page 1: Юрий Насретдинов, Badoo

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

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

Page 2: Юрий Насретдинов, Badoo

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

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

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

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

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

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

Page 3: Юрий Насретдинов, Badoo

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

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

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

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

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

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

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

Page 4: Юрий Насретдинов, Badoo

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

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

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

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

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

Page 5: Юрий Насретдинов, Badoo

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

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

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

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

машинам

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

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

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

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

Page 9: Юрий Насретдинов, Badoo

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

по серверам

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

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

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

Page 10: Юрий Насретдинов, Badoo

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

• SLURM

• Mesos

• ZooKeeper

• Beanstalk

• Scalr

Page 11: Юрий Насретдинов, Badoo

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

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

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

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

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

SLURM

Page 12: Юрий Насретдинов, Badoo

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

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

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

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

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

Gearman

Page 13: Юрий Насретдинов, Badoo

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

Page 14: Юрий Насретдинов, Badoo

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

phproxyd phproxyd phproxyd phproxyd

Page 15: Юрий Насретдинов, Badoo

Heartbeat

каждые 10 секунд

phproxyd phproxyd phproxyd phproxyd

Page 16: Юрий Насретдинов, Badoo

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

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

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

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

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

Page 17: Юрий Насретдинов, Badoo

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

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

Page 18: Юрий Насретдинов, Badoo
Page 19: Юрий Насретдинов, Badoo

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

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

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

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

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

Page 20: Юрий Насретдинов, Badoo

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

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

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

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

Page 21: Юрий Насретдинов, Badoo

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

1000 300

600 250

2000 230

1000 200

2000 180

round-robin

обновляется каждые 10 секунд

Page 22: Юрий Насретдинов, Badoo

Распределение нагрузки• Много «облачных» машин (около 100)

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

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

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

Page 23: Юрий Насретдинов, Badoo

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

• Erlang?

• C?

• Go?

• PHP !

Page 24: Юрий Насретдинов, Badoo

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

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

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

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

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

Page 25: Юрий Насретдинов, Badoo

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

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

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

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

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

Page 26: Юрий Насретдинов, Badoo

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

Page 27: Юрий Насретдинов, Badoo

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

Page 28: Юрий Насретдинов, Badoo

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

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

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

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

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

Page 29: Юрий Насретдинов, Badoo

Падение «облачной» машины• Машина не отвечает нам по сети, но может продолжать

выполнять отданные ей задания

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

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

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

Page 30: Юрий Насретдинов, Badoo

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

это увидит

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

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

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

Page 31: Юрий Насретдинов, Badoo

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

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

Page 32: Юрий Насретдинов, Badoo

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

Вручную переносим все скрипты на другую машину (5 минут)

Page 33: Юрий Насретдинов, Badoo

«Падение» базы данных• Задания генерируются по расписанию!

• Заливаем «чистую» базу (только настройки скриптов)

• Убиваем все запущенные задания в «облаке»

• Перезапускаем управляющие скрипты

• Downtime — 30 минут

Page 34: Юрий Насретдинов, Badoo

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

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

@[email protected]