Neon & Database Branching
데이터베이스를 git branch처럼 나눠 쓰는 일은 오래전부터 스토리지 스냅샷으로 가능했습니다. 그러나 이를 데이터베이스 제품의 기본 동작으로 만든 것은 Neon이 처음이었습니다. 이 노트는 Neon의 storage 엔진을 Docker로 직접 실행하는 과정을 담습니다. branch를 만들고 여러 방식으로 다뤄 보면서 아키텍처를 익힙니다. 또한 2026년 시점에 branching을 제공하는 다른 제품을 살펴봅니다. 온프레미스에서 같은 효과를 구현하는 방법까지 한 흐름으로 정리합니다.
목표는 "branch가 왜 1초 만에 만들어지고 왜 공짜가 아닌지"를 설명하는 것입니다. 각 Part는 다음 요소를 조합합니다.
- 개념: copy-on-write가 어느 계층에서 일어나는지
- 실측: 이 노트의 실습 환경에서 실제로 실행하고 기록한 명령과 출력
- 제약: 문서만 읽으면 놓치는 조건과 오류 메시지
- 연습 문제: 직접 바꿔 보며 확인할 과제
3분 요약
- Neon의 branch는 timeline입니다. 부모 timeline id와 분기 LSN만 기록하며 데이터는 복사하지 않습니다. 이 노트의 실습에서 62 MB 테이블이 있는 데이터베이스의 branch를 생성하는 데 0.07초가 걸렸습니다.
- compute는 stateless PostgreSQL입니다. durable state는 safekeeper(WAL quorum), pageserver(page 재구성), object storage에 있습니다. commit은 safekeeper quorum ack로 확정됩니다.
- pageserver는 WAL을 key와 LSN 두 축의 layer 파일로 다시 정리합니다. 과거 LSN의 page를 재구성할 수 있습니다. 따라서 branch, PITR, time travel은 같은 메커니즘을 사용합니다.
- branch의 logical size는 부모와 같습니다. physical size는 분기 이후 변경분만 늘어납니다. 비용은 history 보존 기간과 branch마다 붙는 compute에서 발생합니다.
- Neon 저장 엔진은 Apache 2.0이지만 control plane은 비공개입니다. compose로 실행한 것은 "branch 있는 저장 엔진"이지 "서비스"가 아닙니다.
- 2025년 Databricks가 Neon을 인수했습니다. 같은 엔진은 Lakebase Postgres라는 이름으로 Neon과 Databricks 양쪽에서 제공됩니다.
- Xata는 블록 스토리지 계층에서 copy-on-write를 수행합니다. Aurora와 Tiger Cloud는 자체 스토리지 볼륨에서, DBLab과 ZFS는 파일시스템에서 수행합니다. PlanetScale Postgres와 Supabase의 branch는 데이터를 복사하지 않는 독립 인스턴스에 가깝습니다.
- Neon에는 branch를 부모로 머지하는 기능이 없습니다. 스키마는
schema-diff로 비교하고 데이터는 직접 옮깁니다. Dolt 계열만 머지를 제공합니다. - 온프레미스에서 가장 현실적인 선택은 ZFS 기반 thin clone과 이를 제품화한 DBLab Engine입니다. Kubernetes 표준화를 추진하는 팀이라면 Xata OSS를 검토합니다.
난이도별 학습 경로
| 단계 | 먼저 읽을 Part | 도달 목표 |
|---|---|---|
| 입문 | I → III | branching이 푸는 문제를 이해하고 로컬에서 branch를 만들어 본다 |
| 중급 | II → IV | safekeeper, pageserver, timeline 구조를 설명하고 CLI와 CI 워크플로우를 설계한다 |
| 운영 | V → VI | 온프레미스 대안을 비교하고 비용, 성능, 내구성 모델을 평가한다 |
| 정리 | VII | 용어와 명령을 치트시트로 복습한다 |
전체 차례
- Part I. Database Branching 개념과 지형: branching이 해결하는 문제, copy-on-write 계보, 2026년 제품 지형, 선택 기준
- Part II. Neon 아키텍처: compute와 storage 분리, safekeeper, pageserver layer, timeline 내부, autoscaling, PostgreSQL 패치
- Part III. 로컬 실습: Neon 자체 호스팅: Docker Compose 기동, 첫 branch, 과거 LSN branch, storage 관찰, cargo neon과 Neon Local, 자체 호스팅 한계
- Part IV. Branching 실전 워크플로우: CLI와 API, PR마다 branch, 마이그레이션 리허설, restore와 reset, schema-only branch, AI agent
- Part V. 온프레미스 대안: Thin Clone 직접 구성: ZFS clone, DBLab Engine, Dolt와 Doltgres, Xata OSS, 선택 매트릭스
- Part VI. 운영, 비용, 한계: 비용 모델, 성능, 내구성, 호환성, 관리형 서비스 관점
- Part VII. Reference: 용어집, 명령 치트시트, 학습 로드맵, FAQ
실습 프로젝트
neon-lab은 upstream 저장소의 Docker Compose 예제를 학습용으로 정리한 것입니다. MinIO, storage_broker, pageserver, safekeeper 3대, compute 2대를 실행합니다. 도우미 스크립트로 branch를 만들고 상태를 확인합니다.
compose.ymlscripts/branch.shscripts/status.shscripts/psql.shcompute_wrapper/shell/compute.shpageserver_config/pageserver.toml
cd neon-lab
docker compose build compute1
docker compose up -d
./scripts/psql.sh compute1 -c "select version();"
./scripts/branch.sh feature-a
docker compose --profile branch up -d compute2
./scripts/psql.sh compute2 -c "show neon.timeline_id;"
이미지 두 개가 약 9 GB입니다. 첫 pull에는 시간이 걸립니다. Part I을 읽는 동안 미리 받아 두면 좋습니다.
추천 실습 순서
- 3.1에서 compose를 실행하고
orders테이블 50만 건을 적재합니다. - 3.2에서 branch를 만들고 두 compute의 쓰기가 격리되는지 확인합니다.
- 3.3에서 DELETE를 실행한 뒤 삭제 직전 LSN으로 branch를 만들어 복구합니다.
- 3.4에서 layer 파일과 MinIO 버킷을 열어 copy-on-write를 직접 확인합니다.
- 5.3에서 Doltgres를 실행해 branch와 머지를 비교합니다.
- 4.3의 마이그레이션 리허설을 로컬 branch에서 재현합니다.
기준과 범위
- Neon 저장 엔진:
ghcr.io/neondatabase/neon:latest, compute는 PostgreSQL 17.5 (2026-09 기준 이미지) - Neon 클라우드 서비스 사실: 2026년 9월 공식 문서 기준. 플랜과 가격은 변경될 수 있어 본문에 시점을 적었습니다.
- 다른 제품: 각 공식 문서와 블로그를 인용했습니다. 본문 끝 참고 목록에 출처를 남겼습니다.
- 실측 환경: Apple Silicon macOS, Docker VM 2 vCPU 12 GB. 수치는 이 환경을 기준으로 합니다. 절대값보다 비율과 순서에 의미를 둡니다.
- 범위 밖: Neon 클라우드 콘솔 조작 화면, Databricks 쪽 Lakebase 사용법, 각 제품의 가격 비교