스케쥴러(Scheduler) 참조 안내서

DBMS_JOB, DBMS_SCHEDULER 패키지 사용을 위한 필수 프레임워크 o2 scheduler에 대한 스케쥴러(scheduler) 참조서입니다.

개요

  • o2scheduler는 dbms_job, dbms_scheduler가 내부에서 사용하는 job/schedule 프레임워크입니다.

  • dbms_job 및 dbms_scheduler 패키지 사용 전, 반드시 o2scheduler 설치 및 활성화 되어 있어야 합니다.

  • o2scheduler 설치 후 생성되는 테이블, 트리거 등 관련 객체는 직접 사용하지 않도록 합니다.

  • 모든 o2scheduler 관련 객체들은 o2scheduler 라는 스키마를 사용하며 해당 스키마 내부에 만들어집니다.

설치 설정

o2scheduler는 다른 o2 extension처럼 설치 후, 활성화 하기 전에 추가적으로 postgresql.conf 파일을 수정합니다. 또한, 해당 작업 후에는 반드시 postgresql 서버를 재기동하여 수정한 값을 적용시켜줘야 합니다.

shared_preload_libraries

postgresql.conf 파일 내용 중 shared_preload_libraries 항목의 값으로써 o2scheduler 를 추가하여, postgresql 기동될때 o2scheduler 구성파일이 같이 로드될 수 있도록 설정해줘야 합니다.

아래와 같이 postgresql.conf 파일을 수정합니다.

postgresql.conf 파일 내부 내용 중

...

#shared_preload_libraries = ''  # (change requires restart)  <= 이 라인을 아래와 같이 수정합니다.
shared_preload_libraries = 'o2scheduler'
(이때, 라인의 맨 앞 '#' 문자도 반드시 제거해줍니다.)

shared_preload_libraries는 사용자 환경에 따라 다른 extension들이 이미 추가되어 있을 수도 있습니다.

그러한 경우에는 , 를 활용하여 o2scheduler를 덧붙여줍니다.

max_worker_processes

postgresql.conf 파일 내용 중 max_worker_processes 항목의 값 수치를 적절하게 증가시켜서, job 기능이 원활하게 수행될 수 있도록 합니다.

o2scheduler는 PostgreSQL가 관리하는 Background 프로세스 기능을 적극적으로 활용합니다.

o2scheduler를 사용하는 데이터베이스 및 job의 갯수가 많아질수록 더욱 많은 Background 프로세스를 생성하게 됩니다.

따라서, job을 많이 등록하고 활용해야하는 환경을 고려한다면, postgresql.conf 파일을 수정하여 max_worker_processes 수치를 적절하게 조정해줘야 합니다.

아래와 같이 postgresql.conf 파일을 수정합니다.

max_worker_processes란?

  • 이 값은 동시 다발적으로 실행될 수 있는 최대 백그라운드 작업의 총 개수를 의미합니다.

  • 수치가 클수록 더 많은 컴퓨터 리소스를 소모하지만, 더 많은 작업을 동시에 처리할 수 있습니다.

  • 기본값인 8은 간단한 환경에서 충분할 수 있으나, 동시에 많은 job을 스케줄링 및 실행해야 하는 경우 부족할 수 있고 job 수행에 차질이 생길 수도 있습니다.

  • CPU 코어 수 이상으로 설정하는 것을 권장하며, CPU 코어 수 + 약간의 여유를 시작점으로서 조정 후 워크로드에 따라 모니터링 후 조정하는 것을 권장합니다.

  • 예를 들어, 8코어 서버에서 스케줄러가 동시에 최소 10개의 작업을 처리되는 것을 보장하고 싶다면, 8 (코어 개수) + 10 (스케줄러) + 2 (여유분) = 20 과 같이 설정하는 것을 고려해볼 수 있습니다.

  • 정확한 값은 시스템 환경과 워크로드 및 리소스 상태를 모니터링하며 조정하는 것이 필요합니다.

설치 설정 후 o2scheduler 활성화

postgresql에 접속하여 다음 명령어로 o2scheduler extension을 활성화를 합니다.

단, o2scheduler는 create extension을 수행한 데이터베이스에 대해서만 job 기능을 수행할 수 있습니다.

