О планировщике задач

Содержание раздела
  1. Возможности планировщика
  2. Действия с задачами
  3. Выполнение задач
    1. Время запуска
    2. Непараллельность задачи самой себе
    3. Порядок выполнения запросов в задаче
  4. Журнал запусков
    1. Очистка журнала запусков
  5. Отличия от cron и pg_cron
  6. Ограничения

Система имеет встроенный планировщик, выполняющий задачи — именованные списки запросов к системе или датасорсу хранилища — по настроенному расписанию.

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

Планировщик работает в масштабе всего кластера: одновременно выполняет не более одного экземпляра каждой задачи и продолжает выполнение задач при смене лидера. По задачам ведутся журналы запусков, куда сохраняются результаты каждого запроса в рамках задачи.

Примеры сценариев использования:

По умолчанию планировщик включен в конфигурации, но не содержит задач.

Возможности планировщика

Планировщик позволяет:

Действия с задачами

Задачи можно создавать, активировать, деактивировать и удалять.

По умолчанию задача создается активной и начинается выполняться по своему расписанию.

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

Выполнение задач

Задачи выполняются лидером кластера: он периодически проверяет, для каких задач наступило время запуска, и запускает их. Первая проверка запускается после создания первой задачи в окружении, затем — с интервалом SCHEDULER_CHECK_PERIOD_MS (по умолчанию — 60 секунд).

Выполняются только активные задачи, а неактивные пропускаются. При активации задача начинает выполняться по своему расписанию, без компенсации пропущенных за время ее неактивности запусков.

Количество одновременно выполняемых задач определяется параметром SCHEDULER_CONCURRENT (по умолчанию — 20). Остальные задачи ждут своей очереди в текущем цикле проверки.

При смене лидера новый лидер запускает задачи, недовыполненные прошлым лидером.

Выполнение можно отключить для определенной задачи или всех задач окружения.

Время запуска

Перед началом каждого запуска задачи вычисляется время ее следующего запуска по расписанию. Рассчитанное время сохраняется и уже не пересчитывается прямо перед следующим запуском.

Каждый запуск выполняется не точно в заданный в расписании момент, а в ближайший после него цикл проверки планировщика. Например, при проверке раз в 30 минут, задача с запуском каждые 15 минут фактически будет выполняться не чаще, чем раз в полчаса.

Непараллельность задачи самой себе

В отличие от cron, задача не запускается параллельно самой себе. Пока задача выполняется, все ее запуски, запланированные на это время, пропускаются и компенсируются единственным запуском — в ближайшем цикле проверки планировщика после завершения задачи.

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

Порядок выполнения запросов в задаче

Запросы выполняются последовательно в порядке, в котором они были указаны при создании задачи. Результаты запуска задачи, включая результаты исполнения каждого ее запроса, записываются в журнал запусков.

Запуск задачи считается успешным, если все ее запросы успешно исполнены. Если один из запросов завершился с ошибкой, последующие запросы не выполняются, и запуск задачи завершается с ошибкой.

Каждый запрос, исполняемый системой в рамках задачи, имеет идентификатор queryId в формате: <идентификатор_задачи>.<номер_запуска>.<номер_запроса_в задаче>. По этому значению можно отследить обработку запроса в логах ноды.

Система пытается исполнить запросы в виде, заданном при создании задачи. Если возникают ошибки, они записываются в журналы запусков задач или логи лидерской ноды.

Журнал запусков

По каждой задаче ведется журнал ее запусков. Он позволяет отследить, выполняется ли задача штатно, и найти причину неуспешного запуска, если такой произошел.

Запись журнала создается по завершении задачи и содержит порядковый номер запуска, время его начала и завершения, статус, а также результаты исполнения запросов. Нумерация запусков сохраняется сквозной даже после очистки журнала: номера удаленных записей не переиспользуются.

Журнал и сведения о текущем запуске задачи можно получить, как описано в разделе Управление задачами.

Очистка журнала запусков

Журналы запусков задач могут очищаться автоматически или вручную. В обоих случаях удаляются только записи о завершенных запусках; текущие запуски задач не затрагиваются. Журналы очищаются как для активных, так и неактивных задач.

Автоматическая очистка журналов запусков выполняется, если настроена в конфигурации нод. Она запускается с периодичностью SCHEDULER_LOG_TRUNCATE_PERIOD_MS (по умолчанию — раз в 12 часов) и оставляет в каждом журнале до SCHEDULER_LOG_MAX_SIZE последних записей (по умолчанию — 100). Нулевое значение любого из этих параметров отключает автоматическую очистку.

Автоматическая очистка всегда сохраняет запись о последнем завершенном запуске каждой задачи независимо от значения SCHEDULER_LOG_MAX_SIZE. Полностью очистить журнал можно только вручную, и в этом случае также удаляются сведения о последнем завершенном запуске задачи.

Очистить журнал запусков вручную можно по отдельной задаче или всем задачам окружения, как описано в разделе Управление задачами.

Отличия от cron и pg_cron

Ниже перечислены основные отличия планировщика Prostore от cron и pg_cron. Отличия в формате расписания см. в разделе Формат расписания задач.

Механизм В планировщике Prostore В классическом cron В pg_cron
Повторный запуск во время выполнения Пропускается; все пропущенные запуски компенсируются одним Начинается независимо от предыдущего запуска Ставится в очередь и начинается сразу после завершения предыдущего
Интервал проверки расписания Настраивается (SCHEDULER_CHECK_PERIOD_MS, по умолчанию — 60 секунд) Фиксированный — 1 минута Не описан в документации
Количество одновременно выполняемых задач Настраивается (SCHEDULER_CONCURRENT, по умолчанию — 20) Не ограничивается Настраивается (cron.max_running_jobs, по умолчанию — 32)
Место выполнения Лидер кластера; при смене лидера выполнение продолжается новым лидером Хост, на котором размещен crontab Сервер СУБД; на резервном сервере задачи не выполняются и запускаются, когда он становится ведущим
Содержимое задачи Список команд Prostore или СУБД Команда операционной системы SQL-команда в заданной базе данных
Журнал запусков Ведется по каждой задаче Не ведется: вывод команды отправляется по почте владельцу crontab Ведется в таблице cron.job_run_details
Очистка журнала запусков Автоматическая и ручная Только ручная
Остановка задачи без удаления Деактивация задачи Не предусмотрена: строку crontab нужно закомментировать cron.alter_job(<id>, active := false)

Ограничения

  • Задачи выполняются только на лидерской ноде кластера.
  • Изменение параметров задачи, кроме признака активности, недоступно.
  • Расписание и запросы задачи не проверяются при ее создании.
  • Фактическая точность соблюдения расписания определяется интервалом проверки SCHEDULER_CHECK_PERIOD_MS.
  • Запуски, пропущенные во время выполнения задачи, не накапливаются и компенсируются одним запуском после ее завершения.
  • Деактивация задачи не прерывает уже начатый запуск и вступает в силу после его завершения. При этом результат такого запуска нигде не сохраняется — ни в журнале запусков, ни в сведениях о последнем запуске.