blog

PostgreSQL 구조

날짜: 2025-06-29

목록으로


프로세스 구조

주요 프로세스

메모리 구조

Shared Memory (공유 메모리)

Local Memory (로컬 메모리)

논리적 구조

클러스터 (Cluster)

데이터베이스 (Database)

스키마 (Schema)

데이터베이스 객체 (Database Objects)

릴레이션 (Relation)

튜플 (Tuple)

페이지 (Page)

물리적 구조

디렉토리 구조

$PGDATA/
├── base/           # 데이터베이스 파일
├── global/         # 글로벌 시스템 카탈로그
├── pg_wal/         # WAL 파일
├── pg_xact/        # 커밋 로그
├── pg_stat_tmp/    # 통계 정보
└── postgresql.conf # 설정 파일

포크 (Fork)

PostgreSQL 테이블은 여러 포크로 구성:

OID (Object Identifier)

파일 구조

FSM, VM 과 Vacuum의 관계

Vacuum이란?

Vacuum은 PostgreSQL에서 테이블의 데드 튜플(Dead Tuple)을 정리하고 저장 공간을 회수하는 중요한 유지보수 작업입니다.

Vacuum의 주요 목적:

Vacuum의 종류:

FSM, VM이 Vacuum 작업과 어떤 관련이 있는지?

Free Space Map (FSM)과 Vacuum

FSM은 테이블의 각 페이지에서 사용 가능한 공간을 추적하는 데이터 구조입니다.

-- FSM 정보 확인
SELECT schemaname, tablename, attname, n_distinct, correlation 
FROM pg_stats 
WHERE tablename = 'your_table_name';

FSM과 Vacuum의 관계:

FSM의 역할:

Visibility Map (VM)과 Vacuum

VM은 각 페이지의 모든 튜플이 모든 트랜잭션에서 보이는지를 추적합니다.

-- VM 정보 확인 (PostgreSQL 내부 뷰)
SELECT * FROM pg_stat_all_tables 
WHERE schemaname = 'public' AND relname = 'your_table_name';

VM과 Vacuum의 관계:

VM의 장점:

Wraparound 문제란 무엇이고 VACUUM FREEZE로 이를 해결하는 방법

Wraparound 문제

PostgreSQL의 트랜잭션 ID (XID)는 32비트 정수로 제한되어 있습니다.

-- 현재 XID 확인
SELECT txid_current();

-- 데이터베이스별 XID 사용량 확인
SELECT datname, age(datfrozenxid) as xid_age 
FROM pg_database 
ORDER BY xid_age DESC;

문제 발생 과정:

  1. XID는 0부터 시작하여 증가
  2. 약 21억 개의 트랜잭션 후 최대값 도달
  3. XID가 다시 0부터 시작 → Wraparound 발생
  4. 이전 트랜잭션과 현재 트랜잭션의 순서 구분 불가

Wraparound의 위험성:

VACUUM FREEZE로 해결하는 방법

VACUUM FREEZE는 모든 튜플의 XID를 특별한 값으로 고정하여 Wraparound를 방지합니다.

-- VACUUM FREEZE 실행
VACUUM FREEZE table_name;

-- 전체 데이터베이스에 대해 실행
VACUUM FREEZE;

-- 강제로 실행 (트랜잭션 ID 고정)
VACUUM FREEZE VERBOSE table_name;

VACUUM FREEZE의 동작:

  1. 모든 튜플의 XID를 FrozenXID로 설정
  2. FrozenXID는 항상 모든 트랜잭션보다 이전으로 간주
  3. Wraparound 문제 완전 해결

자동 FREEZE 설정:

-- postgresql.conf 설정
autovacuum_freeze_max_age = 200000000  -- 기본값
vacuum_freeze_min_age = 50000000       -- 기본값

모니터링 쿼리:

-- Wraparound 위험도 확인
SELECT 
    schemaname,
    tablename,
    age(relfrozenxid) as xid_age,
    CASE 
        WHEN age(relfrozenxid) > 200000000 THEN 'CRITICAL'
        WHEN age(relfrozenxid) > 150000000 THEN 'WARNING'
        ELSE 'OK'
    END as status
FROM pg_stat_user_tables 
ORDER BY xid_age DESC;

FSM, VM과 FREEZE의 관계:

핵심 요약

  1. PostgreSQL은 Postmaster(메인), Backend(쿼리처리), Background(유지보수) 프로세스로 구성되며, Shared Memory(공유)와 Local Memory(세션별)로 메모리를 관리한다.

  2. 논리적 구조는 클러스터 → 데이터베이스 → 스키마 → 객체(테이블, 인덱스 등)의 계층으로, 물리적으로는 디렉토리와 포크(Main, FSM, VM)로 데이터를 저장한다.

  3. FSM(Free Space Map)은 페이지별 사용 가능한 공간을, VM(Visibility Map)은 튜플 가시성을 추적하여 Vacuum 성능을 최적화한다.

  4. Vacuum은 데드 튜플 제거, 공간 회수, 통계 업데이트를 수행하며, VACUUM FREEZE는 32비트 XID 제한으로 인한 Wraparound 문제를 해결한다.

  5. 정기적인 모니터링(age(datfrozenxid))과 VACUUM 작업이 데이터 무결성과 성능 유지의 핵심이다.


목록으로