PostgreSQL 아키텍처 심층 분석

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;

RSS Feed
마지막 수정일자