Como a replicação nativa do PostgreSQL se compara ao MySQL?
Eu sei que a replicação assíncrona é suportada por mais tempo que a sincronização, que é recente. O síncrono é confiável para ser usado em projetos reais?
Como a replicação nativa do PostgreSQL se compara ao MySQL?
Eu sei que a replicação assíncrona é suportada por mais tempo que a sincronização, que é recente. O síncrono é confiável para ser usado em projetos reais?
Respostas:
Sim, está pronto para produção e é amplamente utilizado. Os seguidores do Heroku são baseados na replicação assíncrona incorporada do PostgreSQL, por exemplo, assim como os modos de espera do AWS RDS e as réplicas de leitura. A replicação de streaming é usada quase universalmente com o PostgreSQL.
A configuração da replicação não é exatamente adorável, mas ferramentas como repmgr ajudam um pouco com isso e estão melhorando lentamente a cada versão principal. A capacidade do pg_basebackup de tirar uma cópia do sistema usando a replicação de streaming (e fazê-lo de outro modo de espera) é uma grande ajuda.
Em geral, um recurso simplesmente não será lançado no PostgreSQL até que esteja pronto para a produção. Os erros ocorrem, como em qualquer software, mas geralmente são corrigidos logo após serem identificados. Os novos recursos realmente importantes às vezes têm bugs e problemas descobertos após o lançamento do .0, mas, se assim for, corrigi-los é uma alta prioridade; erros não são deixados por aí.
Não estou ciente de nenhum problema sério com a replicação de streaming - sincronização ou assíncrona - e não vejo nenhum relatório há algum tempo. Eles eram menos estáveis do que o padrão usual da Pg nas versões .0 das principais versões em que foram introduzidos, mas ambos amadureceram rapidamente e estão prontos para a produção.
(Atualização: havia um bug específico na nova versão 9.3 anterior à 9.3.4 que causava problemas de replicação em alguns casos; os usuários da 9.3 deveriam atualizar para a 9.3.4 imediatamente. As versões anteriores não são afetadas.)
A única ressalva que quero mencionar é um detalhe menor com replicação síncrona: se você confirmar no mestre, cancele a consulta depois que ela confirmar enquanto aguarda a confirmação da réplica, ela será tratada como confirmada no mestre antes mesmo de ser replicada. Você obtém o mesmo efeito reiniciando o mestre enquanto aguarda a resposta da réplica. Na prática, isso é uma irrelevância, mas é o único problema em que consigo pensar.
A replicação nativa da Pg é bem diferente da do MySQL.
O MySQL usa replicação lógica, onde envia as alterações lógicas feitas nos dados da tabela, estrutura da tabela, etc., e a réplica aplica essas alterações.
A replicação do PostgreSQL é de nível inferior (na 9.5 e abaixo; versões futuras também podem adicionar replicação lógica). Ele envia os blocos que foram alterados nas tabelas. É mais simples, mais fácil de acertar e impõe menor carga no servidor de réplica, mas consome mais largura de banda da rede e requer mais armazenamento no mestre para manter alterações ainda não replicadas. É melhor configurado para usar a replicação de streaming com fallback de arquivamento WAL, tornando a configuração mais complexa que a do MySQL. Ele replica alterações de baixo nível, como a atividade VACUUM, não apenas as alterações de tupla, mantendo o estado da réplica no disco igual ao do mestre. É incapaz de replicar apenas um banco de dados; todo o sistema deve ser replicado, o que pode ser frustrante se você tiver um banco de dados grande, com alta rotatividade e sem importância e um banco de dados pequeno, com baixa rotatividade e vital.
Em suma, depende do que você quer fazer com isso.
Eu vejo a replicação do PostgreSQL como consideravelmente melhor para réplicas usadas para backup, alta disponibilidade e recuperação de desastres. Particularmente quando combinado com a recuperação no ponto no tempo (PITR) .
Por outro lado, não é tão bom para réplicas de relatórios somente leitura, porque a necessidade de atrasar o aplicativo de dados replicados durante a execução de transações longas significa que você deve cancelar as consultas em execução muito longas ou ficar muito atrás do mestre, consumindo mais espaço em disco no mestre e forçando-o a trabalhar mais para acompanhar.
Há trabalho em andamento para habilitar a replicação lógica no PostgreSQL , onde as alterações lógicas na estrutura da tabela, no conteúdo da tabela etc. são replicadas, e não no estado em disco. O design do catálogo da Pg e o suporte a tudo definido pelo usuário tornam essa tarefa bastante complexa. Algumas das bases foram implementadas para a 9.4, mas é improvável que a replicação lógica completa seja utilizável antes da 9.6 ou posterior.