본문 바로가기
IT

PostgreSQL 아키텍처 기본 개념 (PostgreSQL Architecture)

by 힁구띠 2022. 6. 16.

PostgreSQL Architecture 개념도

1. Shared Memory

1. WAL 버퍼

WAL 버퍼는 데이터베이스에 대한 여러 가지 변경 사항을 임시로 저장하는 버퍼이다. 버퍼에 저장된 내용은 정해진 시점에 WAL 파일로 기록되어 보관된다. 백업 및 복구 시점에서는 WAL 버퍼와 WAL 파일은 대단히 중요하다.

 

2. Shared 버퍼

Shared 버퍼는 디스크 IO를 최소화하는데 목적이 있다. 그러기 위해서는 아래 사항을 만족해야 한다.

  • 매우 큰 사이즈의 버퍼를 빠르게 access 해야 한다.
  • 많은 사용자가 동시에 접근할 경우 경합을 최소화시켜야 한다.
  • 자주 사용되는 블록은 최대한 오랜 기간 동안 버퍼에 저장되어 있어야 한다.

 

2. Process Type

프로세스간 관계 개념도

 

1. Postmaster 프로세스

가장 먼저 시작되는 프로세스이며, 초기 기동 시, 복구 작업, Shared 메모리 초기화 작업, 백그라운드 프로세스 구동 작업을 수행한다. 그리고 클라이언트 프로세스의 접근 요청이 있을 때 Back-end 프로세스를 생성한다.

pstree 명령어를 사용해 프로세스 간의 관계를 확인하면, Postmaster 프로세스가 모든 프로세스의 부모 격인 프로세스인 것을 확인할 수 있다.

 

2. Background 프로세스

  • logger: 에러 메시지를 로그 파일에 기록한다.
  • checkpointer: 체크포인트 발생 시, dirty 버퍼를 파일에 기록한다.
  • writer: 주기적으로 dirty 버퍼를 파일에 기록한다.
  • wal writer: WAL 버퍼 내용을 WAL 파일에 기록한다.
  • autovacuum launcher: Vacuum이 필요한 시점에 autovacuum worker를 fork 한다.
  • archiver: Archve log 모드일 때, WAL 파일을 지정된 디렉터리에 복사한다.
  • stats collector: 세션 수행 정보 (pg_stat_activiry)와 테이블 사용 통계 정보 (pg_stat_all_tables)와 같은 DBMS 사용 통계 정보를 수집한다.

3. Backend 프로세스

Backend 프로세스는 사용자 프로세스의 쿼리 요청을 수행한 후, 결과를 전송하는 역할이다. max_connections 파라미터로 최대 프로세스 개수를 설정하며 기본 설정값은 100이다. 그리고 쿼리 수행에 요구되는 메모리 구조를 로컬 메모리라고 하는데 주요 파라미터는 아래와 같다.

  • work_mem 파라미터: 정렬 작업, Bitmap 작업, 해시 조인 및 Merge 조인 작업 시 사용된다. (기본 설정: 4 MiB)
  • maintenance_work_mem 파라미터: Vacuum과 Create Index 작업 시에 사용되는 공간이다. (기본 설정: 64 MiB)
  • temp_buffers 파라미터: Temporary 테이블을 저장하기 위한 공간이다. (기본 설정: 8 MiB)

 

3. 데이터베이스 구조

 

1. 데이터베이스 참고 사항

  • PostgreSQL은 여러 개의 데이터베이스로 구성된다. (데이터베이스 클러스터)
  • 사용자 데이터베이스를 생성할 때, templated1 데이터베이스를 복제하여, 사용자 데이터베이스마다 특정한 오브젝트를 매번 생성하는 번거로움을 해결할 수 있다.
  • initdb() 수행 시에 template0, template1, postgres 데이터베이스가 생성된다.
  • template0과 template1 데이터베이스는 사용자 데이터베이스 생성을 위한 템플릿 데이터베이스이며 시스템 카탈로그 테이블을 포함하고 있다.
  • initdb() 수행 직후에 template0과 template1 데이터베이스의 테이블 목록은 같다. 단, template1 데이터베이스에는 사용자가 필요한 오브젝트가 생성할 수 있다.

2. 테이블스페이스 참고 사항

  • 사용자 테이블스페이스를 생성하면 &PGDATA/tblspc 디렉터리에 사용자 테이블 스페이스와 관련된 Symbolic 링크가 생성된다.
  • initdb() 수행 직후 pg_default, pg_global 테이블스페이스가 생성된다.
  • 테이블 생성 시 테이블스페이스를 지정하지 않는다면, pg_default 테이블스페이스에 저장된다.
  • 데이터베이스 클러스터 레벨에서 관리되는 테이블은 pg_global 테이블스페이스에 저장된다.
  • pg_default 테이블스페이스의 물리적 위치는 $PGDATA/base이다.
  • pg_global 테이블스페이스의 물리적 위치는 $PGDATA/global이다.
  • 1개의 테이블스페이스를 여러 개의 데이터베이스가 사용할 수 있다. 이때, 테이블스페이스 디렉터리 내에 데이터베이스 별 서브 디렉터리가 생성된다.

3. 테이블 참고 사항

  • 테이블 별 3개의 파일이 존재한다.
  • 파일명은 테이블의 OID이다. 테이블 데이터를 저장하기 위한 파일이다. 
  • 파일명은 OID_fsm이다. 여유 공간을 관리하기 위한 파일이다.
  • 파일명은 OID_vm이다. 테이블 블록의 visibiliry를 관리하기 위한 파일이다.
  • 인덱스는 _vm 파일이 없다. OID, OID_fsm 2개 파일로 구성된다.

* 테이블과 인덱스 생성 시점의 파일명은 OID이며 이 시점에 OID와 pg_class.relfilenode의 값은 같다. 하지만 Rewrite 작업 (Truncate, CLUSTER, VacuumFull, REINDEX 등)이 수행되면 영향받는 오브젝트의 relfilenode 값이 변경되고, 파일명 또한 relfilenode 값으로 변경된다. 참고로, pg_relation_filepath 명령어를 사용하면 파일 경로와 이름을 간단히 확인할 수 있다.

댓글