DB/PostgreSQL

PostgreSQL 아키텍쳐 및 컴포넌트

peanutwalnut 2025. 7. 29. 22:01

 

 

postmaster와 postgres라고 하는server 프로세스를 통해 커넥션을 생성하여 사용자 요청을 받고 이러한 요청은 다양한 프로세스들에 의해 처리된다.

 

postmaster는 pg를 시작하는데 있어서 가장 먼저 시작되는 프로세스이다.

postmaster 프로세스는 shared memory 영역을 할당하며 다양한 백그라운드 프로세스를 시작한다.

이 프로세스는 client의 연결 요청을 대기하다가 client로부터 연결 요청이 생기면 client를 위한 여러 postgres 프로세스를 실행한다. 가장 상위 프로세스라고 생각하면 된다.

 

postgres는 백엔드 프로세스로 클라이언트가 요청한 sql 및 커맨드를 처리하는 프로세스이다.

postmaster 프로세스에 의해 시작되며 client 와는 1:1관계이다. max_connections 수치만큼 client가 동시에 연결될 수 있다.

커넥션 설정은 postgresql.conf에서 설정하면 된다.

 

pg를 가동하기 위해 여러 프로세스가 존재하는데 BG Writer와 WAL Writer 이라는 프로세스가 있다.

BG Writer는 shared buffer의 dirty block을 디스크에 기록하는 프로세스이다.

bgwriter_delay 주기로 bgwriter_lru_maxpages를 디스크에 기록한다.

주기적으로 bg writer가 dirty block을 디스크에 기록해두면, checkpoint 발생 시 flush 해야 하는 dirty block의 양을 줄일 수 있어 

안정적인 I/O를 유지할 수 있다.

 

WAL Writer는 wal buffer를 주기적으로 확인하여 기록되지 않은 모든 트랜잭션 레코드를 디스크에 기록하는 프로세스이다.

wal은 데이터파일의 수정이 이루어지기 전에 작성되는 파일이다. 

보통 db 복구에 사용된다.

 

Checkpointer

pg server다운 또는 충돌 등의 문제가 발생한 경우, 마지막 checkpoint 레코드를 확인하여 복구 작업을 시작한다.

이 체크포인트의 발생 조건은 아래오 ㅏ같다.

1. checkpoint_timeout의 시간이 지난 경우

2. wal 파일의 크기가 max_wal_size를 초과하는 경우

3. smart 또는 fast 모드로 db 서버를 종료하는 경우

4. pg_basebackup 또는 pg_start_backup으로 백업을 시작하는 경우

5. super 유저에 의해서 수동으로 checkpoint 커맨드가 실행된 경우

 

근데, 기록된 wal이 없으면 checkpoint_timeout을 초과해도 새로운 checkpoint가 발생하지 않는다.

내 기억으론 timeout의 기본 값은 5분이였던 것 같다.

 

Archiver

이름 그대로 archiving을 수행하는 프로세스.

archiving은 wal 세그먼트가 전환될 때 wal 파일을 archive 영역으로 복사하는 기능이며, 복사된 wal 파일을 archive 파일이라고 한다. 

archive 영역의 경로는 archive_command로 설정하며, 복사 대신 scp 명령이나 s3로 전송할 수 있다.

보통 PITR(Point In Time Recovery), 즉 db를 특정 시점의 특정 상태로 복원하는 데 사용된다.

 

Stats Collector

db 통계 정보를 수집하는 프로세스.

session 정보는 pg_stat_activity, 테이블 통계정보는 pg_stat_all_tables와 같은 통계를 수집하여

pg_catalog에 정보를 업데이트한다.

optimizer는 최적의 query 실행 계획을 생성하기 위해 해당 정보를 참조한다.

서버가 완전히 종료되면 통계 정보의 복사본이 pg_stat 하위 디렉토리에 저장되므로 서버를 다시 시작해도

통계가 유지될 수 있다.

 

Autovacuum Launcher

Autovacuum을 수행/관리하는 프로세스.

이게 필요한 이유는.. pg에서는 row를 update할 경우, 해당 row를 물리적으로 변경하지 않고 새로운 영역을 할당 받아 사용하기 때문에 이전의 row 공간들이 재사용되거나 사라지지 않는다. 이 영역을 정리해주는 작업이 vacuum이다. 

 

 

PG는 서버 시작 시 shared memory가 할당되며 여러 프로세스를 위한 local memory도 할당한다. 

shared memory란 data block 및 트랜잭션 로그와 같은 정보들을 캐싱하는 공간으로 pg의 모든 프로세스들에 의해 공유되는 영역이다. process, lock 등이 해당 영역에 위치한다.

위와는 별개로 backend process 별로 공유가 불가능한 local memory라는 영역도 존재하는데, 해당 영역은 sort, vacuum 등의

요청을 처리하기 위한 작업영역이다.

 

shared buffer

data와 data의 변경사항을 block 단위로 캐싱하여 i/o를 빠르게 처리하기 위한 영역이다.

여기에 기록되는 단위는 block_size (default 8k) 단위이다.

 

wal buffer

session들이 수행하는 트랜잭션에 대한 변경 로그를 캐싱하는 공간으로 복구 작업 시 data를 재구성할 수 있도록 하는 영역이다.

보통 shared buffer의 1/32와 같은 값으로 지정한다

 

Clog buffer ( commit log buffer )

각 트랜잭션의 상태(in_progress, committed, aborted ) 정보를 캐싱하는 공간. 

모든 트랜잭션의 상태가 있으며 완료 여부를 확인할 수 있도록 하는 영역.

 

Lock space

shared memory 영역 중 lock과 관련된 내용을 보관하는 영역으로 pg 인스턴스에서 사용하는 모든 유형의 lock 정보를 저장한다.

lock space에서 유지할 수 있는 lock의 수는 max_locks_per_transaction * (max_connections + max_prepared_transactions) 이다.