F.37. pg_cron#

F.37. pg_cron

F.37. pg_cron

F.37.1. О расширении pg_cron

Версия: 1.6.2

Страница проекта www.citusdata.com

GitHub

Copyright © Citus Data, Inc.

F.37.2. Что такое pg_cron?

pg_cron - это простой планировщик заданий на основе cron для Tantor SE который работает внутри базы данных в качестве расширения. Он использует ту же синтаксическую конструкцию, что и обычный cron, но позволяет вам планировать Tantor SE команды непосредственно из базы данных:

-- Delete old data on Saturday at 3:30am (GMT)
SELECT cron.schedule('30 3 * * 6', $$DELETE FROM events WHERE event_time < now() - interval '1 week'$$);
 schedule
----------
       42

-- Vacuum every day at 10:00am (GMT)
SELECT cron.schedule('nightly-vacuum', '0 10 * * *', 'VACUUM');
 schedule
----------
       43

-- Change to vacuum at 3:00am (GMT)
SELECT cron.schedule('nightly-vacuum', '0 3 * * *', 'VACUUM');
 schedule
----------
       43

-- Stop scheduling jobs
SELECT cron.unschedule('nightly-vacuum' );
 unschedule 
------------
 t
(1 row)

SELECT cron.unschedule(42);
 unschedule
------------
          t

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

Расписание использует стандартный синтаксис cron, в котором * означает запускать каждый период времени, а конкретное число означает но только в это время:

 ┌───────────── min (0 - 59)
 │ ┌────────────── hour (0 - 23)
 │ │ ┌─────────────── day of month (1 - 31)
 │ │ │ ┌──────────────── month (1 - 12)
 │ │ │ │ ┌───────────────── day of week (0 - 6) (0 to 6 are Sunday to
 │ │ │ │ │                  Saturday, or use names; 7 is also Sunday)
 │ │ │ │ │
 │ │ │ │ │
 * * * * *

Код в pg_cron, который обрабатывает разбор и планирование, взят непосредственно из исходного кода cron Пола Викси, поэтому поддерживаются те же параметры.

F.37.3. Настройка pg_cron

Чтобы запустить фоновый рабочий процесс pg_cron, когда Tantor SE начинается, вам нужно добавить pg_cron в shared_preload_libraries в postgresql.conf. Обратите внимание, что pg_cron не выполняет задания, пока сервер находится в режиме горячего резервирования, но автоматически запускается при повышении сервера.

# add to postgresql.conf

# required to load pg_cron background worker on start-up
shared_preload_libraries = 'pg_cron'

По умолчанию фоновый рабочий процесс pg_cron ожидает, что его метаданные таблицы будут созданы в базе данных postgres. Однако, вы можете настроить это, установив параметр конфигурации cron.database_name в файле postgresql.conf.

# add to postgresql.conf

# optionally, specify the database in which the pg_cron background worker should run (defaults to postgres) 
cron.database_name = 'postgres'

После перезапуска Tantor SE , вы можете создать функции pg_cron и метаданные таблиц, используя CREATE EXTENSION pg_cron.

-- run as superuser:
CREATE EXTENSION pg_cron;

-- optionally, grant usage to regular users:
GRANT USAGE ON SCHEMA cron TO marco;

Важно По умолчанию pg_cron использует libpq для открытия нового соединения с локальной базой данных, что требует разрешения в файле pg_hba.conf. Может потребоваться включить аутентификацию trust для соединений, поступающих с localhost, для пользователя, выполняющего задание cron, или вы можете добавить пароль в файл .pgpass, который будет использоваться libpq при открытии соединения.

В качестве альтернативы, pg_cron может быть настроен для использования фоновых рабочих процессов. В этом случае количество одновременных заданий ограничено параметром max_worker_processes, поэтому вам может потребоваться его увеличить.

# Schedule jobs via background workers instead of localhost connections
cron.use_background_workers = on
# Increase the number of available background workers from the default of 8
max_worker_processes = 20

Вы также можете использовать каталог unix-домена в качестве имени хоста и включить аутентификацию trust для локальных соединений в файле pg_hba.conf, что обычно безопасно.

# Connect via a unix domain socket
cron.host = '/tmp'

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

pg_cron может быть установлен только в одну базу данных в кластере. Если необходимо запускать задания в нескольких базах данных, используйте cron.schedule_in_database().

Ранее pg_cron мог использовать только время по Гринвичу, но теперь вы можете адаптировать ваше время, установив cron.timezone в postgresql.conf.

# add to postgresql.conf
# optionally, specify the timezone in which the pg_cron background worker should run (defaults to GMT). E.g:
cron.timezone = 'PRC'