Thunder представляет из себя реализацию управляющей логики для запуска заданий по расписанию, или добавляемых через API. Упрощенно можно рассматривать эту систему, как реализацию «облачного cron». Вы задаете расписание для запуска путем добавления записей в таблицу в MySQL и дальше система начинает запускать указанные задания и следить за их исполнением.
Для работы thunder нужны следующие компоненты:
- Демон thunder
- MySQL
- Агент для запуска заданий (например go-proxyd)
- LSD, опционально (github.com/badoo/lsd)
- Код для уведомления об успешном запуске и завершении заданий*
- Heartbeat*
Компоненты со звездочкой должны быть написаны самостоятельно
Чтобы установить 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
— параметры для доступа к MySQLlauncher.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 перестанет учитываться
Script
— список «скриптов» (типов заданий, которые можно запускать)ScriptSettings
— настройки для скриптов, вынесены отдельно, поскольку используются в RunQueue и ScriptTimetableScriptFlags
— флаги, используемые для того, чтобы «убивать», останавливать и запускать скриптыServer
— список серверов с разбиением на группы, также содержит загрузку CPU, потребление памяти и др.ScriptTimetable
— очередь для запуска заданий и их статусRunQueue
— после того, как для записи в ScriptTimetable был выбран hostname, она попадает в RunQueue для непосредственного запускаScriptJobInfo
— информация о поколениях заданий (о них рассказано ниже)
Для того, чтобы 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
— опциональное поле, минимальное количество «попугаев», при которых хост всё ещё считается «живым»