PostgreSQL 아키텍처 심층 분석
1️⃣ PostgreSQL의 내부 구조
1. 프로세스 모델
PostgreSQL은 멀티 프로세스 기반 아키텍처를 사용하며, 주요 프로세스는 다음과 같습니다.
- Postmaster (Master Process): 클라이언트 연결을 관리하고 새로운 백엔드 프로세스를 생성하는 역할 수행
- Backend Process: 각 클라이언트 연결마다 생성되며 SQL을 실행
- Background Worker: 자동 백업, 통계 수집 등의 작업 수행
- Autovacuum Process: 불필요한 데이터를 정리하고 성능 최적화 수행
📌 PostgreSQL 프로세스 구조
+-------------------+
| Client Process |
+-------------------+
|
v
+-------------------+
| Postmaster |
+-------------------+
|
v
+-----------------------+
| Backend Processes |
+-----------------------+
2. 데이터 저장 구조
PostgreSQL에서 데이터가 저장되는 방식은 Page(블록) 단위 저장을 기반으로 합니다.
- Page (8KB 단위 블록): 모든 데이터가 저장되는 기본 단위
- Tuple (Row 단위 데이터): 한 개의 행 데이터를 의미하며, MVCC를 지원하기 위해 여러 버전이 저장될 수 있음
- Heap (Heap Storage): 테이블의 기본 저장 구조
- TOAST (Oversized Attributes Storage): 긴 문자열이나 바이너리 데이터를 저장하기 위한 별도 저장 구조
📌 Heap Storage 구조 예시
+-----------------+
| Heap Page 1 |
| ---------------|
| Tuple 1 |
| Tuple 2 |
+-----------------+
| Heap Page 2 |
| ---------------|
| Tuple 3 |
+-----------------+
3. WAL (Write-Ahead Logging) 개념 및 작동 방식
WAL은 데이터 무결성 보장을 위해 PostgreSQL에서 사용되는 로깅 시스템입니다.
- 모든 변경 사항을 WAL 로그에 기록 후 실제 데이터 페이지 수정 진행
- 장애 발생 시 WAL 로그를 통해 복구 가능
pg_wal/
디렉토리에 WAL 파일 저장됨
📌 WAL 프로세스 흐름
SQL 실행 → 변경 사항을 WAL에 기록 → 실제 데이터 페이지 반영
💡 WAL 설정 조정
SHOW wal_level;
ALTER SYSTEM SET wal_level = 'replica';
4. MVCC (Multi-Version Concurrency Control) 메커니즘
MVCC는 PostgreSQL이 동시성을 관리하는 방식으로, 트랜잭션 간 충돌을 방지하는 역할을 합니다.
- 각 트랜잭션은 실행 시점의 데이터 스냅샷을 사용
- 업데이트 및 삭제 시 기존 데이터를 삭제하지 않고 새로운 버전을 생성
📌 MVCC 예시
INSERT INTO users VALUES (1, 'Alice'); -- Transaction 1 (Version 1)
UPDATE users SET name = 'Bob' WHERE id = 1; -- Transaction 2 (Version 2)
5. Checkpoint 및 Background Writer 역할
Checkpoint는 WAL 파일을 주기적으로 디스크에 기록하는 작업을 의미합니다.
- Background Writer: 데이터 변경을 디스크에 플러시하는 역할
- Checkpoint Process: WAL 로그를 디스크에 적용하여 복구 성능을 향상
💡 Checkpoint 주기 설정 조정
SHOW checkpoint_timeout;
ALTER SYSTEM SET checkpoint_timeout = '15min';
2️⃣ PostgreSQL 메모리 관리
1. Shared Buffers, Work Mem, Maintenance Work Mem 조정
PostgreSQL의 메모리 구조는 Shared Buffers(공유 메모리), Work Memory(작업 메모리) 등으로 구성됩니다.
- Shared Buffers: 자주 사용하는 데이터를 캐싱하여 성능 향상 (
shared_buffers
) - Work Mem: 정렬, 해시 조인을 수행할 때 사용되는 메모리 (
work_mem
) - Maintenance Work Mem: VACUUM, CREATE INDEX 같은 작업에 사용되는 메모리 (
maintenance_work_mem
)
💡 메모리 설정 최적화
ALTER SYSTEM SET shared_buffers = '4GB';
ALTER SYSTEM SET work_mem = '64MB';
ALTER SYSTEM SET maintenance_work_mem = '512MB';
2. Temporary Buffers와 OS 캐시 활용
- Temporary Buffers: 임시 테이블 및 정렬에 사용되는 버퍼
- OS 캐시: PostgreSQL은 파일 시스템의 캐시를 적극 활용하여 I/O 성능을 향상
💡 Temporary Buffers 설정
ALTER SYSTEM SET temp_buffers = '16MB';
3️⃣ PostgreSQL 파일 시스템 및 스토리지
1. 데이터 디렉토리 구조 (base/
, pg_wal/
, pg_stat/
등)
PostgreSQL 데이터 디렉토리는 다음과 같은 구조를 가집니다.
/var/lib/postgresql/14/main/
├── base/ # 테이블 및 데이터 파일 저장
├── pg_wal/ # Write-Ahead Logging (WAL) 파일 저장
├── pg_stat/ # 통계 및 모니터링 데이터 저장
├── pg_log/ # 로그 파일 저장
💡 데이터 디렉토리 확인
SHOW data_directory;
2. 테이블스페이스 개념 및 활용
테이블스페이스는 데이터 파일을 저장할 별도의 디렉토리를 지정하는 기능입니다.
💡 테이블스페이스 생성
CREATE TABLESPACE my_space LOCATION '/data/tablespace';
💡 특정 테이블을 테이블스페이스에 저장
CREATE TABLE users (id SERIAL, name TEXT) TABLESPACE my_space;
마지막 수정일자