PG中文社区 /

PgSQL · 最佳实践 · pg_cron 内核分析及用法简介

原作者:阿里云PG内核组  创作时间:2020-08-25 15:36:17+08
wangliyun 发布于2020-08-26 08:00:00           评论: 3   浏览: 6262   顶: 517  踩: 586 

​pg_cron 是 PostgreSQL(9.5或更高版本)的一个简单的基于cron的作业调度程序,它作为扩展在数据库中运行。它与常规 cron 保持相同的语法,但它允许直接从数据库安排 PostgreSQL 命令。作为一个独立运行的工作者进程,其生命周期管理、内存空间都依赖于 postgreSQL 。本文主要从启动、生命周期、状态机、用法介绍该插件在 postgresQL 数据库中的应用。

postgresql 后台的主进程是 postmaster, 在其启动时,会调用一个函数processsharedpreload_libraries(); 这个函数被 postgresql 用来预加载外部插件。该函数会遍历参数列表,然后对列表参数中的插件依次进行加载。对于插件来说加载的过程包括了除了检查环境 和 注册主函数,主函数由插件中的 _PG_init() 完成注册,这个函数从外部环境中 加载进来,被postmaster执行(类似 Python 的反射)。

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

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

pg_cron 生命周期

pgcron 插件的主体是围绕 PGCRONTASK 进行,从内部来说, PGCRONTASK 有自己的生命周期,其生命周期的轮转过程就是插件的运行过程,从外部来说 PGCRONTASK 与 PGCRON_JOB 通信取得当前的任务列表,在运行状态与 POSTMASTER 通信 完成定时任务的运行。

CENTER_PostgreSQL_Community

图 1 pgcrontask 示意图

pgcron 生命周期中涉及到的主要涉及环境信息 如 图2 所示,主要分为三类:即状态检查信息、标志位返回信息 和 错误返回信息 。而pgcron 的生命周期的状态转移就由这些信息控制。状态转移状态一般来说也分为三类:状态等待中,正常执行进入下一个状态,错误信息返回。进程从 CRONTASKWAITING 开始,依次进入每一个对应的状态,最后流转到 CRONTASKDONE 和 CRONTASKERROR 中的一个。最后这些状态信息被重置,pg_cron 进入下一个生命周期。

CENTER_PostgreSQL_Community

图 2 pgcrontask 生命周期

pg_cron 通信状态机

pg_cron 是单进程单线程运行插件,由 postmaster 进程启动, 属于其子进程。在执行多任务的进程中,采用了 生命周期流转 和 多路 IO复用来 模拟了多任务的并行处理,下面介绍该机制。

pgcron 模拟了一个生命周期队列(如图2所示)来维护所有的任务状态,每个任务都由以下状态组成:等待、开始、连接、发送、运行、接收、完成、错误。其中,大部分状态被认为不会IO阻塞(例如等待状态、开始状态),但是有一些进程可能会由于 socket 阻塞 (例如 连接、发送、运行 )。pgcron 使用了poll 函数 完成 IO复用。该过程如图3 所示,由于可能的网络时延、任务执行时间不确定,这些任务的并发状况是未知的,而poll函数便是遍历文件句柄, 接收到 IO 数据后会更新文件句柄,唤醒进程进行 IO ,从而避免了 IO 阻塞。当IO结束后 任务接受一个标志位 任务完成或 任务失败,结束本次生命周期。

CENTER_PostgreSQL_Community

图3 pgcrontask 多路IO复用模型

pg_cron 用法手册

每一个定时任务分为两部分: 定时计划 和 定时任务。定时计划规定了用户 使用 插件的计划(例如:每隔1分钟执行一次该任务),定时任务是用户具体的任务内容(例如:select * from some_table)

普通用户一共有三个可选函数:增加任务项、删除任务项、查看当前任务项。

增加任务项

-- 周六3:30am (GMT) 删除过期数据 
SELECT cron.schedule('30 3 * * 6', $$DELETE FROM events WHERE event_time < now() - interval '1 week'$$);
 schedule
----------
       42
​
-- 每天的 10:00am (GMT) 执行磁盘清理
SELECT cron.schedule('0 10 * * *', 'VACUUM');
 schedule
----------
       43
​
-- 每分钟执行 指定脚本
SELECT cron.schedule('* * * * *', 'select 1;');
 schedule
----------
44
​
-- 每个小时的 23分 执行 指定脚本
SELECT cron.schedule('23 * * * *', 'select 1;');
 schedule
----------
45
​
-- 每个月的 4号 执行 指定脚本
SELECT cron.schedule('* * 4 * *', 'select 1;');
 schedule
----------
46

pg_cron 计划使用标准的 cron 语法,其中 * 表示“每个该时间运行”,特定数字表示“仅在 这个数字时 运行”

┌───────────── 分钟 (0 - 59)
 │ ┌────────────── 小时 (0 - 23)
 │ │ ┌─────────────── 日期 (1 - 31)
 │ │ │ ┌──────────────── 月份 (1 - 12)
 │ │ │ │ ┌───────────────── 一周中的某一天 (0 - 6) (0 到 6 表示周末到下周六,
 │ │ │ │ │                   7 仍然是周末)
 │ │ │ │ │
 │ │ │ │ │
