Chapter 2 Process and Memory Architecture
In this chapter, the process architecture and memory architecture in PostgreSQL are summarized to help to read the subsequent chapters. If you are already familiar with them, you may skip over this chapter.
PostgreSQL은 단일 호스트에서 실행되는 다중 프로세스 아키텍처를 갖춘 클라이언트/서버 형태의 관계형 데이터베이스 관리 시스템이다.
데이터베이스 클러스터를 협력하여 관리하는 여러 프로세스의 모음을 일반적으로 'PostgreSQL 서버'라고 한다.
프로세스의 종류는 아래와 같다.
replication? technology for copying and distributing data and database objects from one database to another and then synchronizing between databases to maintain consistency and integrity of the data.
아래 그림은 PostgreSQL 서버의 프로세스를 나타내고 있다.
하나의 server process, 두 개의 backend process, 7개의 background process, 그리고 두 개의 client process가 있음을 확인할 수 있다.
Postgres 서버 프로세스는 PostgreSQL 서버의 모든 프로세스의 부모이다.
다음과 같은 순서로 프로세스가 실행된다.
pg_ctl 유틸리티를 start 옵션과 함께 실행 -> postgres server proces 가동
메모리에 공유 메모리 영역 할당
여러 background process 가동
필요한 경우 replication-associated processes와 background worker process 시작
클라이언트의 연결 요청을 기다림
클라이언트로부터 연결 요청을 받으면 backend process를 시작
(해당 backend process가 그때마다 연결된 클라이언트가 요청하는 모든 쿼리를 처리한다.)
Server process가 사용하는 고유 네트워크 port#는 5432이다.
동일한 호스트에서 여러 PostgreSQL 서버를 실행할 수 있지만 각 서버는 다른 포트 번호로 수신 대기하도록 설정되어야 한다.
ex) 5432, 5433,,, etc
Backend process(=postgres process)는 하나의 연결된 클라이언트가 발행한 모든 쿼리 요청을 수행하는 프로세스이다. 클라이언트와 단일 TCP 연결로 통신하며 클라이언트와 통신이 끊기면 프로세스가 종료된다.
백엔드 프로세스는 하나의 DB에서만 작동하기 때문에 PostgreSQL 서버에 연결할 때 사용할 데이터베이스를 명시적으로 지정해야 한다.
max_connections : 클라이언트의 최대 수를 제어하는 설정 매개변수. 기본값은 100
백그라운드 프로세스의 기능은 PostgreSQL 내부에 의존하기 때문에 각 기능을 간단히 설명할 순 없으니 백그라운드 프로세스 목록을 참고하여 이해하는 것이 좋을 듯 하다. 자세한 설명은 후 챕터에서 이어진다.
실제 PostgreSQL 서버의 프로세스는 아래와 같다. 다음 예에서는 하나의 postgres 서버 프로세스(pid 9687), 두 개의 백엔드 프로세스(pid 9697, 9717), 그리고 여러 백그라운드 프로세스가 있다.
postgres> pstree -p 9687
-+= 00001 root /sbin/launchd
\-+- 09687 postgres /usr/local/pgsql/bin/postgres -D /usr/local/pgsql/data
|--= 09688 postgres postgres: logger process
|--= 09690 postgres postgres: checkpointer process
|--= 09691 postgres postgres: writer process
|--= 09692 postgres postgres: wal writer process
|--= 09693 postgres postgres: autovacuum launcher process
|--= 09694 postgres postgres: archiver process
|--= 09695 postgres postgres: stats collector process
|--= 09697 postgres postgres: postgres sampledb 192.168.1.100(54924) idle
\--= 09717 postgres postgres: postgres sampledb 192.168.1.100(54964) idle in transaction
PostgreSQL의 메모리 아키텍처는 크게 두 가지 범주로 나뉜다.
백엔드 프로세스는 쿼리 처리를 위해 로컬 메모리 영역을 할당한다.
이 메모리 영역은 여러 하위 영역으로 나뉘는데 영역의 크기는 고정될 수도 있고 가변적으로 변할 수도 있다.
다음 표는 주요 하위 영역 목록을 나타낸다.
공유 메모리 영역은 PostgreSQL 서버가 시작될 때 할당된다.
이 영역 또한 여러 고정 크기의 하위 영역으로 나뉘는데, 다음 표는 주요 하위 영역 목록을 나타낸다.
여기서 주목할 sub-area는 WAL buffer이다.
PostgreSQL은 서버 장애로 인한 데이터 손실을 방지하기 위해 WAL(Write-Ahead Logging) 메커니즘을 지원한다.
WAL data (혹은 XLOG 레코드)는 PostgreSQL의 트랜잭션 로그이다. WAL buffer은 지속적인 저장소(이하 DISK)에 쓰기 전의 WAL 데이터를 저장하는 버퍼링 영역이다.
WAL? 데이터의 무결성을 보장해주는 장치이다. 버퍼에 쌓인 데이터를 DISK에 flush하기 전에 버퍼에 담긴 log 내역을 먼저 log용 disk에 기입함으로써 잘못된 데이터가 disk에 저장되는 현상을 방지한다.
log와 data는 아래 그림과 같이 분리되어 있다.
공유 버퍼 풀, WAL 버퍼 및 커밋 로그 외에도 PostgreSQL은 다음과 같은 여러 영역을 할당한다.