PostgreSQL 9.6 성능이야기 - 1장. 아키텍처 개요

2021. 3. 20. 10:11카테고리 없음

공유 메모리 (Shared Memory)

1. Shared Buffer

2. WAL

프로세스

1. Postmaster (Daemon) 프로세스

가장 먼저 시작되어, 복구작업, Shared 메모리 초기화작업, Background 프로세스 구동 작업을 수행

클라이언트 프로세스 접속 요청이 있을 때 Backend 프로세스 생성

2. Background 프로세스

프로세스 명

수행하는 일

logger

에러 메시지를 로그 파일에 기록한다.

checkpointer

체크포인트 발생시, dirty 버퍼를 파일에 기록한다.

writer

주기적으로 dirty 버퍼를 파일에 기록한다.

wal writer

WAL 버퍼 내용을 WAL 파일에 기록한다.

autovacuum launcher

Vacuum이 필요한 시점에 autovacuum worker를 form 한다.

archiver

Archive log 모드일 때, WAL 파일을 지정된 디렉톨에 복사한다.

stats collector

세션 수행 정보(pg_stat_activity)와 테이블 사용 통계 정보(pg_stat_all_tables)와 같은 DBMS 사용 통계 정보를 수집한다.

3. Backend 프로세스

프로세스의 최대 개수: max_connections 파라미터 (default: 100)

사용자 프로세스의 쿼리 요청을 수행 후, 결과를 전송하는 역할

로컬 메모리: 쿼리 수행에 필요한 메모리 구조

파라미터 명

역할

work_mem 파라미터

정렬 작업, Bitmap 작업, 해시 조인과 Merge 조인 작업시에 사용되는 공간

(default: 4 Mb)

maintenance_work_mem 파라미터

Vacuum 및 CREATE INDEX 작업시 사용되는 공간

(default: 64 Mb)

temp_buffers 파라미터

Temporary 테이블을 저장하기 위한 공간

(default: 8 Mb)

4. Client 프로세스

데이터베이스 구조

데이터베이스 관련 사항

1. pg는 여러 개의 데이터베이스로 구성된다. 이를 데이터베이스 클러스터라고 한다.

2. initdb() 수행시 template0, template1, postgres 데이터베이스가 생성된다.

3. template0, template1 데이터베이스는 사용자 데이터베이스 생성을 위한 템플릿 데이터베이스이며, 시스템 카탈로그 테이블을 포함하고 있다.

select oid, datname, datistemplate, datallowconn from pg_database

데이터베이스 명

datistemplate

(템플릿 용도)

datallowconn

(데이터 접속가능 여부)

비고

template0

O

X

초기 상태 템플릿

template1

O

O

사용자 커스터마이징 가능한 템플릿

사용자가 필요한 오브젝트를 생성할 수 있다.

사용자 데이터베이스를 생성할 때는 template1 데이터베이스를 복제한다. 이점을 이용하면, 사용자 데이터베이스마다 특정한 오브젝트를 매번 생성하는 번거로움을 해결할 수 있다.

postgres

X

O

사용자 데이터베이스

테이블스페이스 관련 사항

1. initdb() 수행 직후에 pg_default, pg_global 테이블스페이스가 생성된다.

2. 테이블 생성시 테이블스페이스를 지정하지 않으면 pg_default에 저장된다.

3. 데이터베이스 클러스터 레벨에서 관리되는 테이블을 pg_global에 저장된다.

4. 1개의 테이블스페이스를 여러 개의 데이터베이스가 사용할 수 있다. 이 때, 테이블스페이스 디렉토리 내에 데이터베이스별 서브 디렉토리가 생성된다.

5. 사용자 테이블스페이스를 생성하면 $PGDATA/tblspc 디렉터리에 사용 사용자 테이블스페이스와 관련된 심볼릭 링크가 생성된다.

6. pg_default 의 물리적 위치는 $PGDATA/base 이다.

7. pg_global 의 물리적 위치는 $PGDATA/global 이다.

테이블 관련 사항

테이블 별로 3개의 파일이 존재한다. (인덱스의 경우 OID_vm을 제외한 2개)

설명

파일명

테이블

인덱스

테이블 데이터를 저장하기 위한 파일

테이블의 OID

O

O

테이블 여유 공간을 관리하기 위한 파일

OID_fsm

O

O

테이블 블록의 visibility를 관리하기 위한 파일

OID_vm)

O

X

* 테이블과 인덱스 생성 시점의 파일명은 OID이며, 이 시점에 OID와 pg_class.relfilenode의 값은 같다.

하지만 Rewrite 작업(Truncate, CLUSTER, Vacuum Full, REINDEX 등)이 수행되면, 영향받는 오브젝트의 relfilenode 값이 변경되고, 파일명 또한 relfilenode 값으로 변경된다.

pg_relation_filepath('<object명>') 명령을 통해 파일 위치 확인 가능