Skip to content

badoo/thunder

Repository files navigation

Thunder, Badoo cloud system

Описание

Thunder представляет из себя реализацию управляющей логики для запуска заданий по расписанию, или добавляемых через API. Упрощенно можно рассматривать эту систему, как реализацию «облачного cron». Вы задаете расписание для запуска путем добавления записей в таблицу в MySQL и дальше система начинает запускать указанные задания и следить за их исполнением.

Основные компоненты

Для работы thunder нужны следующие компоненты:

  1. Демон thunder
  2. MySQL
  3. Агент для запуска заданий (например go-proxyd)
  4. LSD, опционально (github.com/badoo/lsd)
  5. Код для уведомления об успешном запуске и завершении заданий*
  6. Heartbeat*

Компоненты со звездочкой должны быть написаны самостоятельно

Сборка и конфигурация thunder

Чтобы установить thunder, выполните команду go get github.com/badoo/thunder с помощью go версии 1.6+.

Пример конфигурации находится в файле conf/thunder.conf. Секция daemon_config задает порты для общения с демоном, по умолчанию он слушает JSON-запросы на порту 6558. Дебаг-интерфейс доступен порту 6561 по адресу http://host:6561/debug/thunder.

Основные конфигурационные опции

  • mysql.dsn — параметры для доступа к MySQL
  • launcher.host_suffix — суффикс (с указанием порта), который будет добавляться к полю hostname в базе для соединения с агентом
  • launcher.base_path — путь до «скрипта» в поле script при запросах типа run к агенту
  • launcher.developer_path — путь до «скрипта» в поле script, если указано поле developer (%s заменяется на значение поля developer)
  • launcher.rqh_log_file — путь до лог-файла, в который будут записаны данные о неуспешных запусках
  • is_devel — если выставлено в false, то значение launcher.developer_path перестанет учитываться

Назначение таблиц в MySQL в файле structure.sql

  • Script — список «скриптов» (типов заданий, которые можно запускать)
  • ScriptSettings — настройки для скриптов, вынесены отдельно, поскольку используются в RunQueue и ScriptTimetable
  • ScriptFlags — флаги, используемые для того, чтобы «убивать», останавливать и запускать скрипты
  • Server — список серверов с разбиением на группы, также содержит загрузку CPU, потребление памяти и др.
  • ScriptTimetable — очередь для запуска заданий и их статус
  • RunQueue — после того, как для записи в ScriptTimetable был выбран hostname, она попадает в RunQueue для непосредственного запуска
  • ScriptJobInfo — информация о поколениях заданий (о них рассказано ниже)

Написание Heartbeat-скрипта

Для того, чтобы thunder «узнал» о существовании хостов, нужно запускать Heartbeat-скрипт, например из cron. Heartbeat-скрипт должен собирать информацию о текущей загрузке процессора (в процентах) и по потреблению памяти (в байтах). Помимо этого, Heartbeat-скрипт должен определять имя кластера (группы), в который входит данный хост. Информация должна вставляться в таблицу Server раз в 10 секунд.

Описание полей:

  • hostname — имя сервера, возвращаемое системным вызовом gethostname()
  • group — имя группы (кластера), в который входит этот сервер
  • cpu_user — user% загрузки процессора (значение от 0 до 100)
  • cpu_sys — system%
  • cpu_nice — nice%
  • cpu_iowait — iowait%
  • cpu_steal — steal%
  • cpu_idle — какой процент процессора свободен (значение от 0 до 100)
  • cpu_parasite — сколько процентов CPU потребляют программы, которые не запущены с помощью thunder («паразиты»)
  • cpu_parrots_per_core — индекс производительности хоста в расчете на одно ядро («попугаи»)
  • cpu_cores — количество ядер
  • mem_total — общее количество памяти на хосте в байтах
  • mem_free — количество свободной оперативной памяти в байтах (free)
  • mem_cached — количество памяти, занятое кешом файловой системы (cached)
  • mem_buffers — количество памяти, отведенное под дисковые и другие буферы (buffers)
  • mem_parasite — количество памяти, потребляемое «паразитами» (программы, запущенные не с помощью thunder)
  • swap_total — общий объем swap-раздела
  • swap_used — используемый объем swap-раздела
  • min_memory_ratio — опциональное поле, определяет минимальное соотношение свободной памяти к общему объему, при котором хост всё ещё считается «живым» (полезно выставлять в -1 для маленьких виртуальных машин)
  • updated — TIMESTAMP последнего времени обновления информации о сервере (выставляется автоматически в MySQL при выполнении UPDATE)
  • phproxyd_heartbeat_ts — TIMESTAMP последнего «хартбита», посчитанный через запуск задания через go-proxyd (об этом ниже)
  • disabled_ts — опциональное поле, которое временно отключает хост из балансировки, если выставлено в не-NULL значение
  • min_memory — опциональное поле, минимальное количество свободной памяти, при которой хост считается «живым» (полезно выставлять в -1045057536 для маленьких виртуальных машин)
  • min_parrots — опциональное поле, минимальное количество «попугаев», при которых хост всё ещё считается «живым»