예를 들어, job 기능을 필요로 하는 데이터베이스가 A, B 두개가 있다면, 각각 두개의 데이터베이스로 따로 접속하여 개별로 create extension 명령어로 o2scheduler를 활성화 해주어야 합니다.

\dx 명령어를 활용하면 현재 접속한 데이터베이스의 o2scheduler 적용 여부를 확인할 수 있습니다.

메타 테이블

O2SCHEDULER를 설치하면, o2scheduler 라는 스키마가 생성되고 해당 스키마 내부에 실질적으로 JOB 데이터를 저장 및 관리하기 위한 메타 테이블을 생성합니다.

해당 테이블들에 직접 값을 수정 하거나 추가/삭제하는 행위는 권장하지 않으며, DBMS_JOB/DBMS_SCHEDULER 패키지를 통해 해당 테이블들에 값이 추가/변경되는 것을 확인 및 참고하는 용도로만 메타 테이블을 활용하도록 합니다.

O2SCHEDULER.JOB

JOB의 정보를 관리하는 메타 테이블입니다.

DBMS_JOB/DBMS_SCHEDULER 패키지에서 생성되는 JOB들이 해당 테이블에 저장되며, 각 패키지의 성격에 따라 JOB에 대해 추가적인 메타 정보 관리가 필요한 경우에는 각각 패키지가 추가로 정의한 별도 테이블에 관리됩니다.

즉, 해당 테이블은 DBMS_JOB/DBMS_SCHEDULER가 공통적으로 사용하는 JOB의 최소한의 필수 메타 정보만 관리합니다.

Column
Type
Nullable
Default Value
Description

ID

INTEGER

X (PK)

integer sequence

JOB의 식별번호이다.; 생성 시 1씩 증가합니다.

USERNAME

TEXT

O

JOB의 소유자입니다.

COMMAND_EXPR

TEXT

X

JOB이 수행할 작업의 내용입니다.

COMMAND_TYPE

TEXT

X

JOB이 수행할 작업의 유형입니다.

SCHEDULE_EXPR

TEXT

O

JOB의 다음 수행시각 계산식입니다.

SCHEDULE_TYPE

TEXT

O

JOB의 다음 수행시각 계산 유형입니다.

SCHEDULE_TIME

TEXT

O

JOB의 예정 수행시각이다; null일 경우 job을 실행하지 않습니다.

CREATED_AT

TIMESTAMPTZ

O

now()

JOB 생성 시각입니다.

UPDATED_AT

TIMESTAMPTZ

O

now()

JOB 갱신 시각입니다.

DELETED_AT

TIMESTAMPTZ

O

JOB 삭제 시각입니다; not null일 경우 실행하지 않습니다.

O2SCHEDULER.JOB_RUN_DETAILS

JOB들의 수행 이력을 기록하는 히스토리 테이블입니다.

DBMS_JOB/DBMS_SCHEDULER 패키지에서 생성된 JOB들이 수행되었을때 JOB의 성공/실패가 기록됩니다.

Column
Type
Nullable
Default value
Description

ID

INTEGER

X (PK)

integer sequence

JOB 수행의 식별번호이다; 생성 시 1씩 증가합니다.

JOB_ID

INTEGER

O

JOB의 식별번호이다.; JOB 테이블의 ID와 동일합니다.

WORKER_PID

INTEGER

O

JOB을 수행한 프로세스의 PID입니다.

USERNAME

TEXT

O

JOB을 수행한 사용자입니다.

STATUS

TEXT

O

JOB 수행 상태입니다.; success/failed/running

MESSAGE

TEXT

O

JOB 수행 후 추가 메세지입니다.

START_TIME

TEXT

O

JOB의 실제 수행 시작 시각입니다.

END_TIME

TEXT

O

JOB의 실제 수행 종료 시각입니다.

SCHEDULE_TIME

TEXT

O

JOB의 예정 되었었던 수행 시작 시각입니다.

DBMS_JOB.BROKEN_JOB

JOB이 실패한 횟수와 실패한 시간을 담은 테이블입니다.

Column
Type
Nullable
Default value
Description

JOB_ID

INTEGER

X

job의 id입니다.

FAILED_COUNT

INTEGER

X

JOB이 실패한 횟수입니다.

UPDATED_AT

TIMESTAMPTZ

X

마지막으로 작업이 실패한 시간입니다.

Last updated