PostgreSQL技术内幕24:定时任务调度插件pg_cron

embedded/2025/2/5 10:44:23/

文章目录

    • 0.简介
    • 1.基础知识
    • 2.pg_cron安装使用方式
      • 2.1 安装pg_cron
      • 2.2 使用方式
    • 3.实现原理
      • 3.1 启动过程
      • 3.2 任务添加和管理
      • 3.3 调度过程
      • 3.4 执行原理

0.简介

pg_cron是PostgreSQL中的一个简单的基于cron的任务调度插件,本文将从其基础知识(Linux中Cron的语法)、pg_cron安装使用方式以及实现原理来对其进行详细的分析。

1.基础知识

理解pg_cron可以先去了解Linux系统中的Cron,其是一种用于自动执行预定任务的工具,Linux中Cron语法如下,pg_cron也是基于此来实现的。

#查看当前用户任务列表
crontab -l
#编辑任务列表
crontab -e
#语法,其时间部分包含五个或六个字段,分别是分钟、小时、日期、月份、星期和可选的年份。
#实际时间例子如下
* * * * *:每分钟运行一次任务。
0 * * * *:每小时的第0分钟运行一次任务。
0 0 * * *:每天的00:00(午夜)运行一次任务。
0 0 * * 1:每周一的00:00运行一次任务。
0 0 1 * *:每月1号的00:00运行一次任务。
#实际添加一个每天七点执行脚本run.sh格式如下,直接添加一行
0 7 * * * /path/run,sh

2.pg_cron安装使用方式

2.1 安装pg_cron

git clone https://github.com/citusdata/pg_cron.git
cd pg_cron
#其使用的是pg_config中的信息(编译选项,安装路径等)
make && make install#修改参数
postgres=# ALTER SYSTEM SET shared_preload_libraries TO pg_cron;
ALTER SYSTEM
postgres=# exit
#重启数据库
pg_ctl restart
#创建pg_cron插件
postgres=# CREATE EXTENSION pg_cron;
CREATE EXTENSION

2.2 使用方式

#添加任务,每分钟执行
postgres=# SELECT cron.schedule('* * * * *', 'select 1;');schedule
----------1
(1 row)#查看任务
postgres=# SELECT * FROM cron.job;jobid | schedule  |  command  | nodename  | nodeport | database | username | active | jobname
-------+-----------+-----------+-----------+----------+----------+----------+--------+---------1 | * * * * * | select 1; | localhost |     6688 | postgres | admin    | t      |
(1 row)#删除任务
postgres=#  SELECT cron.unschedule(1);unschedule
------------t
(1 row)#再次查看
postgres=# SELECT c* FROM cron.job;jobid | schedule | command | nodename | nodeport | database | username | active | jobname
-------+----------+---------+----------+----------+----------+----------+--------+---------
(0 rows)

3.实现原理

3.1 启动过程

启动过程需要理解的内容是如何去启动pg_cron,对于PG来说,其为多进程的架构,后台主进程是postmaster,在其启动是会调用process_shared_preload_libraries();函数去加载外部插件,对于插件加载过程包含了环境检查和主函数注册,主函数由插件中_PG_init()完成注册,函数从外部加载,由postmaster执行。

PG_init = (PG_init_t) pg_dlsym(file_scanner->handle, "_PG_init");
if (PG_init)(*PG_init) ();

对于pg_cron来说,_PG_init 函数对于主函数进行了注册:将 PgCronLauncherMain配置为一个后台 worker 并且注册到列表中。到这里系统回到了 postmaster 进程中继续执行任务,直到执行到 maybe_start_bgworkers() 函数,尝试将 workerlist 列表中的worker启动。(这个执行的过程还与数据库的模式有关,处于 standby mode 状态下的数据库不会去启动 pg_cron) postmaster 会分配一个 background work给pg_cron , 之后pg_cron 进程独立运行,进程如下。

在这里插入图片描述

3.2 任务添加和管理

pg_cron中,所有的定时任务都会被保存在cron.job表中,也就是在用法里描述操作的表。
pg_cron里维护了job list和task list来进行后台调度和任务的执行,其更新过程是在启动时根据cron.job表构造job list和task list,后面任务列表更新时通过触发器cron.job_cache_invalidate进行列表刷新,整体流程如下:

