Ramificações

A ramificação no Lakebase permite que você faça a versão, teste e evolua seu ambiente de dados com segurança, semelhante à ramificação do código no Git. Você pode criar ramificações isoladas e totalmente funcionais para desenvolvimento, experimentação ou teste de alterações de esquema, sem afetar as cargas de trabalho de produção.

Por padrão, o Lakebase cria um único production branch quando você cria um novo projeto. Esse é o branch padrão, destinado a abrigar os dados de produção do aplicativo.

Você pode criar ramificações adicionais conforme necessário para ajustar seu fluxo de trabalho. Por exemplo, adicione uma ramificação development para criação e teste, uma ramificação staging para teste de pré-produção, ou crie ramificações por desenvolvedor para isolamento completo. Cada ramificação opera de forma independente, portanto, as alterações em uma ramificação filha nunca afetam sua ramificação pai. Com a redefinição de ramificação, você pode atualizar qualquer ramificação filha a partir do pai para obter o esquema e os dados mais recentes, sem propagação de dados ou scripts de desativação.

Como funcionam as ramificações

Relações pai-filho

Cada ramificação (exceto a ramificação raiz) tem um pai. Isso cria uma hierarquia:

production (root branch)
├── staging (child of production)
│   └── feature-test (child of staging)
└── development (child of production)
    └── bugfix-branch (child of development)

Essa hierarquia oferece isolamento importante: as alterações feitas em uma ramificação filha não afetam a ramificação pai, e as alterações em uma ramificação pai não aparecem automaticamente nas filhas. Esse isolamento se estende também ao estado das funções e aos bancos de dados do Postgres: funções e bancos de dados criados, permissões GRANT e REVOKE aplicadas e atributos de função modificados em uma ramificação não afetam outras ramificações. Quando precisar de dados atualizados do pai, você poderá redefinir a ramificação filha. Você também pode criar ramificações de qualquer ponto no histórico do pai. Isso é útil para recuperações pontuais, testes em dados históricos ou cenários de conformidade.

Ao criar um branch, você escolhe se deseja inicializá-lo dos dados atuais ou de um ponto específico no tempo. Consulte Criar um branch para obter instruções passo a passo e detalhes sobre cada opção.

Armazenamento de cópia em gravação

O Lakebase utiliza a tecnologia de cópia-na-gravação para tornar a ramificação pai-filho eficiente. Quando você cria uma nova ramificação, ela herda tanto o esquema quanto os dados de seu pai, mas compartilha o armazenamento subjacente por meio de ponteiros para os mesmos dados. Somente quando você modifica dados, o Lakebase grava novos dados. Isso significa:

  • Suas ramificações aparecem instantaneamente; o tamanho do banco de dados não interfere no tempo de criação de ramificações.
  • A criação de branches não tem nenhum impacto no desempenho na carga de trabalho de produção

copy-on-write determina como os branches são armazenados, mas como um branch é cobrado depende se ele expira. Veja como a ramificação impacta o consumo de recursos.

production branch                child branch (at creation)
┌─────────────────┐       ┌─────────────────┐
│  [Data A]       │◄──────│  → Data A       │  (shared)
│  [Data B]       │◄──────│  → Data B       │  (shared)
│  [Data C]       │◄──────│  → Data C       │  (shared)
└─────────────────┘       └─────────────────┘

