Postgres Pro Enterprise 13
Планировщик заданий
13
Авторские права
© Postgres Professional, 2023 год.
Авторы: Алексей Береснев, Илья Баштанов, Павел Толмачев
Использование материалов курса
Некоммерческое использование материалов курса (презентации,
демонстрации) разрешается без ограничений. Коммерческое
использование возможно только с письменного разрешения компании
Postgres Professional. Запрещается внесение изменений в материалы
курса.
Обратная связь
Отзывы, замечания и предложения направляйте по адресу:
Отказ от ответственности
Компания Postgres Professional не несет никакой ответственности за
любые повреждения и убытки, включая потерю дохода, нанесенные
прямым или непрямым, специальным или случайным использованием
материалов курса. Компания Postgres Professional не предоставляет
каких-либо гарантий на материалы курса. Материалы курса
предоставляются на основе принципа «как есть» и компания Postgres
Professional не обязана предоставлять сопровождение, поддержку,
обновления, расширения и изменения.
2
Темы
Назначение
Архитектура
Планируемые задания
Управление и наблюдение
Разовые задания
3
Назначение
Расширение pgpro_scheduler
планировщик периодических (планируемых) и разовых заданий
предоставляет возможности мониторинга
обеспечивает разграничение прав
Задание — команды SQL
каждая команда в отдельной транзакции или все в одной
Планировщик заданий требуется для периодического запуска заданий
по расписанию, а также для запуска разовых отложенных заданий.
В Postgres Pro планировщик реализован в виде расширения
pgpro_scheduler.
С его помощью можно планировать регулярные задачи
администрирования без доступа к файловой системе сервера и
необходимости использования внешнего программного обеспечения.
Задание планировщика состоит из команд SQL, которые могут быть
выполнены как в одной транзакции, так и в разных.
Планировщик заданий pgpro_scheduler позволяет управлять как
периодическими (планируемыми), так и разовыми заданиями, а также
наблюдать за ходом их выполнения. Планировщик заданий
pgpro_scheduler обеспечивает разделение полномочий: каждое задание
принадлежит определенному пользователю и выполняется от его
имени.
4
Архитектура
scheduler supervisor
DB1 DB2
scheduler
executor
executor
scheduler
at-executor
at-executor
at-executor
at-executor
для планируемых заданий
schedule.max_workers = 5
для разовых заданий
schedule.max_parallel_workers = 3
executor
executor
schedule.database = 'DB1,DB2’
Планировщик задач использует механизм фоновых рабочих процессов.
Основной процесс-диспетчер планировщика (один на весь кластер баз
данных) запускается функцией schedule.enable, а для автоматического
его запуска при старте сервера нужно установить параметр
schedule.auto_enabled = true.
Диспетчерский процесс проверяет настройки и для каждой из
указанных в параметре schedule.database баз данных запускает
отдельный процесс-менеджер. Также сразу запускаются обработчики
разовых заданий планировщика, их количество ограничено значением
schedule.max_parallel_workers.
Максимальное количество обработчиков для планируемых заданий
в каждой базе ограничено параметром schedule.max_workers.
Оба ограничения можно задавать на уровне базы данных командой
ALTER DATABASE. Обработчики планируемых и разовых заданий
работают независимо.
При этом общее количество рабочих процессов сервера ограничено
параметром max_wor ker_processes, его значение должно учитывать
потребности других задач, использующих фоновые процессы.
Если нет свободных процессов для выполнения, задание будет ожидать
освобождения обработчика. По умолчанию время ожидания не
ограничено, поэтому, планируя задание, разумно указывать
ограничение времени, при превышении которого pgpro_scheduler
отменит выполнение.
6
Планирование заданий
Команды SQL
выполняются в одной или в нескольких транзакциях
Расписание
в формате cron
массив дат
объект JSON
выражение SQL — время следующего запуска
диапазон времени
Дополнительные условия
пользователь, длительность, время ожидания, обработчик ошибок
Функция schedule.create_job позволяет запланировать периодическое
задание. Параметры планирования задаются в виде одного объекта
jsonb.
Атрибут commands задает одну или несколько команд для выполнения.
Если задать команды в виде символьной строки, они выполнятся
в одной транзакции. Если же задан массив строк, то каждому элементу
массива будет соответствовать отдельная транзакция.
Расписание для задания задается атрибутами:
cronв формате crontab;
dates — значение или массив значений типа timestamptz;
rule — объектом jsonb.
Атрибутами start_date и end_date можно ограничить время, в которое
задание может выполняться; вне диапазона работающее задание будет
остановлено, а новое не запустится.
Время следующего запуска задания будет определяться динамически,
если в атрибуте next_time_statement задать SQL-выражение. Оно
вычисляется после каждого выполнения задания.
Также можно запланировать выполнение задания с правами другого
пользователя (атрибут run_as), ограничить длительность выполнения
и ожидания, подключить обработчик ошибок в виде SQL-команды.
7
Управление и мониторинг
Управление
изменение свойств
активация
деактивация
удаление
Мониторинг
свойства задания
список заданий (всех, выполняющихся, выполненных)
список запланированных выполнений
очистка журнала
Расширение pgpro_scheduler использует функции в схеме schedule для
управления и мониторинга периодических заданий:
deactivate_job — деактивировать задание;
activate_job — активировать задание;
drop_job — удалить задание;
get_job — информация о задании;
get_owned_cron — задания пользователя;
get_cron — список заданий, выполняемых пользователем;
get_active_jobs — список выполняющихся заданий;
get_log — список всех завершенных заданий;
get_user_log — список завершенных заданий пользователя;
clean_log — удалить все записи о завершенных заданиях.
Имеется функция timetable, которая возвращает таблицу с описанием
всех запланированных выполнений заданий (многократно повторяемых
и разовых), попадающих в заданный диапазон времени.
9
Разовые задания
Выполнить задание
немедленно
в определенный момент
после завершения других заданий
Назначить повторное выполнение
Отменить еще не выполняющееся задание
Работают независимо от запланированных
Функция submit_job создает разовое задание. По умолчанию задание
будет выполнено немедленно. Можно задать время запуска
параметром run_ after. Также можно в параметре depends_on передать
массив идентификаторов других заданий — в этом случае данное
задание будет выполнено сразу после их завершения.
Функция resubmit, вызванная в SQL-запросе задания, позволяет задать
время следующего запуска этого задания.
Функция cancel_job отменяет задание. Если задание уже выполняется,
оно не будет прервано, но повторно назначить его будет нельзя.
Получить список выполненных и запланированных заданий (как
периодических, так и разовых) позволяет функция timetable.
Запланированные и разовые задания выполняются в разных
процессах, поэтому они могут работать параллельно.
11
Итоги
Расширение pgpro_scheduler позволяет планировать задания
Задания выполняются либо периодически по расписанию,
либо один раз в запланированное время
Задания принадлежат пользователям и выполняются от их
имени
Каждое задание выполняется в отдельном процессе
Имеются средства управления и мониторинга заданий
12
Практика
1. Подготовьте систему к работе с расширениями
pgpro_scheduler и pg_stat_statements.
2. Установите расширения pgpro_scheduler
и pg_stat_statements в базу данных и настройте их.
3. Запланируйте задание, собирающее статистику
по наиболее часто выполняемым запросам
с периодичностью в несколько секунд,
а также разовое задание, копирующее набранную
статистику в файл.
1. Для установки расширений потребуется изменить значение
параметра shared_preload_libraries с последующей перезагрузкой
сервера.
2. Подключив расширения с помощью CREATE EXTENSION, выполните
настройку числа рабочих процессов по аналогии с демонстрацией,
после чего перечитайте конфигурацию и запустите планировщик.
3. Запустите задание на выполнение с периодичностью, например, раз
в двадцать секунд. Задание должно собирать статистику по наиболее
часто выполняющимся командам SQL с помощью расширения
pg_stat_statements. Для этого создайте таблицу с такой же структурой,
как у представления pg_stat_statements, но с дополнительным полем,
в которое будет записываться момент сбора статистики. Ограничьте
время работы периодического задания, например, одной минутой,
используйте для этого атрибут end_date в аргументе функции
schedule.create_job. После этого определите разовое задание, которое
скопирует собранную статистику в файл.