[시스템관리] pg_cron 과 crontab 을 이용한 스케쥴링

hyewon jeong·2024년 10월 4일
0

Data관련

목록 보기
4/4

🎈 1. 들어가기 앞서

프로젝트를 하며 spring 프레임 워크를 이용한 스케줄링은 해봤지만 서버 또는 디비에서 하는 방법을 시도 하게 되었다.

스케쥴링하는 방법은 다양하다.

  • Spring 프레임워크 스케줄링: @Scheduled 어노테이션을 사용해 애플리케이션 내에서 작업을 주기적으로 실행.

  • Crontab 서버 스케줄링: 쉘스크립트로 작업을 작성하고 crontab으로 서버에서 자동 실행.

  • pg_cron 데이터베이스 스케줄링: PostgreSQL의 pg_cron 확장을 이용해 DB 내 작업을 스케줄링.

📍 1-1. Spring 프레임워크 스케줄링

장점

  • 애플리케이션 내부에서 직접 설정 및 관리 가능
  • 트랜잭션 관리 , 의존성 주입 등 spring기능과 통합이 용이
  • 다양한 주기 설정 가능

단점

  • 애플리케이션이 실행 중일때만 스케쥴링 동작
  • 복잡한 시스템 스케쥴링에는 제한적

활용예

  • 주기적으로 외부 API를 호출해 데이터를 수집하거나 , 매일 자정에 사용자 데이터 보고서를 생성하는 작업을 자동화

📍 1-2. Crontab 서버 스케줄링

장점

  • 시스템 레벨에서 작동해 서버가 켜저 있는 한 독립적으로 실행가능
  • 다양한 시스템 명령어 및 스크립트 작업과 쉽게 연동
  • 설치 및 설정이 간단하고 유연함

단점

  • 서버 관리가 필요하며 , 에러 핸들링이나 복잡한 상태 관리는 제한적
  • 유지보수 및 모니터링을 위한 추가 설정이 필요

활용예

일정 주기로 오래된 데이터를 자동삭제 , 주간보고서 생성, 데이터 유지 관리 등의 작업

📍 1-3. pg_cron 데이터베이스 스케줄링

장점

  • 데이터베이스 내에서 직접 스케쥴링을 관리 , DB 작업을 최적화
  • 외부 스케줄러 없이 DB작업 자동화 가능
  • Sql 기반으로 쉽게 스케쥴링 설정

단점

  • pg_cron 을 지원하는 DB(postgreSql)에서만 사용가능
  • DB 리소스 사용이 증가할 수 있음

활용예

일정주기로 오래된 데이터 자동 삭제, 주간 보고서 생성, 데이터 유지관리 등의 작업

📍 1-4. 요약 하자면

Spring 스케줄링은 애플리케이션 내 간단한 작업 자동화에 적합.
Crontab은 시스템 작업에 유리하고, 독립적인 서버 관리에 최적.
pg_cron은 데이터베이스 중심의 작업 스케줄링에 최적화.

🎈 2. pg_cron

  • pg_cron dms postgrSql v10 이상 데이터베이스 내부에tj Extension으로 실행되는 간단한 cron 기반 작업 스케줄러이다.
  • 일반 corn과 동일한 구문을 사용하지만 데이터베이스에서 직접 postgreSql명령을 예약 할 수 있다는 장점이 있다.

[OpenSQL] pg_cron

🎈 3. Crontab

  • Crontab은 유닉스 기반 시스템에서 주기적으로 명령어나 스크립트를 실행할 수 있도록 하는 스케줄링 도구이다.
  • 쉽게 말해 '특정시간에 특정작업을 해야한다.'라고 했을때 윈도우에선 스케쥴링이 , 서버 리눅스에서는 크론탭을 사용한다고 볼 수 있다.

📍 3-1. crontab을 이용하기 위한 사전준비

특정시간에 특정작업을 해야한다.
1. 위의 특정작업에 대해 function 및 procedure 등 특정 작업에 호출할 수 있는 정의를 한다.

CREATE OR REPLACE PROCEDURE proc_del_data(IN retention_period character varying)
 LANGUAGE plpgsql
AS $procedure$
begin
	
-- INSERT 쿼리
    INSERT INTO tableA (sn, reg_dt, del_dt)
    SELECTsn, reg_dt,  NOW() AS del_dt
    FROM tableB
    WHERE reg_dt < date_trunc('day',NOW()) - (retention_period::integer * interval '1 month') - interval '1' day;

    -- DELETE 쿼리
    DELETE FROM tableA
    WHERE reg_dt < date_trunc('day',NOW()) - (retention_period::integer * interval '1 month') - interval '1' day;


EXCEPTION
    WHEN OTHERS THEN
        RAISE EXCEPTION 'procedure error occurred: %', SQLERRM;
END;
$procedure$
;
  1. putty 또는 MobaXterm 등을 이용해 원격으로 서버에 접속한다.

  1. 해당 프로시저를 호출할 쉘스크립트 명령어를 작성한 쉘스크립트 파일을 만든다.
  • 원하는 저장위치에 해당 폴더의 빈 쉘스크립트 파일을 먼저 생성한다.
touch /home/test/proc_del_data.sh
  • 만들어진 파일에 쉘스크립트 명령어를 작성한다.
nano  /home/test/proc_del_data.sh

  1. 크론탭을 이용하여 해당 쉘파일을 호출한 특정시간을 지정해준다.
crontab -e

하면 크론탭 설정된 목록들과 함께 편집할수 있다.
단축키 i 를 누르면 insert가 되어 원하는 크론탭 설정을 해주면 된다.

===== 작업리스트 구성 방식 ======
첫번째 필드 : 분 (0~59)
두번째 필드 : 시 (0~23)
세번째 필드 : 일 (0~31)
네번째 필드 : 월 (1~12)
다섯번째필드: 요일(0~7) // 0,7 = 일요일, 1 = 월요일
여섯번째필드: 실행할 명령

crontab -l // 예약된 작업리스트 출력
crontab -e // 예약된 작업 리스트 수정
crontab -r // 예약된 작업 리스트 목록 삭제 


리눅스 크론탭(Linux Crontab) 사용법

profile
개발자꿈나무

0개의 댓글