Pull to refresh

Укращение Демонов или инфраструктура для Gearman

Reading time4 min
Views14K
image

Gearman — фреймворк для распределения задач. Подробней о нем можно почитать: Здесь или Здесь. Этот инструмент — находка для решения целого ряда задач. Но при его эксплуатации на боевых серверах мы столкнулись с некоторыми проблемами, решением которых я хочу поделится:
— Как автоматически запускать демонов и следить за их здоровьем?
— Как запустить несколько инстансов воркеров?
— Куда демоны будут писать сообщения, предназначенные для вывода на экран?
— А как следить, чтобы демоны не отвлекались на грудастых гаргулий, а работали. словом следить за нагрузкой.
Для этого есть довольно удобные инструменты:


Предполагаем, что у нас имеется запущенный и настроенный Gearman-сервер, воркеры и клиенты, которые периодически что-то хотят от воркеров.

Supervisor


Проблема: Мы запустили Gearman сервер, теперь необходимо запустить n-ое количество различных воркеров.
— Запускать вручную и отвязывать от консоли?
— а как узнать что кто-то упал? и идет ли работа?
— ах, не отвязывать от консоли. Нет, попахивает мазохизмом.

Для решения этих проблем можно использовать Supervisor.

Как говорится в руководстве: Supervisor — клиент-серверная система, которая помогает пользователям мониторить и управлять количеством процессов в Unix-like операционной системе.
С его помощью мы можем демонизировать всех воркеров в нужном количестве, а так же отслеживать их работу
Необходимо для каждого воркера написать отдельный конфиг-файл и поместить его в /etc/supervisor/conf.d/
Конфиг-файл имеет довольно простую структуру:

[program:<worker_name>]
command=<execution_file>
process_name=%(process_num)s                          
stdout_logfile=/var/log/<worker_name>.log
stderr_logfile=/var/log/<worker_name>.log
redirect_stderr=true
autostart=true                                         
autorestart=true                                       
startsecs=5                                            
numprocs=1   


[program:<worker_name>] — заголовок секции. Нижеследующие параметры будут относится только к этому воркеру(демону)
command — команда на запуск файла. чаще всего путь к исполняемому файлу.
process_name — имя каждого инстанса воркера. Здесь есть тонкость — В мануале указано, что этот параметр не обязательный. Но у меня были проблемы с запуском нескольких инстансов воркера, если его не указывать. Дело в том, что имена процессов должны отличаться. Здесь помимо названия воркера указываем его порядковый номер.
stdout_logfile — говорит само за себя. куда перенаправляем стандартную консоль вывода.
stderr_logfile — то же самое, только для ошибок. Рекомендую указывать эти 2 параметра. Они могут очень выручить, когда придется разбераться почему падают ваши демоны.
autostart — как и следовало ожидать. запускаем воркеров при запуске супервизорда. Как правило при старте системы.
autorestart — уже за один этот параметр стоит использовать супервизор. Рестартует вашего воркера, если тот при выполнении одного из заданий упал с Exception'ом.
startsecs — сколько времени нужно ждать воркера, чтобы он запустился (не обязательный параметр)
numprocs — это второй параметр, за который можно любить супервизора — количество инстансов воркеров.

Контроль и управление демонами


Есть 2 возможности контролировать демоны, запущенные супервизором это консольная утилита supervisorCtl и веб интерфейс.
SupervisorCtl при запуске отображает информацию о статусе демонов:

Gearman_AddressCodeFinder:0      RUNNING    pid 2060, uptime 10:15:01
Gearman_MessageSender:0          RUNNING    pid 2064, uptime 10:15:01
Gearman_MessageSender:1          RUNNING    pid 2063, uptime 10:15:01
Gearman_ReportCreator:0          RUNNING    pid 2055, uptime 10:15:01
Gearman_WorkplanNotifier:0       RUNNING    pid 2061, uptime 10:15:01
Universal:0                      RUNNING    pid 2059, uptime 10:15:01
Universal:1                      RUNNING    pid 2058, uptime 10:15:01


Здесь все понятно и без объяснений. Можно понять кто работает, кто упал.
С помощью этой утилиты из консоли можно останавливать\запускать демонов, переконфигурировать супервизорд. Довольно интересна команда fg, позволяющая подключится к процессу в фоновом режиме (Он становится привязан к вашей консоли). Довольно удобная вещь для отладки на боевой системе :)

Управление демонами из веб-интерфейса



Помимо консольного интерфейса Супервизор имеет веб-интерфейс:


Попасть в него как правило можно по Url: 127.0.0.1:9211/ В вашем случае порт может отличаться. настройки можно найти в секции
[inet_http_server]
port = 127.0.0.1:9211

конфиг файла (в моем случае /etc/supervisor/supervisord.conf)

Из веб-интерфейса, так же как и из консоли, можно запускать\останавливать демонов, следить за тем, что они выводят на консоль. Последнее особенно ценно когда приходится отлавливать баги демонов на боевой системе

Gearman tools


Мониторинг демонов это хорошо. Но как узнать сколько задач на сервере очередей, а сколько и каких задач исполняются в данный момент. Есть как минимум 2 способа:
1) Подключение по telnet к серверу очередей и запрос состояния:
telnet localhost 4730
status //запрашиваем информацию о состоянии очередей
address:find    0       0       1
workplan:sendnotify     0       0       1
report:createreport     0       0       1
message:send    0       0       2
universal:universal     0       0       2


Но ифнормация довольно скудна. и вспомните ли вы через 2 месяца что за цифра в 3ей колонке? Я — точно нет.
2) Есть более красивое решение — утилита gearman_top
Она показывает ту же информацию, но в более удобном виде, и обновление данных происходит в реальном времени.
Устанавивается довольно просто:
apt-get install gearman-tools

Запускается командой:
gearman_top

Выводит информацию:
Queue Name           | Woker Available | Jobs Waiting | Jobs Running
----------------------------------------------------------------------
 address:find        |               1  |           0  |           0
 message:send        |               2  |           0  |           0
 report:createreport |               1  |           0  |           0
 universal:universal |               2  |           0  |           0
 workplan:sendnotify |               1  |           0  |           0
----------------------------------------------------------------------

Текст вывода на экран говорит сам за себя: Какие очереди присутствуют на сервере, сколько воркеров доступно в данный момент, сколько задач выполняется и сколько ждет выполнения.
Tags:
Hubs:
Rating0
Comments2

Articles