[PostgreSQL] pg_cron

pg_cron์€ postgres ์ž์ฒด์—์„œ ์ผ์ • ๊ธฐ๋ฐ˜ ์Šค์ผ€์ค„๋Ÿฌ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ•๋ ฅํ•œ ํ™•์žฅ ๋„๊ตฌ๋‹ค.

์„œ๋น„์Šค์˜ ๊ทœ๋ชจ๊ฐ€ ๋Œ€๋‹จํ•œ๊ฒŒ ์•„๋‹ˆ๋ผ๋ฉด, ์Šค์ผ€์ค„๋Ÿฌ ์„œ๋ฒ„ ๋„์›Œ์„œ ๊ด€๋ฆฌํฌ์ธํŠธ ๋Š˜๋ฆฌ๋Š” ๊ฒƒ๋ณด๋‹จ, ์ด๊ฒŒ ํ›จ์”ฌ ๊ฐ„ํŽธํ•˜๊ณ  ๋น„์šฉ
ํšจ์œจ์ ์ผ ์ˆ˜ ์žˆ๋‹ค.




์„ค์น˜

๊ด€๋ฆฌํ˜• PostgreSQL์„ ์“ด๋‹ค๋ฉด pg_cron์ด ๊ธฐ๋ณธ์ ์œผ๋กœ ์„ค์น˜๋˜์–ด์žˆ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค. AWS์™€ GCP๋ฅผ ํฌํ•จํ•œ ์ƒ๋‹น์ˆ˜์˜ ํด๋ผ์šฐ๋“œ๋“ค์ด ์ด ์ •๋„๋Š” ๋‹ค ํ•ด์ค€๋‹ค.
๊ทธ๋Ÿฐ ๊ฒฝ์šฐ์—” ๋‹ค์Œ ์ ˆ์ฐจ๋ฅผ ๋‹ค ์ƒ๋žตํ•˜๊ณ  CREATE Extension๋งŒ ํ•ด๋„ ๋œ๋‹ค.

์ผ๋ฐ˜์ ์ธ ๋ฆฌ๋ˆ…์Šค ํ™˜๊ฒฝ์—์„œ๋Š” pg_cron ๋ชจ๋“ˆ์„ ์„ค์น˜ํ•˜๊ณ , ์„ค์ •๋„ ์กฐ๊ธˆ์€ ํ•ด์ค˜์•ผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

sudo apt-get -y install postgresql-16-cron

ํ˜„์žฌ ์‚ฌ์šฉ์ค‘์ธ psql ๋ฒ„์ „์— ๋งž๋Š” cron ๋ชจ๋“ˆ์„ ๋จผ์ € ์„ค์น˜ํ•œ๋‹ค.
psql ๋ฒ„์ „์ด ๋„ˆ๋ฌด ๋‚ฎ๋‹ค๋ฉด ์„ค์น˜ํ•˜๊ธฐ ๋งค์šฐ ๋ถˆํŽธํ•˜๊ฑฐ๋‚˜ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ๋‹ค.

ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €์—์„œ ๋ฒ„์ „์— ๋งž๋Š”๊ฑธ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, ์ง์ ‘ ๋ฐ›์•„์„œ ๋นŒ๋“œํ•ด์•ผ ํ•œ๋‹ค.

git clone https://github.com/citusdata/pg_cron.git
cd pg_cron
export PATH=/usr/pgsql-10/bin:$PATH
make && sudo PATH=$PATH make install

์„ค์น˜๊ฐ€ ์ž˜ ๋˜์—ˆ๋‹ค๋ฉด postgres ์„ค์ •ํŒŒ์ผ์„ ์ฐพ์•„์„œ ์—ด๊ณ 

๋‹ค์Œ 2์ค„์„ ์ถ”๊ฐ€ํ•œ ๋’ค์—

shared_preload_libraries = "pg_cron";
cron.database_name = "postgres";

๋ฆฌ์Šคํƒ€ํŠธ๋ฅผ ๋•Œ๋ฆฌ๋ฉด ๋œ๋‹ค.

sudo systemctl restart postgresql

๊ทธ๋ฆฌ๊ณ  psql์— ๋“ค์–ด๊ฐ€์„œ ํ™•์žฅ์„ ํ™œ์„ฑํ™”ํ•˜๋ฉด ๊ธฐ๋ณธ ์„ค์ •์€ ๋์ด๋‹ค.

CREATE EXTENSION pg_cron;




๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•

์ดˆ๊ธฐํ™”๊ฐ€ ์ž˜ ๋˜์—ˆ๋‹ค๋ฉด cron.job, cron.job_run_detail๊ณผ ๊ฐ™์€ ๊ธฐ๋ณธ ํ…Œ์ด๋ธ”๋“ค์ด ์ƒ์„ฑ์ด ๋  ๊ฒƒ์ด๋‹ค.

