pg_partman으로 파티셔닝하기

신현기·2022년 8월 10일
0
post-thumbnail

pg_partman

postgresql 12.5 이상에서 지원된다.

파티션은 partman의 run_maintenance_proc 함수를 사용해 분할하고
pg_cron의 schedule 함수를 사용해 스케줄러 작업을 등록한다.

파티션 나누기

1. partman 생성

partman schema를 생성하고 스키마에 pg_partman extension을 생성한다.
partman extension은 super user만 가능하다.
스키마는 데이터베이스 마다 개별적으로 생성해야한다.

create schema partman;
create extention pg_partman with schema partman;

2. 파티션 구성

파티션 구성은 partman의 create_parent 함수를 이용해 구성한다.
파티션을 구성할땐 상위 분할 테이블이 존재해야하고, 분할 기준 컬럼은 정수, 시간 기반이어야한다.
분할 기준 컬럼은 index가 생성되어있는 것이 좋다.

select partman.create_parent(
  p_parent_table => 'public.xxxx',
  p_control => 'xxx'
  p_type => 'xxx',
  p_interval => 'xxx'
  p_premmake => xx
);

p_parent_table : 파티션을 생성할 부모 테이블
p_control : 파티션 생성시 기준이 될 컬럼명
p_type : 파티셔닝 타입
- native : 기본 설정, native type 사용이 강력하게 추천된다.
- partman : 트리거 베이스의 파티셔닝, pg_partman의 함수를 사용하는 방식이다.
p_interval : 각 파티션의 범위
p_premake : 미리 생성해둘 파티션의 갯수. 기본값은 4. 현재 날짜 기준으로 파티션이 생성된다.

파티션 유지/관리

각 파티션을 유지/관리할때 pg_cron의 스케쥴러를 사용한다.
사용하기 전 rds 파라미터 그룹의 shared_preload_library 키값에 pg_cron을 추가해야한다.
(postgresql.conf 파일 수정으로도 가능하다.)
적용하려면 인스턴스를 재시작해야한다.

기본적으로 pg_cron의 메타 데이터는 postgres DB에 저장된다.
모든 예약작업 또한 postgres에서 실행된다.
변경하고싶다면 rds 인스턴스 파라미터 그룹의 cron.database_name의 키값을 수정하면 된다.

1. pg_cron extension 생성

pg_cron의 메타 데이터를 저장할 postgres DB에서 extension을 생성한다.
생성은 super user만 가능하다.

create extension pg_cron;

2. partman.part_config 설정

파티셔닝을 할 각 테이블에 대해 part_config를 설정해야한다.

update partman.part_config
   set infinite_time_partitions = true,
       retention = '3 months',
       retention_keep_table = false
 where parent_table = 'public.xxxx'; 

infinite_time_partitions : 제한 없이 자동으로 새 파티션을 만들 수 있도록 테이블을 구성한다.
retention : 최대 보존 기간을 설정한다.
retention_keep_table : 보존기간 만료 시 테이블을 자동삭제할지를 설정한다. true로 설정 시 보존하고 부모 테이블에서만 분리한다.
parent_table : 위 설정들이 적용될 부모 테이블을 설정한다.

3. cron 스케줄러 설정

pg_cron extension을 설정한 postgres DB에 스케줄을 등록시켜야한다.

select cron.schedule (
	job_name,
    schedule,
    command
);

job_name : 등록할 스케줄의 이름을 설정한다. (이 파라미터는 없어도 된다.)
schedule : 이 스케줄이 실행될 시간을 설정한다.
(@monthly, @yearly 등으로도 설정 가능)

 ┌───────────── min (0 - 59)
 │ ┌────────────── hour (0 - 23)
 │ │ ┌─────────────── day of month (1 - 31)
 │ │ │ ┌──────────────── month (1 - 12)
 │ │ │ │ ┌───────────────── day of week (0 - 6) (0 to 6 are Sunday to
 │ │ │ │ │                  Saturday, or use names; 7 is also Sunday)
 │ │ │ │ │
 │ │ │ │ │
 * * * * *

command : 설정된 시간마다 실행될 명령어를 설정한다.
(파티셔닝의 경우 : $$ call partman.run_maintenance_proc() $$)

설정 후 파티셔닝이 실행되어야 할 database를 업데이트 해줘야 한다.

select * from cron.job -- cron에 등록되어있는 작업 목록을 조회한다.
update cron.job set "database" = 'database' where jobid = 1; -- 조회 후 해당 jobid를 업데이트한다.

스케줄러가 실행된 이력을 확인하고 싶다면 cron.job_run_details 테이블을 확인하면 된다.

select * from cron.job_run_details;
profile
구르는거 좋아하는 개발자

0개의 댓글