콘텐츠로 이동

(KO) PostgreSQL 서버 아키텍처 — 섹션 개요

목차

이 서브카테고리는 머신 그 자체다. 프로세스들과 그것들이 공유하는 조율 구조 — 이것이 범위다. 프로세스들이 하는 과는 구별된다. 아키텍처 개요의 핵심 명제는 PostgreSQL에서 공유 메모리가 곧 아키텍처이고 프로세스는 그 교체 가능한 주민이라는 것이다. 이 섹션은 그 명제의 두 부분을 메커니즘 수준에서 문서화한다. 주민이 누구인지, 그리고 그들이 어떻게 연결되고 조율하고 잠그고 신호를 보내는지가 이 섹션의 내용이다.

구체적인 범위는 다섯 묶음이다.

  1. fork 모델과 백엔드 수명 주기 — 단일 postmaster, child_process_kinds 레지스트리, fork() 경로(또는 EXEC_BACKEND 재실행), 그리고 클라이언트 백엔드가 InitProcess에서 InitPostgres를 거쳐 PostgresMain 메시지 루프까지 하는 일.
  2. 공유 메모리 / IPC 기반 — 고정 세그먼트를 부팅 시 한 번 크기 계산하고 생성하는 방식(CalculateShmemSizeCreateSharedMemoryAndSemaphores), 모든 프로세스를 뒷받침하는 PGPROC/ProcGlobal 슬롯, 그리고 병렬 질의와 확장 기능이 부팅 이후 쓰는 동적 계층(dsm, dsa, shm_mq).
  3. 세 가지 락 계층. 이 섹션의 무게 중심이다. storage/lmgr/README가 열거하는 순서 그대로 구성했다.
    • LWLock + 스핀락 — 인메모리 공유 구조체를 보호하는 단기 두 모드(공유/배타) 래치. 교착 감지 없음, SQL에 보이지 않음.
    • 헤비웨이트(정규) 락 테이블 — SQL 수준 락 매니저(LOCK/PROCLOCK 해시, AccessShareLock ~ AccessExclusiveLock). 완전한 waits-for 교착 감지기 포함.
    • SSI 서술 락SIReadLock과 Serializable Snapshot Isolation(직렬화 가능 스냅샷 격리) 장치. 독자를 블록하지 않고 SERIALIZABLE을 구현한다.
  4. 래치와 시그널 — 깨움 구조: SetLatch/WaitLatch, WaitEventSet 멀티플렉서, procsignal, 그리고 시그널을 안전하게 지연된 동작으로 전환하는 인터럽트 핸들러.
  5. 보조 프로세스와 백그라운드 워커 프레임워크 — 클라이언트가 아닌 주민들(startup, checkpointer, bgwriter, walwriter, syslogger, PG18 I/O 워커)과, 병렬 질의·논리 apply·확장 기능이 추가 프로세스를 띄울 때 쓰는 RegisterBackgroundWorker API.

명확한 경계 — 이 섹션이 다루지 않는 것. 이 서브카테고리는 조율 프리미티브와 프로세스 컨테이너를 담당하고, 페이로드 서브시스템은 모두 이웃 섹션으로 미룬다.

  • txn-recovery로. 여기서 다루는 락 계층은 락 메커니즘이다. 락의 트랜잭션적 의미 — 스냅샷, 락 대기가 참조하는 procarray, WAL, 커밋/중단, 복구 — 는 txn-recovery에 있다. SSI는 잠금 메커니즘으로 여기서 문서화하고, 그 격리 의미론txn-recovery의 스냅샷 모델과 연결된다.
  • storage-engine으로. LWLock이 버퍼 헤더와 버퍼 풀을 보호하지만, 버퍼 매니저와 WAL-before-flush 규칙은 storage-engine 범위다. 이 섹션은 “LWLock이 프리미티브”라는 사실까지만 다루고, 무엇을 보호하는지는 보호 대상 구조체가 사는 섹션에서 설명한다.
  • query-processing으로. 백엔드가 파싱→플래닝→실행 파이프라인을 돌리고, 병렬 질의가 이 섹션의 shm_mq와 백그라운드 워커를 소비하지만, 파이프라인 자체와 Gather/execParallel 장치는 query-processing 소유다.
  • replication-ha, monitoring-stats, ddl-schema로. walsender/walreceiver, autovacuum, 누적 통계 서브시스템, DDL은 모두 postmaster가 fork하는 역할이거나 sinval 큐의 소비자이지만, 그 동작은 각 섹션이 담당한다. 이 라우터는 그것들을 BackendType 주민으로 명시하고 해당 섹션을 가리킨다.
  • 캐시 무효화(sinval) 는 같은 공유 메모리 기반 위에 얹히지만 system-catalog(postgres-cache-invalidation.md)가 소유한다. 이 섹션은 큐가 여기서 크기가 정해진 세그먼트 안에 있다는 사실만 언급한다.

