05 Занятие 05: Установка и сопровождение / Планировщик заданий
Эта страница извлечена из официального PDF в нативный Markdown. Текст слайдов, код и комментарии сохранены в порядке чтения; исходные PDF и HTML остаются эталоном макета. HTML source: pgpro_05_scheduler.html Archive: PGPRO-handouts-16.zip Страниц PDF: 24
Page 1: Установка и сопровождение / Планировщик заданий
Авторские права
© Postgres Professional, 2023–2026 Авторы: Алексей Береснев, Илья Баштанов, Павел Толмачев, Игорь Гнатюк Фото: Олег Бартунов (монастырь Пху и пик Бхрикути, Непал)
Использование материалов курса
Некоммерческое использование материалов курса (презентации, демонстрации) разрешается без ограничений. Коммерческое использование возможно только с письменного разрешения компании Postgres Professional. Запрещается внесение изменений в материалы курса.
Обратная связь
Отзывы, замечания и предложения направляйте по адресу: edu@postgrespro.ru
Отказ от ответственности
Компания Postgres Professional не несет никакой ответственности за любые повреждения и убытки, включая потерю дохода, нанесенные прямым или непрямым, специальным или случайным использованием материалов курса. Компания Postgres Professional не предоставляет каких-либо гарантий на материалы курса. Материалы курса предоставляются на основе принципа «как есть» и компания Postgres Professional не обязана предоставлять сопровождение, поддержку, обновления, расширения и изменения.
Page 2: Темы
- Назначение
- Архитектура
- Периодические задания
- Управление и наблюдение
- Разовые задания
Page 3: Назначение
Расширение pgpro\_scheduler
- планировщик периодических и разовых заданий мониторинг разграничение прав Задание — команды SQL
- в отдельных транзакциях или все в одной
Комментарии преподавателя
Планировщик заданий требуется для периодического запуска заданий по расписанию, а также для запуска разовых отложенных заданий. В Postgres Pro планировщик реализован в виде расширения pgpro_scheduler.
С его помощью можно планировать регулярные задачи администрирования без доступа к файловой системе сервера и без использования внешнего программного обеспечения.
Задание планировщика состоит из команд SQL, которые могут быть выполнены как в одной транзакции, так и в разных.
Планировщик позволяет наблюдать за ходом выполнения заданий. Он обеспечивает разделение полномочий: каждое задание принадлежит определенному пользователю и выполняется от его имени.
https://postgrespro.ru/docs/enterprise/16/pgpro-scheduler
Page 4: Архитектура
{#source-figure-004 caption=“Source slide page 4: Архитектура”}
- …
- ↑
Комментарии преподавателя
Планировщик задач использует механизм фоновых рабочих процессов.
Основной процесс-диспетчер планировщика (один на весь кластер баз данных) запускается функцией schedule.enable, а для автоматического его запуска при старте сервера нужно установить параметр schedule.auto_enabled = true.
Диспетчерский процесс проверяет настройки и для каждой из указанных в параметре schedule.database баз данных запускает отдельный процесс-менеджер (для показанной на слайде конфигурации нужно задать значение ‘DB1,DB2’). Также сразу запускаются обработчики разовых заданий планировщика, их количество ограничено значением schedule.max_parallel_workers.
Максимальное количество обработчиков для планируемых заданий в каждой базе ограничено параметром schedule.max_workers.
Оба ограничения можно задавать на уровне базы данных командой ALTER DATABASE. Обработчики периодических и разовых заданий работают независимо.
При этом общее количество рабочих процессов сервера ограничено параметром max_worker_processes, его значение должно учитывать потребности и других задач, использующих фоновые процессы.
Если нет свободных процессов для выполнения, задание будет ожидать освобождения обработчика. По умолчанию время ожидания не ограничено, поэтому, планируя задание, разумно указывать ограничение времени, при превышении которого pgpro_scheduler отменит выполнение.
Page 5: Установка расширения pgpro_scheduler
Создадим базу данных:
Для работы расширения необходимо подключить библиотеку:
Общее ограничение на количество фоновых рабочих процессов в системе, значения по умолчанию достаточно для работы с одной базой:
Подключение библиотеки требует перезапуска СУБД.
Установим расширение pgpro_scheduler в базе данных, в которой оно будет использоваться.
Объекты расширения находятся в схеме schedule. Например, представления для мониторинга разовых заданий:
Настройка
Укажем имена баз данных, для которых будут запускаться задания:
Применим изменение конфигурации.
Установим ограничения на уровне базы данных. Максимальное число рабочих процессов для периодических заданий:
Page 6: Page 6
Ограничение на число рабочих процессов, выполняющих разовые задания:
Включим планировщик заданий:
Состояние процессов планировщика заданий:
Информация об этих процессах доступна и в pg_stat_activity:
Page 7: Периодические задания
Команды 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-команды.
https://postgrespro.ru/docs/enterprise/16/pgpro-scheduler#PGPRO-SCHED ULER-USAGE
Page 8: Управление и мониторинг
Управление
- изменение атрибутов
- активация
- деактивация
- удаление
- Мониторинг
- свойства задания
- список заданий (всех, выполняющихся, выполненных)
- список запланированных выполнений
- очистка журнала
Комментарии преподавателя
Расширение 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, которая возвращает таблицу с описанием всех запланированных выполнений заданий (многократно повторяемых и разовых), попадающих в заданный диапазон времени.
Page 9: Периодические задания
Создадим таблицу:
А теперь создадим периодическое задание, используя формат crontab. Формат использует пять полей для идентификации времени: минуты часа (0-59); часы (0-23); дни месяца (1-31); месяц (1-12 или трехбуквенное сокращение); дни недели (0 — воскресенье … 6 — суббота, или трехбуквенные сокращения). Если в поле после звездочки через косую черту указано число — это шаг выполнения. Например, */10 * * * * означает «раз в десять минут». Расширенный формат cron использует шесть полей с секундами. Например, */30 * * * * * означает «раз в тридцать секунд». Запланируем задание на выполнение раз в минуту:
Получим информацию о запланированном задании:
Функция get_job информирует о задании, возвращая значение типа cron_rec. Проверим поле rule, описывающее расписание, преобразовав расписание из представления JSONB в текстовые строки и урезав их по ширине:
Page 10: Page 10
Через минуту сработает первое задание. Подождем… Проверим, что было добавлено в таблицу t:
Функция timetable информирует о выполненных и запланированных заданиях. Получим список заданий за 5 минут:
Отчет о выполненных заданиях планировщика:
Управление периодическими заданиями
До сих пор задание выполнялось в ноль секунд каждой минуты:
Пусть задание выполняется чаще — раз в десять секунд. Используем расширенный формат cron из шести полей, где первое поле — секунды:
Проверим в rule: задание должно быть запланировано для исполнения с периодичностью раз в десять секунд.
Подождем немного… Проверим, что было добавлено в таблицу t:
Page 11: Page 11
Временно приостановим задание. Новые записи не будут попадать в таблицу.
Проверим состояние задания — оно должно быть не активно:
Подождем немного… Снова запустим задание и проверим состояние:
Подождем еще немного… Проверим записи в таблице t:
Выполненные задания отображаются в журнале:
Снова приостановим задание и очистим таблицу.
Page 12: Команды в отдельных транзакциях
В атрибуте commands значения могут задаваться в виде текста или массива. Если отдельные команды SQL заданы текстовой строкой через точку с запятой, то все команды задания будут выполнены в одной транзакции. Если команды SQL заданы JSON-массивом, то каждая из них будет выполнена в отдельной транзакции. Создадим задание для заполнения таблицы t раз в десять секунд. Каждая SQL-команда выполняется в отдельной транзакции. Значения now() для каждой транзакции — свои, как и идентификаторы транзакции.
Снова немного подождем…
Проверим, что было добавлено в таблицу:
Команды были выполнены одним обслуживающим процессом, но в отдельных транзакциях.
Команды в одной транзакции
Даже если команды заданы массивом, можно задать атрибуту use_same_transaction значение true, и все команды будут выполнены в одной транзакции. Удалим все записи в таблице.
В одной транзакции значения времени, которые возвращает функция now(), будут одинаковыми.
Page 13: Page 13
Подождем чуть-чуть… Удалим задание и проверим, что было добавлено в таблицу.
Все три оператора задания выполнились в одной транзакции. Снова очистим таблицу и запустим первое задание.
Page 14: Разовые задания
- работает независимо
- от периодических
- Выполнить задание
- немедленно
- в определенный момент
- после завершения других заданий
- Назначить повторное выполнение
- Отменить еще не выполняющееся задание
Комментарии преподавателя
Функция submit_job создает разовое задание. По умолчанию задание будет выполнено немедленно. Можно задать время запуска параметром run_after. Также можно в параметре depends_on передать массив идентификаторов других заданий — в этом случае данное задание будет выполнено сразу после их завершения.
Функция resubmit, вызванная в SQL-запросе задания, позволяет задать время следующего запуска этого задания.
Функция cancel_job отменяет задание. Если задание уже выполняется, оно не будет прервано, но повторно назначить его будет нельзя.
Получить список выполненных и запланированных заданий (как периодических, так и разовых) позволяет функция timetable.
Периодические и разовые задания выполняются в разных процессах, поэтому они могут работать параллельно.
Page 15: Разовые задания
Запланируем разовое задание, удаляющее через десять секунд таблицу t:
Таблица t пока на месте:
Подождем немного…
Таблица уже удалена. В таблице заданий выводится информация и о разовых заданиях:
Свойство onrollback периодического задания задает действия при сбое команды задания — будем восстанавливать таблицу, предполагая ее отсутствие:
Проверим состояние задания:
Page 16: Page 16
Подождем еще немного… Теперь таблица восстановлена и пока пуста:
Подождем еще… Теперь таблица уже не пуста:
Посмотрим список завершенных заданий:
Удалим запланированное задание:
Page 17: Page 17
Page 18: Итоги
Расширение pgpro\_scheduler позволяет планировать задания
- Задания выполняются либо периодически по расписанию, либо один раз в запланированное время
- Задания принадлежат пользователям и выполняются от их имени
- Каждое задание выполняется в отдельном процессе
- Имеются средства управления заданиями и их мониторинга
Page 19: Практика
1. Подготовьте систему к работе с расширениями pgpro\_scheduler и pg\_stat\_statements. 2. Установите расширения pgpro\_scheduler и pg\_stat\_statements в базу данных и настройте их.
- Запланируйте задание, собирающее статистику по наиболее часто выполняемым запросам каждые 20 секунд, а также разовое задание, копирующее набранную статистику в файл.
Комментарии преподавателя
Для установки расширений потребуется изменить значение параметра shared_preload_libraries и перезагрузить сервер.
Подключив расширения с помощью CREATE EXTENSION, настройте число рабочих процессов по аналогии с демонстрацией и запустите планировщик.
Для сбора статистики используйте расширение pg_stat_statements и таблицу с такой же структурой, как у представления pg_stat_statements, но с дополнительным полем, в которое будет записываться момент сбора статистики. Ограничьте время работы периодического задания одной минутой с помощью атрибута end_date в аргументе функции schedule.create_job.
Page 20: 1. Подготовка СУБД для работы с расширениями pgpro_scheduler и pg_stat_statements
Создадим базу данных pgpro_scheduler:
Подключим разделяемые библиотеки:
Общее ограничение на количество параллельных процессов:
Перезапустим СУБД.
2. Подключение расширений. Запуск планировщика
Установим расширения:
База данных для нагрузочного тестирования:
Применим изменения конфигурации:
Включим планировщик заданий:
Состояние процессов планировщика заданий:
Page 21: 3. Планирование задач
Создадим таблицу для сохранения выборок статистики:
Запланируем копирование статистики в таблицу stat_tab раз в 20 секунд, причем периодическое задание должно работать одну минуту:
Через минуту содержимое таблицы нужно скопировать в файл с помощью разового задания.
Подождем минуту… Проверим выполненные задания:
В таблице собраны сведения о наиболее частых запросах:
Page 22: Уборка
Разовое задание скопировало таблицу в файл:
Удалим созданную базу данных и файл, сбросим настройки параметров конфигурации.
Page 23: Практика PPEM
Эти задания используют планировщик PPEM, а не расширение pgpro_scheduler.
- Запланируйте выполнение очистки базы demo через одну-две минуты.
- Создайте задание для переиндексации таблиц в табличном пространстве pg_default базы demo и запланируйте его выполнение на регулярной основе каждый будний день в 20:00. 3. Убедитесь, что задание из п. 1 выполнено.
- Деактивируйте задание из п. 2.
Комментарии преподавателя
1, 2. Создавайте задания из панели «Базы данных».
3, 4. Используйте вкладку «Консоль заданий» в навигационной панели PPEM.
Page 24: 1. Однократное задание очистки базы данных
В навигационной панели выберите «Базы данных» и найдите базу demo экземпляра ent-16. В колонке «Действия» (крайняя справа) нажмите на пиктограмму «Очистить-Vacuum», и в открывшемся окне, в блоке «Планирование задачи», выберите «Отложенное по времени». Дайте новому заданию имя и назначьте время выполнения, после чего нажмите «Применить». В навигационной панели, во вкладке «Консоль заданий», выберите вложенную вкладку «Расписание» и убедитесь в наличии нового задания.
2. Переиндексация таблиц по расписанию
В навигационной панели откройте вкладку «Базы данных» и найдите базу demo. В колонке «Действия», в выпадающем меню (пиктограмма с тремя точками), выберите «Перестроить индексы-Reindex». В открывшемся окне выберите нужное табличное пространство, запланируйте задание по требуемому расписанию и нажмите «Применить».
3. Контроль списка заданий
Откройте «Консоль заданий» в навигационной панели, а затем вкладку «Задания». Проверьте, что созданное в п. 1 задание помечено статусом «Completed».
4. Деактивация задания
Во вкладке «Консоль заданий», в списке «Расписание» найдите задание, созданное в п. 2 и в колонке «Действия» нажмите пиктограмму «Деактивировать».