본문 바로가기
엑셈 경쟁력/DB 인사이드

DB 인사이드 | PostgreSQL Architecture - 4. 동작 원리

by EXEM 2022. 4. 27.

 

 

본 문서에서는 PostgreSQL Architecture 전반에서 다룬 내용을 바탕으로 커넥션 생성 및 사용자요청처리, 백그라운드 Process의 동작 방식 등에 대한 내용을 다루겠습니다.

 

커넥션 생성 과정

우선 사용자가 PostgreSQL과 커넥션을 맺고 요청을 처리/회신하는 과정을 확인해보겠습니다.

1. postmaster 프로세스는 Listener 역할을 하며 Client로부터 새로운 연결 요청을 기다립니다.

2. postmaster 프로세스는 새로운 Client 연결 요청에 대한 인증을 하고 postgres 프로세스를 생성합니다. 이때 각각의 프로세스에는 work_mem 같은 Local Memory가 개별 할당됩니다.

3. postgres 프로세스가 Client와 연결되면 postmaster 프로세스는 Client와의 연결을 해제하며 Client는 postgres 프로세스에 SQL(Query string)를 전달합니다.

4. postgres 프로세스는 전달받은 Query를 수행한 후 Client에 결과를 반환합니다.

 

📌  Client와 연결이 해제된 postmaster 프로세스는 다른 Client의 연결 요청을 대기합니다. 새로운 연결 요청이 오면 그 연결에 대해 postgres 프로세스를 생성하고 Client와 연결을 해제하는 일을 반복합니다.

사용자 요청 처리 과정

postgres(Backend) 프로세스는 데이터를 읽고 쓸 때 Database Buffer 또는 RAM을 사용합니다. 사용할 메모리 사이즈는 postgresql.conf의 shared_buffers 파라미터에 의해 결정되며 서버가 시작될 때 할당됩니다.

 

사용자 요청은 크게 단순 읽기 작업(SELECT) 및 변경 작업(DML)으로 분류할 수 있습니다. 두 요청 모두 공통적으로 아래 3단계 과정을 거치며, 변경작업은 내부적으로 추가적인 과정(4단계)을 거치게 됩니다.

 

1. postgres 프로세스는 Database의 Shared Buffers에서 원하는 Data Block을 사용할 수 있는지 확인합니다.

2. Shared Buffers에서 찾을 수 없는 경우 OS로 요청합니다. OS Cache에 해당 Block이 존재한다면 해당 Block을 Shared Buffers로 전달할 가능성이 있습니다.

3. OS Cache 에도 Data가 없는 경우 디스크(Data 파일)에서 원하는 Block을 Shared Buffers로 캐싱합니다. 이때 물리적인 I/O가 발생합니다.

4. 사용자 요청이 변경 작업인 경우 변경은 Shared Buffer 안에서 이루어지며, 변경 Data(Dirty Data)및 변경 로그는 향후 일정 조건에 의해 Data 파일 및 WAL 파일로 동기화 됩니다.

 

프로세스 동작과정

변경 데이터의 저장

앞서 사용자 요청에 의해 변경된 데이터들은 모두 Shared Buffer에 적용된다고 이야기 했습니다. 이러한 변경 데이터들은 언젠가는 Disk 상에 적용되어야 하는데, 이러한 역할을 수행하는 프로세스가 바로 BG Writer와 Checkpointer입니다.

즉, 두 개의 Background 프로세스는 Dirty 상태의 Block을 Data 파일에 내려쓰는 동기화 작업을 수행하며, 각각의 프로세스는 아래와 같은 조건을 만족할 경우 동기화작업을 수행합니다.

  • BG Writer 프로세스는 정기적으로 일정량의 Dirty Block를 Data Files에 Write합니다.
  • Checkpointer 프로세스는 체크포인트 발생 시 모든 Dirty Block를 Data Files에 Write합니다.
📌  Oracle의 CKPT 프로세스는 DBWn 프로세스가 Dirty Buffer를 Data 파일에 내려 쓰도록 명령하는 역할만 수행하지만, PostgreSQL의 Checkpointer 프로세스는 Dirty Block을 직접 내려쓰는 역할까지 수행합니다.

Transaction Log의 관리

Checkpointer

앞서 설명한대로 Checkpointer 프로세스는 체크포인트 발생 시 Dirty Block을 Data 파일에 내려쓰는 역할 뿐만 아니라 해당 시점까지의 체크포인트 레코드를 파일에 기록하는 역할도 수행합니다.

  • 체크포인트 종료시점에 WAL Buffer에 체크포인트 시작시점의 LSN(시점정보)을 포함한 WAL 레코드를 추가합니다.
  • 마지막으로 완료된 체크포인트의 표시를 $PGDATA/global/pg_control 파일에 업데이트합니다.

시스템 다운과 같은 문제가 발생하는 경우, pg_control 파일에서 체크포인트 시작 위치를 확인하여 해당 위치부터 WAL 파일을 읽어 복구 작업을 수행합니다. 복구 작업 완료 후, Checkpointer 프로세스는 복구된 상태를 보호하기 위해 체크포인트를 즉시 수행합니다.

 

WAL Writer & Archiver

WAL Writer

WAL Writer 프로세스는 트랜잭션 Commit 시점 또는 WAL Buffers가 가득 차는 시점에 WAL Buffers의 내용을 디스크로 Flush합니다. 해당 WAL 파일은 Database를 복구하는데 사용됩니다.

Archiver

Archiver 프로세스는 WAL Segment가 전환될 때 해당 Data(WAL 파일)를 캡처하여 Archive 영역으로 복사(Archive 파일)합니다. Archive 파일을 이용하여 Database 전체 백업과 백업 후 특정 시점(PITR: Point-In-Time-Recovery)으로 복구할 수 있습니다.

 

 

 

 

기획 및 글 | 기술기획팀

이미지 편집 | 디자인그룹 이민석

 

 

 

 

 

 

 

 

 

댓글