이 다이어그램은 이 서브카테고리의 모듈 문서들이 어떻게 연결되는지 보여 준다. postmaster가 공유 세그먼트의 크기를 정하고 생성한 뒤 주민들을 fork하면, 주민들은 IPC 기반, 세 가지 락 계층, 래치/시그널 구조로 조율한다. 노드 레이블은 postgres-*.md 문서 이름이다.

그림 1 — 서버 아키텍처 서브스트레이트: postmaster, 자식 프로세스, 공유 메모리, 락, 래치

이 다이어그램에서 독자가 가지고 나가야 할 구조적 사실이 두 가지 있다. 첫째, 락 계층은 강도의 위계가 아니라 서로 다른 세 서브시스템이다. README는 LWLock, 헤비웨이트 락, 서술 락이 별개의 메커니즘임을 명확히 한다. 교착 감지는 헤비웨이트 계층에만 있고, 서술 잠금은 SSI에만 있다. 둘째, 여기서 다루는 모든 것은 PGPROC을 매개로 한다. 백엔드의 헤비웨이트 락 대기 큐, 래치, proc-signal 슬롯은 모두 PGPROC 항목에 매달린다. 그래서 proc.c가 락 매니저 문서와 공유 메모리 IPC 문서 양쪽에 등장한다.

상호 참조 우선 순서: 그 위에 서 있는 것보다 기반을 먼저 읽고, 락 정책보다 락 프리미티브를 먼저 읽는다.

  1. postgres-shared-memory-ipc.md — 기반. 세그먼트, PGPROC/ProcGlobal 슬롯, 동적 dsm/dsa/shm_mq 계층은 이 섹션의 모든 문서가 참조한다.
  2. postgres-postmaster.md — 세그먼트를 만들고 주민을 fork하는 주체. BackendType / child_process_kinds 레지스트리.
  3. postgres-backend-lifecycle.md — fork된 클라이언트 백엔드가 실제로 하는 일(InitProcessInitPostgres → 메시지 루프). 이후 메커니즘에 구체적인 소유자를 부여한다.
  4. postgres-lwlock-spinlock.md — 락 프리미티브. 그 위에 얹힌 계층을 읽기 전에 먼저 본다.
  5. postgres-lock-manager.md — 헤비웨이트 테이블과 교착 감지기. LWLock 프리미티브와 PGPROC 대기 큐에 의존한다.
  6. postgres-ssi-predicate-locking.md — 서술 잠금과 SSI. 헤비웨이트 매니저 뒤에 읽는다. lmgr 프레임을 재사용하기 때문이며, 격리 절반을 위해 txn-recovery 스냅샷 문서와 나란히 읽는다.
  7. postgres-latch-signals.md — 락 대기와 보조 프로세스가 블록하는 깨움 구조.
  8. postgres-aux-processes.md 이어서 postgres-background-workers.md — 나머지 주민들. 위의 모든 것을 소비하므로 마지막에 읽는다.

전방 참조 — 아래 모듈 문서들이 아직 존재하지 않을 수 있다. 설명은 각 문서의 계획된 범위다.