After modifying data in child branch:
┌─────────────────┐       ┌─────────────────┐
│  [Data A]       │◄──────│  → Data A       │  (shared)
│  [Data B]       │       │  [Data B']      │  (changed)
│  [Data C]       │◄──────│  → Data C       │  (shared)
└─────────────────┘       └─────────────────┘
                          Only changed data is stored separately

Trabalhar com ramificações

Redefinição de ramo

A redefinição de ramificação atualiza instantaneamente uma ramificação filha para coincidir com o estado atual do pai. Isso é útil quando você deseja atualizar sua ramificação de desenvolvimento ou preparo com os dados mais recentes do pai. A operação é concluída instantaneamente usando a tecnologia copy-on-write e os detalhes da conexão permanecem os mesmos.

A redefinição de ramificação só funciona em uma direção (pai → filho). Para mover alterações de filho para pai, use suas ferramentas de migração padrão para aplicar alterações de esquema. Consulte Redefinir um branch para obter etapas e cenários detalhados.

Recuperação pontual

Você pode criar uma ramificação a partir de um ponto específico no tempo, dentro da sua janela de restauração, o que é útil para se recuperar de erros de dados, como exclusões acidentais, investigar problemas passados ou acessar dados históricos para fins de auditoria e conformidade. Por exemplo, se uma tabela crítica tiver sido descartada ontem às 10h23, você poderá criar um branch definido como 10h22 para extrair os dados ausentes. Da mesma forma, você pode criar branches que reflitam o estado do banco de dados em datas específicas para reconciliações financeiras, auditorias regulatórias ou análise forense. Diferente da redefinição de ramificação (que atualiza uma ramificação existente no local), a recuperação pontual cria uma nova ramificação raiz a partir de dados históricos, deixando sua ramificação original inalterada e operacional. Confira Recuperação pontual para obter detalhes.

Tipos de ramificação especiais

Ramificação padrão

Cada projeto do Lakebase é criado com um branch padrão chamado production, mas você pode designar qualquer branch como o padrão. O branch padrão é isento do limite de computação simultaneamente ativo, garantindo que ele permaneça disponível o tempo todo.

Ramificações protegidas

As ramificações protegidas têm medidas de segurança para evitar alterações acidentais. Elas não podem ser excluídas ou redefinidas a partir do pai e estão isentas do arquivamento automático devido à inatividade. As ramificações protegidas também bloqueiam a exclusão do projeto enquanto estiverem ativas, assegurando que você não consiga remover acidentalmente a infraestrutura crítica. Além disso, o Lakebase prioriza, em seu cache de armazenamento, os dados de branches protegidos, favorecendo o desempenho dessas branches em detrimento de outras branches. Cada projeto oferece suporte a uma ramificação protegida. Use ramificações protegidas para dados essenciais, como produção. Consulte branches protegidas para obter detalhes.

Como a ramificação afeta o consumo de recursos

Com ramificações, você paga pelo poder computacional e pelo armazenamento separadamente.

Computação: cada ramificação tem sua própria computação que pode ser dimensionada de forma independente. Você paga apenas pelas horas de computação ativas. Calcula a escala para zero quando ocioso. Isso significa que um branch de desenvolvimento que você usa ocasionalmente custa muito menos do que executar um servidor de desenvolvimento dedicado 24/7.

Armazenamento: a forma como uma ramificação é cobrada pelo armazenamento depende de ela ter um prazo de validade:

  • Uma ramificação com prazo de validade é cobrada apenas pelos dados que são alterados nela. Por meio do copy-on-write, ele compartilha os dados inalterados do processo pai. Por exemplo, se você modifica 1GB de dados em um branch expirando de um banco de dados de 100GB, você paga por aproximadamente 1GB de armazenamento, não por uma cópia completa de 100GB.
  • Uma ramificação permanente, sem expiração, é cobrada pelo tamanho total dos seus dados, como um banco de dados independente, mesmo quando seus dados diferem apenas ligeiramente dos da ramificação pai.

Warning

Tornar uma ramificação permanente significa que você paga pelo tamanho total dos dados da ramificação, não apenas pelos dados que mudam nela. Definir uma ramificação para nunca expirar é sempre uma escolha deliberada: você seleciona Nunca para Exclusão automática ao criar a ramificação ou remove a expiração de uma ramificação existente. Se você precisar apenas de uma cópia de curta duração, mantenha um prazo de validade para que a ramificação seja cobrada apenas pelo que for alterado nela. Consulte Expiração de ramificação.

Estratégias de ramificação

Aqui estão algumas maneiras comuns de as equipes organizarem seus branches:

Simples (indivíduos e equipes pequenas)

Use sua ramificação padrão com uma única ramificação de desenvolvimento:

production
└── development

Sua development ramificação é onde você cria novos recursos com segurança. Você pode fazer alterações de esquema, adicionar dados de teste e testar sem risco para a ramificação de produção. Quando estiver pronto, execute as migrações de esquema que foram testadas em production (usando sua ferramenta de migração) e então redefina development para começar o próximo recurso com dados novos.

Com preparo

Adicione uma ramificação de preparo para testes de pré-produção:

production
├── staging
└── development

Se você precisar de testes de pré-produção, mantenha uma ramificação staging que espelhe os dados da sua ramificação de produção. Implante seu aplicativo lá, execute testes de integração e desempenho em dados realistas e ganhe confiança antes de entrar em operação. Redefina periodicamente staging do production para atualizar seus dados de teste.

Branches por desenvolvedor

Cada desenvolvedor trabalha em isolamento completo:

production
└── development
    ├── dev-alice
    ├── dev-bob
    └── dev-charlie

Esse padrão impede que os desenvolvedores interfiram no trabalho uns dos outros e permite que todos testem as alterações de esquema de forma independente. Cada desenvolvedor pode experimentar suas próprias alterações de esquema e modificações de dados sem afetar outras pessoas e, quando estiver pronto, aplicar migrações testadas ao branch compartilhado development ou production.

Note

Os padrões de staging e por desenvolvedor usam ramificações duradouras. Uma ramificação sem expiração é cobrada pelo tamanho total dos seus dados. Veja como a ramificação impacta o consumo de recursos.

Recursos adicionais