ํ•œ๋ฒˆ ํ…Œ์ด๋ธ” ํ•˜๋‚˜ ๋งŒ๋“ค๊ณ , ๊ฑฐ๊ธฐ์— 1๋ถ„๋งˆ๋‹ค ๋ฐ์ดํ„ฐ๋ฅผ ์ง‘์–ด๋„ฃ๋Š” cron์„ ์ •์˜ํ•ด๋ณด๊ฒ ๋‹ค.

create table cron_test (
  id serial primary key,
  time timestamp default now()
);

ํ…Œ์ด๋ธ”์€ ๋Œ€์ถฉ ๋งŒ๋“ค์—ˆ๊ณ 


SELECT cron.schedule(
  'test_cron_job',
  '* * * * *',
  $$INSERT INTO cron_test (time) VALUES (now());$$
);

์ด๋Ÿฐ ์‹์œผ๋กœ ์ •์˜ํ•˜๋ฉด ๋œ๋‹ค.
์ฒซ๋ฒˆ์งธ ์ธ์ž๊ฐ€ job ์ด๋ฆ„, ๋‘๋ฒˆ์งธ ์ธ์ž๊ฐ€ cron์‹, ์„ธ๋ฒˆ์งธ ์ธ์ž๊ฐ€ ์‹คํ–‰๋  ์ฟผ๋ฆฌ๋‹ค.


๊ทธ๋ ‡๊ฒŒ ์ƒ์„ฑํ•˜๋ฉด job ๋ชฉ๋ก์— ํ•ญ๋ชฉ์ด ์ถ”๊ฐ€๋œ๋‹ค.


๊ทธ๋ฆฌ๊ณ  ์ข€ ๊ธฐ๋‹ค๋ฆฌ๋ฉด ์˜๋„๋Œ€๋กœ ์Œ“์ด๋Š”๊ฑธ ๋ณผ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.




Connection Failed ๋ฌธ์ œ

ํด๋ผ์šฐ๋“œ๋ฅผ ์“ฐ์ง€ ์•Š๊ณ  ์ง์ ‘ ๊ตฌ์„ฑํ–ˆ๋Š”๋ฐ, ์ถ”๊ฐ€์ ์ธ ๋„คํŠธ์›Œํฌ ์„ค์ •์„ ํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด cron job๋“ค์ด ์ค„์ค„์ด ์‹คํŒจํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ํ™•๋ฅ ์ด ๋†’๋‹ค.

์ด๋ ‡๊ฒŒ ๋ง์ด๋‹ค.

pg_cron ํ™•์žฅ์€ ์ƒ๊ฐ๋ณด๋‹ค postgres ์ž์ฒด์™€ ๊ฐ•ํ•˜๊ฒŒ ๊ฒฐํ•ฉ๋˜์–ด์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค.
๋ณ„๋„์˜ ํ”„๋กœ์„ธ์Šค๋กœ ๋– ์„œ postgres์— TCP ์š”์ฒญ์„ ๋•Œ๋ฆฌ๋Š” ์‹์œผ๋กœ ๋™์ž‘ํ•˜๋Š”๋ฐ, ๊ทธ๋ž˜์„œ TCP ํ†ต์‹ ์„ ์œ„ํ•œ ๋ณด์•ˆ ์ˆ˜์ค€ ์„ค์ •์ด ํ•„์š”ํ•˜๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ๊ถŒ์žฅ๋˜๊ณ  ํŽธ๋ฆฌํ•œ ๋ฐฉ๋ฒ•์€, ๊ทธ๋ƒฅ ๋กœ์ปฌํ˜ธ์ŠคํŠธ ๋‚ด์—์„œ๋Š” ์ž์œ ๋กญ๊ฒŒ ํ†ต์‹ ์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ์—ด์–ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.
pb_hba.conf ํŒŒ์ผ์„ ์—ด์–ด์„œ trust๋กœ ํ—ˆ์šฉํ•ด์ฃผ๊ณ 

postgresql.conf์—๋„ ๋‹ค์Œ ํ•œ์ค„์„ ์ถ”๊ฐ€ํ•ด์ค€ ๋’ค์—

cron.host = "";

๋ฆฌ์Šคํƒ€ํŠธ๋ฅผ ๋•Œ๋ฆฌ๋ฉด ๋œ๋‹ค.

sudo systemctl restart postgresql


์ฐธ์กฐ
https://github.com/citusdata/pg_cron
https://github.com/citusdata/pg_cron/issues/48#issuecomment-386207327