PostgreSQL Background Worker 解析

1. Background Worker 简介

PostgreSQL 提供了一种叫作后台工作进程(Background Worker)的特性,用来在独立的进程中执行用户提供的代码,入口函数可以是 pg 内核源码中的函数,也可以是动态库中的函数。这些后台工作进程被 postmaster 启动、停止和监控,他们的生命周期与 pg server 密切联系。

Background Worker 在创建时能够通过选项(flags)获取访问 pg 共享内存区域的能力,也能够以内部方式连接到 pg 数据库。它们可以执行事务和查询,就像是一个正常连接 pg 的客户端,另外通过 psql,他们能够连接其他 pg server,就像是一个普通的客户端应用程序。

2. Background Worker 启动

bg worker 可以在 pg 启动时,通过参数 shared_preload_libraries 初始化。在动态库的 _PG_init() 函数中调用 RegisterBackgroundWorker(BackgroundWorker *worker) 进行注册。

如果 pg 已经启动,此时可以通过 RegisterDynamicBackgroundWorker(BackgroundWorker *worker,BackgroundWorkerHandle **handle)函数进行启动。此方式可以在任何一个 backend 进程或者另外一个 background worker 中启动。

3. 数据结构 BackgroundWorker

结构体 BackgroundWorker 定义了一个 Background Worker 的基本信息,如下:

typedef struct BackgroundWorker { char bgw_name[BGW_MAXLEN]; char bgw_type[BGW_MAXLEN]; int bgw_flags; BgWorkerStartTime bgw_start_time; int bgw_restart_time; /* in seconds, or BGW_NEVER_RESTART */ char bgw_library_name[BGW_MAXLEN]; char bgw_function_name[BGW_MAXLEN]; Datum bgw_main_arg; char bgw_extra[BGW_EXTRALEN]; pid_t bgw_notify_pid; /* SIGUSR1 this backend on start/stop */ } BackgroundWorker;