모듈 문서한 줄 범위
postgres-postmaster.md단일 fork 부모: PostmasterMainServerLoop, child_process_kinds 레지스트리와 BackendType 역할, postmaster_child_launch(fork_process vs EXEC_BACKEND 재실행), 크래시·재시작 감독.
postgres-backend-lifecycle.md클라이언트 백엔드의 fork부터 종료까지: InitProcess(PGPROC 확보), InitPostgres(DB 연결, 캐시 구축), PostgresMain 읽기-파싱-실행 메시지 루프, 리소스 오너와 on-shmem-exit 콜백을 통한 정리.
postgres-shared-memory-ipc.mdIPC 기반: 고정 세그먼트 크기 계산(CalculateShmemSizeCreateSharedMemoryAndSemaphores), ShmemAlloc/ShmemInitStruct, PGPROC/ProcGlobal 슬롯 풀, 동적 계층 — dsm 세그먼트, dsa 할당자, 병렬 워커가 쓰는 shm_mq 단일 리더/라이터 큐.
postgres-lock-manager.md헤비웨이트(정규) 락 매니저: 락 태그로 파티셔닝된 LOCK/PROCLOCK 공유 해시, 락 모드와 충돌 테이블, fast-path 잠금, LockAcquire/LockRelease, PGPROC 대기 큐, DeadLockCheck waits-for 사이클 감지기.
postgres-lwlock-spinlock.md경량 계층: 하드웨어 기반으로서의 스핀락과 port/atomics, LWLockAcquire/LWLockRelease, 공유·배타 모드, 트랑슈와 이름 있는 LWLock, 이 계층에 교착 감지나 SQL 가시성이 없는 이유.
postgres-ssi-predicate-locking.mdSerializable Snapshot Isolation: 다중 세분도의 SIReadLock 서술 락, rw-충돌 추적(SerializableXact), 직렬화 가능성을 유지하기 위해 트랜잭션 하나를 중단시키는 위험 구조 감지, predicate.c / README-SSI 설계.
postgres-latch-signals.md깨움 구조: LatchSetLatch/WaitLatch, 소켓·래치·시그널에 걸치는 WaitEventSet 멀티플렉서, ProcSignal 크로스 백엔드 시그널링, 인터럽트 패턴(ProcessInterrupts, 지연된 CHECK_FOR_INTERRUPTS).
postgres-background-workers.mdbgworker 프레임워크: RegisterBackgroundWorker(정적) vs RegisterDynamicBackgroundWorker, BackgroundWorkerInitializeConnection, postmaster 슬롯 수명 주기, 병렬 질의와 논리 복제 apply가 dsm/shm_mq를 이용해 이 프레임워크에 올라타는 방식.
postgres-aux-processes.md고정 보조 프로세스들: startup(복구 드라이버), checkpointer, bgwriter, walwriter, syslogger, PG18 I/O 워커 — 각각 AuxiliaryProcessMainCommon으로 진입하며, 각자 서비스하는 것과 소유한 공유 구조체.
섹션 개요인접한 이유
postgres-overview-txn-recovery.md가장 깊은 경계선. 여기서 다루는 락 계층은 메커니즘이고, 그 트랜잭션적 의미 — 락 대기가 참조하는 스냅샷(procarray), WAL, 커밋/중단, 복구 — 는 그쪽에 있다. SSI의 격리 의미론도 그 스냅샷 모델과 연결된다.
postgres-overview-storage-engine.mdLWLock이 버퍼 헤더와 공유 버퍼 풀을 보호하고, 버퍼 매니저·smgr·WAL-before-flush 규칙은 그쪽 소유다. 이 섹션은 락 프리미티브를 제공하고, 그쪽은 보호 대상 구조체를 설명한다.
postgres-overview-query-processing.md백엔드(수명 주기 문서)가 질의 파이프라인을 돌리고, 병렬 질의가 이 섹션의 shm_mq와 백그라운드 워커를 소비한다. Gather/execParallel 장치 자체는 그쪽 소유다.
postgres-overview-system-catalog.mdsinval 캐시 무효화 큐는 여기서 크기가 정해진 공유 메모리 위에 얹히지만, 무효화 루프와 relcache/catcache는 postgres-cache-invalidation.md가 담당한다.
postgres-overview-replication-ha.mdwalsender/walreceiver와 슬롯 동기 워커는 postmaster가 fork하는 BackendType 주민이고, 복제 동작은 그쪽 소유다.
postgres-overview-monitoring-stats.md누적 통계 서브시스템은 공유 메모리 안에 살고 백엔드들이 드레인하지만, 여기서 정의한 LWLock·헤비웨이트 대기를 이름으로 쓰는 대기 이벤트 보고는 그쪽 소유다.