A produção de replicação do PostgreSQL está pronta?

16

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?

SrgHartman
fonte

Respostas:

31

Produção pronta?

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.

Compare com o MySQL?

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.

Craig Ringer
fonte
Ótima resposta para uma pergunta que eu também tive. Obrigado craig.
swasheck
6
Há uma coisa sobre o sync rep que surpreende alguns usuários, mas realmente faz sentido se você pensar sobre isso: a confirmação de uma transação sujeita a replicação síncrona não retornará até que a transação tenha sido persistida em pelo menos um cluster além do mestre . Pessoas provenientes de outros sistemas acham que isso deve acontecer a menos que a tentativa de replicação demore muito , o que significaria "é síncrono, a menos que não seja", o que não é uma garantia aceitável para a comunidade do PostgreSQL. Use vários destinos de sincronização para evitar uma paralisação se a réplica falhar ou use async.
kgrittn
11
@kgrittn Bom ponto re vários alvos. Estou levemente horrorizado que alguém queira / espere que o commit retorne antes que a transação seja replicada na replicação síncrona ; parece que eles realmente querem replicação assíncrona com um limite máximo de intervalo de seguidores que pausa as gravações no mestre até que os seguidores o alcancem o suficiente? Uma coisa perfeitamente razoável de se querer, mas não o representante de sincronização.
Craig Ringer
11
@CraigRinger: O que eu vi as pessoas pedirem não é exatamente o que você declarou, às vezes solicitam "Usar representante de sincronização, mas automaticamente voltar a representante assíncrono se a sincronização estiver demorando muito". Portanto, eles não desejam pausar o mestre se ele ficar muito atrás da réplica - é exatamente o caso em que eles desejam confirmar confirmações rapidamente , sem gravar em outro site. Para mim, isso soa como um caso de prometer mais do que está sendo entregue. Eles querem antecipadamente "Sim, você tem representante de sincronização; você está seguro." e após uma falha "Esses dados confirmados se foram; na verdade, não foram escritos em nenhum outro lugar".
kgrittn
@CraigRinger talvez atualizá-lo com pg10 / logic?
Evan Carroll