Воркеры (workers)
Идея
Для расширения обработки метрик Glaber используются так называемые workers.
Воркер (worker) - это простая программа на любом языке, которая использует stdin/stdout и JSON для взаимодействия с Glaber и использует специфичный для своих задач протокол для связи с внешним миром.
Например, есть syslog worker[ссылка] - он принимает пакеты в формате Syslog, и выводит полученные данные в формате JSONL через stdout.
В отличие от ExternalScripts, worker - это длительно работающая программа, которая инициализируется один раз, а затем обрабатывает множество запросов в цикле. Это устраняет значительные накладные расходы, необходимые для запуска скриптов, выполняющихся один раз.
Воркеры запускаются и контролируются сервером Glaber, поэтому нет необходимости демонизировать их и контроллировать, запущены они или нет.
Безопасность
Воркеры запускаются в изолированном forked-процессе и не влияют на Glaber, если у них случаются утечки памяти, ошибки сегментации и т.д., это приводит к остановке только воркера, и Glaber автоматически перезапускает упавшие воркер процессы..
Использование
Воркеры используются во многих частях Глабера:
- интерфейс истории для упрощения внедрения новых механизмов хранения истории
- интерфейс pinger для реализации высокоэффективных ICMP проверок
- Воркеры для эффективной реализации новых протоколов входящих данных
Как создать воркер
Воркер может быть написан на любом языке, который поддерживает система, на которой работает сервер или прокси-сервер, это могут быть нтерпретируемые языки (Bash, Python) или двоичные (С++, Golang).
Worker должен быть исполняемым пользователем, под которым запущен сервер или прокис Glaber (обычно это 'zabbix', на новых установках - 'glaber').
Если исполняемому файлу требуются какие-то специальные разрешения, вы можете установить бит +s или расширенные права с помощью расширенных разрешений Linux.
Например, glbmap worker, использующемуся для проверок icmp, необходим sudo
флаг или расширенные разрешения, чтобы иметь возможность использовать RAW сокеты для эффективной отправлки icmp и разрешение PCAP для сбора ответов.
Типичная структура работников такова:
Init();
While( new_data = GetNewDataFromSpecificProtocol()) {
ProcessData(new_data);
json = ConvertDataToJSON(new_data);
Print(stdout, json);
}
Примеры исходного кода
Пожалуйста, ознакомьтесь с рабочими в golang в проекте Glaber
Производительность и высокая нагрузка
Когда сервер Glaber запускает рабочий процесс, он увеличивает размеры буфера stdin и stdout до максимально возможных системных значений (около 10 мегабайт в последних системах). Он был протестирован в производстве и отлично работает на скоростях передачи данных до ** 30 Тыс. NVPS **.
Сервер делает все возможное, чтобы считывать данные с рабочего устройства как можно быстрее. Однако при действительно высоких объемах данных, поступающих от worker, рекомендуется реализовать буферизацию stdout на стороне worker и переместить отправку данных в отдельный поток или своего рода совместную процедуру, которая может потребоваться языку, чтобы избежать блоков.
Эта мера может быть также полезна, если есть пакеты, когда worker выводит данные в больших объемах в течение короткого периода времени, и очень важно не блокировать worker при выполнении операций stdout во время таких пакетов.
Перезапуск сервера
Чтобы процессы воркеров не зависали и не занимали системные ресурсы, например сокеты и порты на которых они могу слушать входящий траффик, воркеры должны отслеживать невозможность записи данных в stdout и выходить, если невозможно записать туда данные.
Если поток данных незначительный, то следует раз в 30-60 секунд отправлять пустые строки \n
на stdout для проверки работоспособности сервера.