Páginas 8 KB
Compartilhadas com o pai até divergir. Leitura do tronco; DDL/DML escrevem páginas só no filho (delta).
Talk · Postgres + Docker
Homolog é o tronco. Por branch de código: clone Copy-on-Write, migration só no filho, validar, destroy. Teoria Neon + o que dá pra aproximar no Docker.
01 · Teoria
Compute separado do storage (pageserver). Um branch é um ponteiro para um LSN — não uma cópia cheia do disco.
Compartilhadas com o pai até divergir. Leitura do tronco; DDL/DML escrevem páginas só no filho (delta).
Criar branch é quase instantâneo: storage do filho começa ~0 até o primeiro write. Não há merge Git-like.
Reset from parent sobrescreve o filho. O pai nunca “vê” as mudanças da branch — e não existe merge de dados estilo Git.
02 · Diagrama
Homolog permanece limpo. Cada feature ganha um clone CoW em porta própria.
flowchart TD
H["homolog · tronco"] --> S["snapshot @homolog"]
S --> X["clone feat-x :5433"]
S --> Y["clone feat-y :5434"]
X --> MX["migration só no clone"]
Y --> MY["migration só no clone"]
MX --> DX["validar → destroy"]
MY --> DY["validar → destroy"]
Fluxo prático: N branches por migration, tronco intacto.
Páginas compartilhadas com o pai até o primeiro write no filho.
flowchart LR
subgraph Pai["tronco / pai"]
P1["page A"]
P2["page B"]
P3["page C"]
end
subgraph Filho["branch filha"]
F1["page A · shared"]
F2["page B' · escrita"]
F3["page C · shared"]
end
P1 -.->|leitura| F1
P2 -->|CoW no write| F2
P3 -.->|leitura| F3
Só a página modificada vira cópia no filho; o resto aponta pro pai.
03 · Contraste
Vanilla não faz branching CoW sem pageserver. TEMPLATE clássico, dump e clone de volume sem CoW não são o mesmo.
CREATE DATABASE … TEMPLATE clássico ≠ CoW04 · Self-hosted
Caminhos que chegam perto — com trade-offs claros.
| Caminho | CoW real? | Quando usar |
|---|---|---|
| DBLab (Postgres.ai) + ZFS | Sim · snapshot/clone | Servidor Linux / VM com ZFS — mais próximo de produto |
Postgres 18 + file_copy_method=clone + TEMPLATE FILE_COPY |
Sim no FS | Mesmo cluster; precisa XFS reflink / ZFS / Btrfs |
| pgoverlay (OverlayFS) | Sim · OverlayFS | Laptop Docker sem ZFS; 1 container por branch |
| Neon Local | CoW na nuvem Neon | Só se homolog puder morar no Neon |
| Dump / TEMPLATE sem clone | Não | Fallback se FS = ext4 na VM do Desktop |
Thin clone de produto. Snapshot → clone → porta por feature.
Branches = databases no mesmo postmaster. Reflink no FS.
OverlayFS no laptop. Bom quando não há ZFS no Docker Desktop.
05 · Recomendação
pgoverlay ou PG18 TEMPLATE CLONE se o data dir estiver em FS com reflink. Colima / Linux nativo ajuda; Desktop em ext4 da VM = cópia cheia.
DBLab + ZFS (ou tendb em cima).
Snapshot @homolog → clone → porta → migration → destroy.
06 · Fluxo servidor
homolog (ZFS dataset, refresh periódico) └── snapshot @homolog ├── clone feat-x → postgres:5433 └── clone feat-y → postgres:5434
zfs clone / dblab clone create a partir de @homolog.
Flyway / EF / Liquibase apontam somente para a connection string do filho.
Testes, smoke, revisão de schema — no clone isolado.
Destruir ou resetar o clone. Tronco permanece limpo.
07 · Fluxo PG18
Manter homolog (ou template atualizado offline, sem conexões na hora do create).
# postgresql.conf file_copy_method = clone -- SQL CREATE DATABASE branch_<git> TEMPLATE homolog STRATEGY FILE_COPY; -- app / migration → dbname=branch_<git> DROP DATABASE branch_<git>;
08 · Limites
Scale-to-zero por branch, TB instantâneo gerenciado, billing de delta na nuvem.
Não há merge de dados. Self-host pageserver existe
(cargo neon), mas não é Compose de produção.
Aproximações self-hosted cobrem o caso “N clones pra validar migration”. Não substituem o produto Neon completo.
09 · Fontes