У меня есть более 100 экземпляров веб-серверов, на которых запущено приложение php. используя apc, и мы время от времени (порядка одного раза в неделю по всему парку) обнаруживают повреждение одного из кэшей, что приводит к отчетливому сообщению в журнале об ошибках.
Как только это произойдет, приложение на этом узле перестанет работать, любые транзакции, направляемые к нему, завершатся ошибкой.
Я написал простую оболочку вокруг tail -F
, которая может обнаруживать шаблон в любое время, когда он появляется в файле журнала, и оценивать команду оболочки (используя bash eval
), чтобы отреагировать. У меня есть это с помощью команды salt-call
из salt-stack для запуска обработки пользовательского модуля, который отключает nginx сервер, прогревает (обновляет) кэш и, конечно же, перезапускает веб-сервер. (На самом деле у меня есть две формы этой оболочки: bash
и Python).
Это нормально, и частота событий такова, что это вряд ли будет проблемой. Однако мой босс, вполне обоснованно, обеспокоен паттерном сбоя общего режима ... что регулярное выражение может появиться в слишком многих из этих журналов одновременно и захватить весь сайт.
Моей первой мыслью было обернуть мой salt-call
в redis проверить (у нас уже есть инфраструктура Redis, используемая для кэширования и некоторых других структур данных). Это будет реализовано как целое число с истечением срока действия. Проверка вызовет INCR, проверит результат и приостановит работу, если будет возвращено больше N (или если сервер Redis недоступен). Если бы результат был ниже порогового значения, то было бы отправлено salt-call
, и после того, как сервер будет запущен и запущен, будет вызван декремент. (Истечение срока действия ключа Redis убьет любые устаревшие инкременты, возможно, через день или даже несколько часов ... наша система оповещения уже уведомит нас о неработающих серверах, и наше время отклика более чем достаточно для таких временных рамок).
Тем не менее, я читал о функциях обработки событий Saltstack и задавался вопросом, не лучше ли использовать их вместо этого. (Преимущество в том, что на узлах нет командного инструмента redis-cli
и библиотек Python Redis, но, очевидно, salt-call
уже есть с его необходимой поддержкой). Таким образом, использование чего-то в Salt сведет к минимуму необходимость добавления дополнительных пакетов и зависимостей в эти системы. (В качестве альтернативы я мог бы просто написать всю обработку Redis в виде отдельной утилиты командной строки PHP и просто вызвать ее в моем сценарии оболочки).
Есть ли HOWTO для написания простых модулей Saltstack? Документы, кажется, глубоко погружаются в справочные детали без какой-либо ориентации. Даже некоторые предложения о том, по каким терминам искать, были бы полезны (потому что их использование таких терминов, как столбы, зерна, миньоны и т. д., кажется несколько непрозрачным).