在这里插入图片描述

3.3 调度过程

其启动后会进入一个循环,其内部不断执行任务列表获取,是否执行判断(ShouldRunTask函数),其任务状态有以下几种,由于pg_cron是单线程的,所以在对于可能阻塞的步骤采用IO多路复用来处理,避免阻塞,使用的是Poll函数。
在这里插入图片描述

1)WAITING(等待):默认状态。如果条件不满足(非激活状态/计划时间还未到),则跳过该任务的调度,如果条件满足,则进入START状态。
2)START(启动):构建任务的连接信息,并进行连接测试。如果连接成功,则进入CONNECTING状态,否则进入ERROR状态。
3)CONNECTING(连接):检查任务是否激活,连接是否正常。如果所有条件都满足,则进入SENDING状态,否则进入ERROR状态。
4)SENDING(发送):检查任务是否激活,连接是否正常。如果所有条件满足,将定时任务文本发送至PolarDB PostgreSQL版服务器,进入RUNNING状态,否则进入ERROR状态。
5)RUNNING(运行):检查任务是否激活,连接是否正常。如果所有条件都满足,接收传回的任务结果并进入DONE状态,否则跳出等待进入ERROR状态。
6)ERROR(错误):任务失败,重置连接信息并进入DONE状态。
7)DONE(完成):任务完成,重置任务信息并重新进入WAITING状态。
其判断是否需要执行,也是根据设置,时间参数格式和linux中cron一致,如下:
在这里插入图片描述

3.4 执行原理

执行原理其实就是将待执行的文本发送给postmaster去做相应执行。


http://www.ppmy.cn/embedded/159723.html

相关文章

数据库课程设计使用Java+JDBC+MySQL+Swing实现的会议预约管理系统源代码+数据库

编码: GBK 开发环境 jdk12MySQL8.0 效果图 用户端 管理员端 完整代码下载地址:会议预约管理系统源代码数据库

蓝桥杯例题七

🌟 "没有人能定义你的天际线,除了你自己。 别把光芒寄托在别人的灯盏里,你的火种就藏在胸膛深处——哪怕此刻只是微弱的星点,也足够燎尽荒原。所谓奇迹,不过是凡人用不肯低头的倔强,在命运岩层上凿出的…

Qt跨屏窗口的一个Bug及解决方案

如果我们希望一个窗口覆盖用户的整个桌面,此时就要考虑用户有多个屏幕的场景(此窗口要横跨多个屏幕),由于每个屏幕的分辨率和缩放比例可能是不同的,Qt底层在为此窗口设置缩放比例(DevicePixelRatio&#xf…

在Ubuntu上使用Docker部署DeepSeek

在Ubuntu上使用Docker部署DeepSeek,并确保其可以访问公网网址进行对话,可以按照以下步骤进行: 一、安装Docker 更新Ubuntu的软件包索引: sudo apt-get update安装必要的软件包,这些软件包允许apt通过HTTPS使用存储库…

笔记day6

文章目录 1 复习:2 动态开发面包屑中的分类名3 动态开发面包屑中的关键字4 排序操作4.1 问题:order属性的属性值最多有多少种写法4.2 问题:谁应该有类名4.3 问题:谁应该有箭头4.4 问题:箭头用什么制作 1 复习&#xff…

《苍穹外卖》项目学习记录-Day7缓存套餐

如果使用EHCache作为缓存实现,只需要导入 EHCache的maven坐标。 入门案例 如果使用Spring cache缓存数据,key的生成:userCache::xxx。#user.id中的.叫做对象导航。 因为id是自增的所以只输入age和name就可以了,在插入完之后它会把…

详解Kafka并行计算架构

引言 在高流量的复杂场景下,Kafka 凭借卓越的性能表现脱颖而出,始终维持着极高的吞吐率和高效的消息消费能力,在众多消息队列产品中独树一帜。其稳定且强大的性能,不仅保障了海量数据的快速处理,还为各类业务的高效运行…

【cran Archive R包的安装方式】

cran Archive R包的安装方式 添加链接描述 1.包被cran移除 2.包要求的R语言版本与你电脑上的版本不相符 ad archive包的网址或者是下载到工作目录下,ad等于文件名 install,packages(ad repos NULL)