Установка и сопровождение
Планировщик заданий
16
Авторские права
© Postgres Professional, 2023–2026
Авторы: Алексей Береснев, Илья Баштанов, Павел Толмачев, Игорь
Гнатюк
Фото: Олег Бартунов (монастырь Пху и пик Бхрикути, Непал)
Использование материалов курса
Некоммерческое использование материалов курса (презентации,
демонстрации) разрешается без ограничений. Коммерческое
использование возможно только с письменного разрешения компании
Postgres Professional. Запрещается внесение изменений в материалы
курса.
Обратная связь
Отзывы, замечания и предложения направляйте по адресу:
edu@postgrespro.ru
Отказ от ответственности
Компания Postgres Professional не несет никакой ответственности за
любые повреждения и убытки, включая потерю дохода, нанесенные
прямым или непрямым, специальным или случайным использованием
материалов курса. Компания Postgres Professional не предоставляет
каких-либо гарантий на материалы курса. Материалы курса
предоставляются на основе принципа «как есть» и компания Postgres
Professional не обязана предоставлять сопровождение, поддержку,
обновления, расширения и изменения.
2
Темы
Назначение
Архитектура
Периодические задания
Управление и наблюдение
Разовые задания
3
Назначение
Расширение pgpro_scheduler
планировщик периодических и разовых заданий
мониторинг
разграничение прав
Задание — команды SQL
в отдельных транзакциях или все в одной
Планировщик заданий требуется для периодического запуска заданий
по расписанию, а также для запуска разовых отложенных заданий.
В Postgres Pro планировщик реализован в виде расширения
pgpro_scheduler.
С его помощью можно планировать регулярные задачи
администрирования без доступа к файловой системе сервера и без
использования внешнего программного обеспечения.
Задание планировщика состоит из команд SQL, которые могут быть
выполнены как в одной транзакции, так и в разных.
Планировщик позволяет наблюдать за ходом выполнения заданий. Он
обеспечивает разделение полномочий: каждое задание принадлежит
определенному пользователю и выполняется от его имени.
4
Архитектура
scheduler supervisor
DB1
DB2
scheduler
executor
executor
scheduler
at-executor
at-executor
at-executor
at-executor
…
…
…
для периодических заданий
schedule.max_workers = 2
для разовых заданий
schedule.max_parallel_workers = 2
executor
executor
…
↑
↑?
schedule.auto_en abled
schedule.database
Планировщик задач использует механизм фоновых рабочих процессов.
Основной процесс-диспетчер планировщика (один на весь кластер баз
данных) запускается функцией schedule.enable, а для автоматического
его запуска при старте сервера нужно установить параметр
schedule.auto_enabled = true.
Диспетчерский процесс проверяет настройки и для каждой из
указанных в параметре schedule.database баз данных запускает
отдельный процесс-менеджер (для показанной на слайде конфигурации
нужно задать значение 'DB1,DB2'). Также сразу запускаются
обработчики разовых заданий планировщика, их количество
ограничено значением schedule.max_parallel_workers.
Максимальное количество обработчиков для планируемых заданий
в каждой базе ограничено параметром schedule.max_worker s.
Оба ограничения можно задавать на уровне базы данных командой
ALTER DATABASE. Обработчики периодических и разовых заданий
работают независимо.
При этом общее количество рабочих процессов сервера ограничено
параметром max_worker_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 для
управления периодическими заданиями и их мониторинга:
●
set_job_attribute() — изменение одного атрибута задания;
●
set_job_attributes() — изменение нескольких атрибутов задания;
●
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. Запланируйте задание, собирающее статистику
по наиболее часто выполняемым запросам каждые 20
секунд, а также разовое задание, копирующее
набранную статистику в файл.
1. Для установки расширений потребуется изменить значение
параметра shared_preload_libraries и перезагрузить сервер.
2. Подключив расширения с помощью CREATE EXTENSION, настройте
число рабочих процессов по аналогии с демонстрацией и запустите
планировщик.
3. Для сбора статистики используйте расширение pg_stat_statements и
таблицу с такой же структурой, как у представления pg_stat_statements,
но с дополнительным полем, в которое будет записываться момент
сбора статистики. Ограничьте время работы периодического задания
одной минутой с помощью атрибута end_date в аргументе функции
schedule.create_job.
13
Практика PPEM
Эти задания используют планировщик PPEM, а не расширение
pgpro_scheduler.
1. Запланируйте выполнение очистки базы demo через одну-
две минуты.
2. Создайте задание для переиндексации таблиц в табличном
пространстве pg_default базы demo и запланируйте его
выполнение на регулярной основе каждый будний день
в 20:00.
3. Убедитесь, что задание из п. 1 выполнено.
4. Деактивируйте задание из п. 2.
1, 2. Создавайте задания из панели «Базы данных».
3, 4. Используйте вкладку «Консоль заданий» в навигационной панели
PPEM.