Skip to content

Воркеры (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 для проверки работоспособности сервера.