- Extensão de replicação active-active para PostgreSQL criada e publicada pela AWS
- Quando é necessário gravar e modificar dados em várias instâncias do PostgreSQL, em vez do modelo tradicional active-standby, no qual uma instância específica aceita sozinha as alterações, é possível construir uma estrutura que permite alterações simultâneas e replicação em várias instâncias
- É adequada para cenários como configuração de banco de dados de alta disponibilidade em várias regiões, minimização da latência de escrita, atualizações blue/green da aplicação e migração bidirecional de dados
- Com uso de replicação lógica, oferece suporte a detecção de conflitos, resolução de conflitos de escrita e conversão de formato do banco de dados de destino
Conceito de replicação active-active
- Replicação (Replication) é a tecnologia de sincronizar alterações entre bancos de dados
- A estrutura tradicional active-standby do PostgreSQL aceita alterações em apenas uma instância, enquanto as demais ficam somente para leitura, de modo que um único local atua como fonte dos dados
- O pgactive fornece uma topologia de replicação active-active, permitindo gravação de dados simultaneamente em várias instâncias
- Essa abordagem é adequada para ambientes que exigem vários pontos de escrita, como implantações multi-região ou migração bidirecional
- No modelo active-active, é necessário gerenciamento adicional para conflitos, latência e algumas limitações funcionais
Tecnologia principal: replicação lógica
- Replicação lógica (Logical Replication) transmite os dados em um formato que sistemas externos conseguem interpretar
- Por meio da replicação lógica, é possível implementar diversos recursos adicionais no banco de dados de destino, como detecção de conflitos, resolução de conflitos de escrita e transformação de consultas
- O PostgreSQL introduziu a replicação lógica básica na versão 10, em 2017, mas a replicação active-active exige funcionalidades adicionais
- Devido às características de projeto do PostgreSQL, essas funcionalidades podem ser desenvolvidas e aplicadas na forma de extensão (extension)
- A comunidade de desenvolvimento do PostgreSQL também vem adicionando gradualmente esses recursos ao projeto principal
1 comentários
Comentários do Hacker News
O primeiro a surgir, e que continua open source até hoje, foi o BDR1 (link), e o pgactive é baseado nele
O BDR2 foi uma reescrita closed source do BDR1 e acabou sendo descontinuado
Foram lançados o pglogical v1 e v2 (ambos open source, link), e o v1 foi amplamente modificado e incorporado ao Postgres 10
Com base na experiência com a funcionalidade de replicação lógica do Postgres 10, a 2nd Quadrant começou o desenvolvimento do pglogical v2, do qual também surgiu o pgEdge
Depois, a 2nd Quadrant criou as versões closed source pglogical v3 e BDR v3, e uniu os dois no BDR v4
Em seguida, o nome do produto BDR foi alterado para Postgres Distributed (PGD, link)
Após a aquisição da 2ndQuadrant pela EDB, a EDB lançou o PGD v6
Quando ocorre um conflito, o valor gravado por último com base no timestamp é o que acaba sendo aplicado
O histórico dos conflitos fica registrado em uma tabela especial chamada pgactive_conflict_history, então é possível analisar o histórico e fazer resolução manual
Veja aqui para mais detalhes e documentação
Se essa funcionalidade pudesse ser oficialmente incorporada ao Postgres, seria interessante
Por exemplo, gostaria de usar um banco de dados secundário que lê dados de produção ou staging, mas que só possa ser modificado localmente e cujos resultados não sejam refletidos de volta no upstream
Hoje, na maioria dos casos, isso é feito criando snapshots periodicamente com scripts (cron etc.) por meio de dumps de dados ou consultas, armazenando-os no S3 e depois baixando e restaurando os dados localmente
Esse método costuma funcionar bem na maior parte do tempo, mas às vezes a construção de índices demora demais
Como as implicações legais e éticas são grandes, a maioria das empresas não recomenda essa abordagem
Assim, é possível modificar apenas as tabelas locais sem afetar o primário
Recomenda o comando
createdb --templateNão consegue imaginar uma estratégia de merge que sirva para todas as situações
O replica não é impedido de receber escritas; apenas acontece que o resultado não se propaga para outros lugares
O ideal é projetar a arquitetura de modo que não haja sobreposição das áreas de dados graváveis entre todas as instâncias ativas
Nesses casos, ferramentas como o pgactive podem ser úteis
Ou então faz mais sentido usar desde o início um banco de dados distribuído, como o Yugabyte
Todos os masters leem todos os schemas, mas cada um escreve apenas no que lhe cabe
Pergunta se, em vez de schema, também daria para distribuir a responsabilidade usando particionamento etc.
Não vem à mente nenhum uso direto desse recurso nos próprios produtos da empresa
O RDS usa block replication, e o Aurora usa sua replicação SAN própria
Supõe que talvez a intenção seja usar isso em algo como o DMS
Questiona por que alguém faria isso em um banco relacional fortemente ACID
Mas houve notícia de que, há 1 mês, ele foi oficialmente aberto como open source para a comunidade (anúncio oficial)
Para conseguir dormir bem à noite, preferiria evitar ao máximo
A combinação patroni+etcd+haproxy é muito recomendada, e ver pessoas que já usaram falando com tanto entusiasmo sugere que deve haver um bom motivo
Mas, ao olhar arquivos de exemplo com docker compose, pareceu um pouco intimidador
O pgpool parece mais simples, já que bastaria colocá-lo na frente de cada postgres
Gostaria de ouvir recomendações ou experiências de quem realmente gosta de Postgres no dia a dia
O objetivo é montar, com docker compose e da forma mais simples possível, um cluster com alta disponibilidade, perda mínima ou nenhuma perda, e recuperação pontual
<i>Pgactive: Active-Active Replication Extension for PostgreSQL on Amazon RDS</i>
Post do Hacker News (post de outubro de 2023, com 1 comentário)
Ou seja, cada caso precisa aceitar vantagens e desvantagens conforme a situação