* * * * *

删除任务项

-- 停止、删除一个任务
SELECT cron.unschedule(42);
 unschedule
------------
          t

查看当前任务

SELECT * FROM cron.job;
​
 jobid | schedule   |  command  | nodename  | nodeport | database | username | active 
-------+------------+-----------+-----------+----------+----------+----------+--------
    43 | 0 10 * * * |   VACUUM; | localhost |     5433 | postgres | test     | t

CENTER_PostgreSQL_Community


评论:3   浏览: 6262                   顶: 517  踩: 586 

请在登录后发表评论,否则无法保存。

1# __ xcvxcvsdf 回答于 2024-11-21 16:30:06+08
https://fenlei.tiancebbs.cn/qingdao/ http://cf.lstcxxw.cn/tjnh/ https://xiamenzhoubian.tiancebbs.cn/ http://ly.shtcxxw.cn/chongqing/ https://gangba.tiancebbs.cn/ https://shangjuzhen.tiancebbs.cn/ http://bjtcxxw.cn/dgcz/ https://honglan.tiancebbs.cn/lijiang/ http://ouyu.hftcbmw.cn/ycqzw/ http://gx.lztcxxw.cn/hgqza/ http://bjtcxxw.cn/yndl/ http://jinqiang.ahtcbmw.cn/ylx/ https://conghua.tiancebbs.cn/ http://gx.lztcxxw.cn/gxhc/ https://xiaoguan.tiancebbs.cn/ http://ruanwen.xztcxxw.cn/sdwf/ http://yz.cqtcxxw.cn/ahbb/

2# __ xcvxcvsdf 回答于 2024-10-22 16:07:47+08
https://zulin.tiancebbs.cn/sh/4002.html https://taicang.tiancebbs.cn/hjzl/456800.html https://zulin.tiancebbs.cn/sh/1302.html https://shannan.tiancebbs.cn/qths/469058.html https://zulin.tiancebbs.cn/sh/115.html https://zulin.tiancebbs.cn/sh/3680.html https://zulin.tiancebbs.cn/sh/4191.html https://changshushi.tiancebbs.cn/hjzl/464065.html https://www.tiancebbs.cn/ershouwang/473464.html https://taicang.tiancebbs.cn/hjzl/465175.html https://zulin.tiancebbs.cn/sh/4595.html https://wn.tiancebbs.cn/qths/459365.html https://gling.tiancebbs.cn/qths/470836.html https://zulin.tiancebbs.cn/sh/3713.html https://guangning.tiancebbs.cn/qths/463117.html https://aihuishou.tiancebbs.cn/sh/989.html https://aihuishou.tiancebbs.cn/sh/2922.html

3# __ xiaowu 回答于 2024-04-24 10:46:40+08
公共场所礼仪:https://www.nanss.com/shenghuo/20601.html 领导班子述职述廉报告:https://www.nanss.com/gongzuo/19743.html 项目可行性报告:https://www.nanss.com/gongzuo/20173.html 玉容寂寞泪阑干:https://www.nanss.com/xuexi/20522.html 加薪申请:https://www.nanss.com/gongzuo/20289.html 红磷燃烧的现象:https://www.nanss.com/xuexi/18375.html 厨房是个音乐厅写一小段话:https://www.nanss.com/xuexi/20498.html 小学心理健康课教案:https://www.nanss.com/gongzuo/20123.html 关于风景的作文:https://www.nanss.com/xuexi/20613.html 新年作文600字:https://www.nanss.com/xuexi/20721.html 民主评议党员登记表个人总结:https://www.nanss.com/gongzuo/20358.html 小区十大冷门暴利生意:https://www.nanss.com/shenghuo/20661.html 厂房风水:https://www.nanss.com/jiaju/20611.html 龙凤胎取名:https://www.nanss.com/mingcheng/20580.html 改名字申请:https://www.nanss.com/shenghuo/20518.html 国际象棋的规则:https://www.nanss.com/shenghuo/20646.html 卫生间防水材料:https://www.nanss.com/shenghuo/20417.html 土建工程师岗位职责:https://www.nanss.com/gongzuo/20556.html 美术教学总结:https://www.nanss.com/gongzuo/20635.html 老鸭汤做法:https://www.nanss.com/yinshi/18326.html 皮衣怎么洗:https://www.nanss.com/wenti/20462.html 开个不愁销路的小厂:https://www.nanss.com/shenghuo/20689.html 雪豹和她的朋友们观后感:https://www.nanss.com/xuexi/20583.html 奖励办法:https://www.nanss.com/gongzuo/18698.html 游戏帮会名字:https://www.nanss.com/mingcheng/20528.html 银杏树的特点:https://www.nanss.com/shenghuo/18979.html 招商引资工作方案:https://www.nanss.com/gongzuo/20313.html 感恩节是几月几日:https://www.nanss.com/shenghuo/19866.html 茶叶种类:https://www.nanss.com/shenghuo/20642.html 我的书架:https://www.nanss.com/xuexi/20489.html



发表评论:
加入我们
QQ群1:5276420
QQ群2:3336901
QQ群3:254622631
文档群:150657323
文档翻译平台:按此访问
社区邮件列表:按此订阅
扫码关注
© PostgreSQL中文社区 ... (自2010年起)