Установка Gearman, Supervisor и Gearman Monitor на Debian и Ubuntu

gearman

В этом посте я опишу установку свежей версии из исходников, а так же создание инфраструктуры для и его связку и использование в PHP.

Установка Gearman

 

Качаем из исходников последнюю на текущий момент версию.

Предварительно перед сборкой надо установить зависимости. Тут аккуратно, могут быть другие версии. На у меня было как в листинге, на версия была ниже.

Дальше собираем, проблем не должно быть.

Успещность установки можно проверить

Теперь нужно дебианизировать (убунтузировать) демон gearmand чтобы можно было обращаться с ним как с другими сервисами через команду service.
Для этого нужно создать файл запуска в /etc/init.d/gearmand и дать ему права chmod 777. Содержимое будет следующее.

Теперь можно вызывать команды

Чтобы сделать запуск gearmand автоматическим при перезагрузке системы

Что дальше? Дальше установка модуля gearman для php.

 

Gearman и PHP

 

Для начало необходимо установить расширение PHP

Или если простой способ не работает, то можно руками

На официальном сайте gearman есть несколько примеров с PHP. Это простые скрипты без каких либо фреймворков, обычно представляют из себя две части – клиент и воркер.

Рекомендую ознакомиться для начала с примерами, чтобы понимать принцип работы gearman и познакомиться с основными методами.
http://gearman.org/examples/

Я использую фреймворк Zend Framework 2 и поэтому использую модуль mwillbanks/MwGearman. На самом деле можно легко написать свою обертку в Service и самому инициировать его конфигом в фабрике, но зачем, если есть уже готовые решения. У этого модуля предусмотрен конфиг, в который можно внести список серверов gearman.

Ниже я приведу пример как я использую Gearman с Zend.
Для начала пример воркера, т.к. с ним все проще, чем с клиентом. После ознакомления с примерами по ссылке выше проблем с пониманием кода не должно быть.

Это обычный console контроллер который имеет экшн описывающий воркер и вызывается таким образом, так я настроил в zend console route.

После вызова воркер будет висеть и ждать задачи. В данном случае этот воркер не делает ничего полезного, работа симулируется через sleep(). Можно так же заметить, что каждые 100 удачно выполненных работ вызывают смерть воркера. Это рекомендуемая практика чтобы не вызвать утечек памяти.

А вот с клиентами поинтереснее, т.к. работы можно запускать в двух режимах – как job, которую нужно выполнить немедленно и нам важен результат выполнения, или как task который имеет меньший приоритет перед job и не так важен (логирование, емейл и т.д) . Наиболее полно различия описывают ответы в этом вопросе http://stackoverflow.com/questions/12689274/whats-the-difference-between-a-task-and-do

Пример клиента в режиме job используя Zend модуль

То же самое, но с нативными функциями.

Для вызова клиента аналогично воркеру вызывается команда

Лучше всего для тестирования открыть несколько терминалов и запустить в них воркеры и в одном терминале клиент, будет видно как параллелятся задачи.
Дальше идет клиент использующий job, я остановил свой выбор на этой реализации. В этой реализации отличие в том, что происходит ожидание на стороне клиента когда выполнятся все задачи, т.е. нужно точно быть уверенным в завершении, дальше можно получить результат, например из БД.

В последнем примере клиента я добавил параметр unique для того, чтобы если я запускаю быстро 2 клиента из разных терминалов, у меня не повторялись уникальные идентификаторы задач Gearman. Если идентификатор повторяется, то Gearman считает, что знает эту работу и не добавит ее дважды, если работа с таким уником уже есть в очереди.

Дальше понадобится инструмент, который будет запускать пачку воркеров и следить за их жизненным циклом.

Установка

 

Для начала не большая оговорка – почему Supervisor, а не Gearman Manager?
На самом деле мне не нравится идея в GM, что нужно класть классы воркеров в строго определенном месте и настраивать это в конфиге менеджера. При использовании с фреймворком я предпочитаю делать воркером просто экшн кнтроллера при помощи console системы фреймворка. Так же Supervisor кажется мне более универсальным инструментом, ведь он может быть использован не только для Gearman.

Установить можно из репозиториев, но более свежая версия обычно ставится так.

Сразу же будет доступна возможность работать с supervisor как с service

Сам по себе без настроенных процессов демон бесполезен. Для выше приведенного примера воркера можно создать конфиг на запуск 20-ти процессов на фоне. Учитывая, что в реализации воркера задано ограничение на 100 работ – через каждые выполеннные 100 работ воркер будет умирать и запускаться заново supervisor-ом.

Конфиг файл /etc/supervisor/conf.d/gearmantest.conf с таким содержанием

Теперь после рестарта supervisor будет висеть 20 воркеров и ожидать задач. Можно позапускать клиенты с терминала и убедиться, что задачи выполняются.
Далее хотелось бы видеть статус очереди – сколько воркеров висит на работе и сколько задач в очереди. Через системную утилиту supervisorctl можно смотреть список активных процессов, которые мониторит supervisor, но это не совсем то.

 

Установка Gearman Monitor

 

Веб инструмент с http авторизацией который позволяет мониторить статус очереди – https://github.com/yugene/Gearman-Monitor.git

Предварительно надо установить зависимость.

Дальше установить сам проект

Теперь настроить подключение к Gearman

Дальше нужно настроить хост, перезапустить веб сервер и должна открыться страница статуса. Будут строки с примерно такой информацией

Что еще можно сделать? Если бизнес требования подразумевают, что очередь в случае перезагрузки сервера не должна теряться, т.к. она хранится в памяти, можно организовать персистентность для очереди Gearman через MySQL или SQLite3. В данном примере будет через MySQL. Для этого в файле /etc/init.d/gearmand можно в разделе do_start() после –exec $DAEMON добавить следующие параметры подключения. Конечно лучше сначала протестировать их вызывая просто gearmand с этими параметрами.

Теперь очередь будет персистентной. Можно переместить MySQL на SSD и установить Percona для минимизации потери в скорости работы Gearman, по желанию.