(KO) PostgreSQL 복제·고가용성 — 섹션 개요
목차
이 섹션이 다루는 것
섹션 제목: “이 섹션이 다루는 것”이 서브카테고리는 WAL 스트림이 기록되고 내구화된 이후 PostgreSQL이 그것으로 하는 모든 일을 다룬다. 다른 서버로 전송하고, 논리적 행 변경으로 변환하고, 원격 ack까지 커밋을 대기시키고, 아카이빙하고, 요약하고, 물리 백업을 만드는 일이 여기 속한다. 구체적으로 이 섹션이 소유하는 모듈은 다음과 같다.
- 물리 스트리밍 복제 — 프라이머리의
walsender가 원시 WAL을 스탠바이의walreceiver로 스트리밍하고, walreceiver는 이를pg_wal에 기록하여 스탠바이 자신의 startup 프로세스가 재생(replay)하도록 한다. - 복제 슬롯(replication slot) — 소비자가 아직 필요로 하는 WAL(그리고 논리 슬롯의 경우 가장 오래된 카탈로그 스냅샷)을 핀하는 내구적 북마크다. 프라이머리가 WAL을 너무 일찍 재활용하지 않도록 막는다. 스탠바이로의 페일오버 슬롯 동기화도 포함된다.
- 논리 디코딩(logical decoding) —
decode→reorderbuffer→snapbuild로 이어지는 기계 장치로, 물리 WAL에서 커밋된 트랜잭션을 재조립해 물리 레이아웃에 무관한 행 변경 스트림으로 만든다. - 출력 플러그인(output plugin) —
pgoutput. 디코딩된 변경을 논리 복제 와이어 프로토콜로 직렬화해 퍼블리케이션에 내보내는 인코어(in-core) 플러그인이다. - 논리 복제 적용(logical replication apply) — 구독자 측. launcher가 구독별 apply 워커를(초기 복사를 위한 table-sync 워커 포함) 생성하고, 워커들이
pgoutput스트림을 받아 변경을 로컬에서 재실행한다. - 동기 복제(synchronous replication) —
syncrep메커니즘이 커밋 중인 백엔드를 설정된 스탠바이가 커밋 LSN을 ack할 때까지 대기시킨다. - 아카이빙과 WAL 요약 — 아카이버(
pgarch)가 완료된 WAL 세그먼트를 PITR 아카이브로 보내고, WAL 요약기(walsummarizer)가 어느 블록이 변경됐는지 기록한다. 증분 백업이 이 요약을 소비한다. - 베이스 백업과 증분 백업 —
BASE_BACKUP이 시작/종료 WAL 위치에 고정된 데이터 디렉터리의 물리 스냅샷을 스트리밍하고, 증분 백업은 WAL 요약을 참조해 변경된 블록만 복사한다.pg_combinebackup이 증분 체인에서 전체 백업을 재구성한다.
경계를 명확히 말하면. 이 섹션은 의도적으로 WAL의 소비자 측이다. 다음은 다루지 않는다.
- WAL이 생산되고, flush되거나 재생되는 방법.
XLogInsert, WAL-before-flush 규칙, rmgrredo콜백, 스탠바이의 startup 프로세스는 모두 txn-recovery(postgres-xlog-wal.md,postgres-recovery-redo.md)에 속한다. 이 섹션은 그 문서들이 설명하는 WAL을 읽는다. 물리 스탠바이에서의 재생은 복제가 아니라 복구다. - 복제 명령의 와이어 전송.
START_REPLICATION/BASE_BACKUP명령 문법은 일반 쿼리와 같은 FE/BE 프로토콜을 탄다. 프로토콜 프레이밍과 인증은 client-protocol(postgres-wire-protocol.md,postgres-authentication.md)에 속한다. walreceiver가 쓰는 동적 로드 libpq 전송인libpqwalreceiver는 여기서 이름만 언급하고, libpq 동작은 client-protocol이 다룬다. - 역사적 전개. 복제가 파일 전송 → 스트리밍(9.0) → 동기/캐스케이딩(9.1-9.2) → 논리 디코딩(9.4) → pub/sub(10) → 페일오버 슬롯으로 진화한 과정은
postgres-evolution-replication.md에 별도로 담긴다. 이 섹션은 REL_18 현재 상태만 다룬다. - 클라이언트 측 백업 바이너리의 UX.
pg_basebackup과pg_combinebackup은 프로그램으로서 인자 처리, 출력 모드는 utilities(postgres-pg-basebackup.md)가 다룬다. 이 문서들이 구동하는 서버 측backup/메커니즘은 여기서 다룬다.
기반: 모든 모듈이 하나의 WAL 스트림을 소비한다
섹션 제목: “기반: 모든 모듈이 하나의 WAL 스트림을 소비한다”이 서브카테고리를 관통하는 조직 원리는 단 하나다. 내구적 이벤트 로그 — WAL — 가 정확히 하나 존재하고, 이 섹션의 모든 모듈은 그것을 서로 다른 방식으로 소비하는 소비자라는 사실이다. txn-recovery 서브카테고리가 스트림을 생산하고, 이 섹션이 그것을 복제, 논리 디코딩, 아카이빙, 백업으로 펼쳐 낸다. 아래 다이어그램은 postgres-*.md 문서들의 이름과 각 문서가 어느 경계에 걸쳐 있는지를 보여 준다.
flowchart TB
subgraph PROD["WAL 생산자 (txn-recovery — 이 섹션 아님)"]
WAL["pg_wal 세그먼트<br/>postgres-xlog-wal.md"]
end
subgraph PHYS["물리 경로"]
WSND["walsender<br/>postgres-wal-sender-receiver.md"]
WRCV["walreceiver<br/>(스탠바이, 복구를 통해 재생)"]
SYNC["동기 대기<br/>postgres-synchronous-replication.md"]
end
subgraph SLOT["북마크"]
SLOTS["복제 슬롯<br/>postgres-replication-slots.md"]
end
subgraph LOGI["논리 경로"]
DEC["decode + reorderbuffer + snapbuild<br/>postgres-logical-decoding.md"]
PGO["pgoutput 플러그인<br/>postgres-pgoutput.md"]
APPLY["launcher + apply + tablesync<br/>postgres-logical-replication-apply.md"]
end
subgraph ARCH["아카이브 + 요약"]
PGARCH["아카이버 + WAL 요약기<br/>postgres-archiving-walsummary.md"]
end
subgraph BKP["물리 백업"]
BASE["basebackup<br/>postgres-backup-basebackup.md"]
INCR["증분 백업 + combinebackup<br/>postgres-incremental-backup.md"]
end
WAL --> WSND
WSND --> WRCV
WSND --- SYNC
SLOTS -. "WAL + catalog xmin 핀" .- WSND
WAL --> DEC
DEC --> PGO --> APPLY
SLOTS -. "WAL + catalog xmin 핀" .- DEC
WAL --> PGARCH
WAL --> BASE
PGARCH -. "블록 요약" .-> INCR
BASE --> INCR
세부 문서를 읽기 전에 가지고 들어가야 할 구조적 핵심이 세 가지 있다.
- 복제 슬롯은 두 경로에 걸쳐 있다. 물리 슬롯은 연결이 끊긴 스트리밍 스탠바이가 재개할 수 있도록 WAL을 핀한다. 논리 슬롯은 WAL과 함께 카탈로그
xmin(snapbuild가 관리)도 핀하여, 디코더가 오래된 행을 여전히 해석할 수 있게 한다. 두 경우 모두 같은slot.c기계 장치를 쓴다. 그래서 슬롯은 어느 한 경로에 접어 넣지 않고 독립 문서로 분리된다. - 논리 디코딩은 물리 WAL 위에 쌓인 계층이지 별도 경로가 아니다. 디코더는 물리 walsender가 전송하는 같은 WAL 세그먼트를 읽는다. 거기에
reorderbuffer(커밋까지 변경을 버퍼링했다가 커밋 순으로 방출)와snapbuild(WAL에서 카탈로그 스냅샷 재구성)를 얹어 바이트 수준 레코드를 행 변경으로 만든다.pgoutput은 그 체인 끝의 직렬화기일 뿐이다. - 백업과 아카이빙도 WAL 소비자다. 베이스 백업이 일관성을 가지는 이유는 시작/종료 WAL 위치를 기록하고, 아카이브(또는 스트리밍 WAL)가 그 간격을 메우기 때문이다. 증분 백업은 WAL 요약기의 블록 수정 레코드를 참조해 변경되지 않은 블록을 건너뛰는 베이스 백업이다. 두 메커니즘 모두 별도의 내구성 장치가 아니라, 같은 로그에 고정된다.
읽기 순서
섹션 제목: “읽기 순서”각 문서의 의존성이 먼저 손에 들어오도록 상호 참조 순으로 배열했다.
postgres-wal-sender-receiver.md— 물리 스트리밍 쌍. 먼저 읽는다. 생산자/소비자 프레임과 walsender/walreceiver 핸드셰이크를 확립하며, 나머지 섹션 전체가 이 프레임을 전제한다.postgres-replication-slots.md— 북마크 메커니즘. 물리 경로와 논리 경로 모두 의존하므로 논리 문서보다 먼저 읽는다.postgres-logical-decoding.md— decode/reorderbuffer/snapbuild 코어. 논리 경로의 개념적 핵심이며, 그 아래 모든 것은 전송이다.postgres-pgoutput.md— 인코어 출력 플러그인. 짧다. 디코딩 직후에 읽는다. 직렬화 단계이기 때문이다.postgres-logical-replication-apply.md— 구독자 측(launcher, apply 워커, tablesync). 논리 루프를 닫는다.postgres-synchronous-replication.md— 물리 경로 위의 커밋 대기 오버레이. wal-sender-receiver 다음에 읽는다. 논리 경로와는 직교한다.postgres-archiving-walsummary.md— 아카이버 + WAL 요약기. 요약을 소비하는 증분 백업 전에 읽는다.postgres-backup-basebackup.md— 전체 물리 백업 메커니즘.postgres-incremental-backup.md— 요약기(7)와 basebackup(8) 모두에 의존한다. 마지막에 읽는다.
세부 문서 요약
섹션 제목: “세부 문서 요약”전방 참조 — 이 모듈 문서들은 아직 존재하지 않을 수 있다. 각 문서가 소유할 내용을 한 줄씩 요약한다.
| 모듈 문서 | 다루는 내용 |
|---|---|
postgres-wal-sender-receiver.md | 물리 스트리밍 복제: walsender 명령 루프(exec_replication_command, StartReplication, WalSndLoop, XLogSendPhysical)와 스트리밍된 WAL을 pg_wal에 기록하는 walreceiver(WalReceiverMain, XLogWalRcvProcessMsg/XLogWalRcvWrite), WalRcvData/WalSndCtl 공유 메모리 IPC, libpqwalreceiver 전송 경계면. |
postgres-replication-slots.md | 내구적 WAL/카탈로그 북마크로서의 복제 슬롯: 물리 vs 논리 슬롯, restart_lsn/catalog_xmin, 슬롯 영속화와 전진(slot.c, slotfuncs.c), 스탠바이로의 페일오버 슬롯 동기화(slotsync.c). |
postgres-logical-decoding.md | 물리 WAL에서 순서화된 행 변경으로: rmgr decode 콜백(decode.c), 트랜잭션 재조립과 디스크 스필(reorderbuffer.c), 과거 카탈로그 스냅샷 재구성(snapbuild.c), 이를 묶는 LogicalDecodingContext(logical.c). |
postgres-logical-replication-apply.md | 구독자 측: 구독별 워커를 생성하는 논리 복제 launcher(launcher.c), 변경을 재실행하는 apply 워커(worker.c, 병렬 적용은 applyparallelworker.c), 초기 테이블 동기화(tablesync.c), 충돌 처리(conflict.c). |
postgres-pgoutput.md | 인코어 출력 플러그인: pgoutput.c가 출력 플러그인 콜백을 구현해 디코딩된 변경을 논리 복제 와이어 프로토콜로 직렬화하는 방식, 퍼블리케이션 필터링, 행/열 필터, 진행 중인 트랜잭션의 스트리밍. |
postgres-synchronous-replication.md | 동기 커밋: syncrep.c가 커밋 중인 백엔드를 SyncRepWaitForLSN에 주차해 설정된 쿼럼/우선순위 스탠바이 집합이 커밋 LSN을 ack할 때까지 대기시키는 방법, synchronous_standby_names 문법, synchronous_commit 수준과의 상호작용. |
postgres-archiving-walsummary.md | WAL 드레인과 요약: 아카이버 프로세스가 PITR을 위해 아카이브 명령/라이브러리(pgarch.c, xlogarchive.c)를 호출하는 방식, WAL 요약기(walsummarizer.c)가 증분 백업이 소비하는 블록 수정 요약(walsummary.c)을 생성하는 방식. |
postgres-backup-basebackup.md | 서버 측 물리 백업: BASE_BACKUP 복제 명령, 싱크/타겟 추상화와 압축 파이프라인(basebackup.c, basebackup_copy.c, basebackup_sink.c, basebackup_* 코덱), 백업 매니페스트, 시작/종료 백업 WAL 앵커링. |
postgres-incremental-backup.md | 증분 백업: basebackup_incremental.c가 WAL 요약을 참조해 이전 백업 이후 변경된 블록만 복사하는 방식, 증분 매니페스트, 증분 체인에서 전체 백업을 재구성하는 pg_combinebackup. |
인접 섹션
섹션 제목: “인접 섹션”- txn-recovery (
postgres-overview-txn-recovery.md) — 이 섹션 전체가 소비하는 WAL의 생산자.postgres-xlog-wal.md가 WAL 삽입과 LSN을 담당하고,postgres-recovery-redo.md가 재생을 담당한다. 재생은 물리 스탠바이의 startup 프로세스가 스트리밍된 WAL로 수행하는 일이다. 경계: txn-recovery는 WAL을 쓰고 재생하며, replication-ha는 WAL을 전송, 디코딩, 아카이빙, 백업한다. - client-protocol (
postgres-overview-client-protocol.md) — 복제 명령(START_REPLICATION,BASE_BACKUP)을 전달하고 복제 연결을 인증하는 FE/BE 와이어 프로토콜.libpqwalreceiver가 이 전송을 탄다. 경계: client-protocol이 프레이밍과 인증을 담당하고, replication-ha가 프레이밍된 명령이 수행하는 것을 담당한다. - server-architecture (
postgres-overview-server-architecture.md) — 이 섹션의 행위자들이 실행되는 프로세스 역할(B_WAL_SENDER,B_WAL_RECEIVER,B_WAL_SUMMARIZER,B_ARCHIVER,B_SLOTSYNC_WORKER, 논리 변경을 적용하는B_BG_WORKER)과 이들이 조율하는 공유 메모리/래치 IPC를 소유한다. - monitoring-stats (
postgres-overview-monitoring-stats.md) — 복제 진행 상태(pg_stat_replication,pg_replication_slots,pg_stat_subscription)와 이 프로세스들이 대기 중일 때 보고하는 대기 이벤트를 표면화한다. - utilities (
postgres-overview-utilities.md) — 이 섹션의 서버 메커니즘을 구동하는 클라이언트 바이너리:pg_basebackup,pg_combinebackup,pg_receivewal.