Estou tentando entender os melhores usos da replicação do PostgreSQL e como ela funciona para que eu possa solucionar problemas em um ambiente de produção.
Estou tendo dificuldade em entender as diferenças entre esses 2 tipos de replicação em termos de (1) Configuração (2) Como os 2 servidores Master/Slave funcionam em cada cenário
A replicação no PostgreSQL (9.2+) é essencialmente arquivos XLOG de 16MB de tamanho (dependendo das configurações de frequência para criação de cada arquivo) sendo criados no Master e enviados por algum método para o Slave.
Minha configuração (para fins desta pergunta)
Configuração do Postgresql.conf no Master
archive_command= 'rsync -av %p postgres@[SlaveIP]:[wal_archive_folder]/%f'
Configuração do Recovery.conf no Slave para ler arquivos de log
restore_command = 'cp [wal_archive_folder]/%f \"%p\"'
primary_conninfo = 'host=[MasterIP] port=5432 user=postgres'
Minha pergunta é: qual parte dessa configuração torna essa replicação de "streaming" versus "envio de logs"? Meu mestre está configurado para usar rsync para enviar logs para o escravo (isso é envio de log?) Meu escravo está configurado para poder se conectar ao mestre em recovery.conf (isso é streaming?)
Segunda parte da pergunta: O que está acontecendo? Entendo que existe outro protocolo no PostgreSQL via WAL_sender & WAL_receiver. Mas não estou claro se isso é usado apenas para streaming e, em caso afirmativo, como o rsync está sendo usado no Master?
:) Obrigada!! E desculpe se esta é uma pergunta óbvia. Tenho lido muitos blogs/livros, mas tenho dificuldade em entender. O wiki do Postgres é tão profundo que leva muito tempo para passar por tudo (e eu tenho prazos)
"Replicação de streaming" refere-se ao envio contínuo de registros WAL por meio de uma conexão TCP/IP entre o mestre e a réplica, usando o protocolo walsender nas
replication
conexões. O mestre lê seu próprio WALpg_xlog
e o envia para a réplica sob demanda. É configurado com umaprimary_conninfo
diretiva inrecovery.conf
epg_hba.conf
entradas no mestre para permitirreplication
conexões. Você também precisawal_keep_segments
de algumas outras opções abordadas nos documentos."Envio de log" refere-se ao envio periódico de registros WAL como arquivos WAL inteiros por meio de um protocolo de transferência de arquivo para um local de arquivo do qual a réplica pode buscá-los. É configurado com uma
restore_command
diretiva inrecovery.conf
e umarchive_command
no master. O PostgreSQL não se importa onde os arquivos estão ou como eles são transferidos, apenas osarchive_command
coloca lá erestore_command
busca o arquivo necessário; isso permite a construção de sistemas como PgBarman e WAL-E.A replicação de streaming não tem tanto atraso, pois os registros são enviados à medida que são gerados. No entanto, requer que o mestre e a réplica estejam online e possam se comunicar diretamente. Ele também requer que a réplica se mantenha bem o suficiente para que o mestre ainda tenha cópias em disco do WAL de que a réplica precisa e geralmente requer que você gaste
pg_xlog
espaço extra para reter o WAL extra para a réplica.A replicação de envio de log tem mais atraso porque a réplica só vê o WAL quando um arquivo inteiro é enviado. No entanto, pode funcionar mesmo quando o mestre e a réplica não podem se comunicar diretamente por TCP/IP usando um local de armazenamento compartilhado. Ele continua funcionando mesmo que a réplica esteja fora do ar por um tempo, pois o mestre terá descartado o WAL
pg_xlog
somente após arquivá-lo, então o WAL ainda está no arquivo e utilizável pela réplica mesmo que o mestre não possa enviá-lo por streaming mais. Observe quearchive_command
nunca desiste, portanto,pg_xlog
pode preencher se o arquivamento estiver falhando; por esse motivo, é melhor arquivar em um local confiável e, em seguida, fazer com que o servidor de réplica busque nesse local.Em geral, você realmente combina os dois, ou seja, usa os dois. Nesse caso, a replicação de streaming é usada quando tudo está indo bem. Se a réplica ficar muito atrasada e o mestre tiver descartado os xlogs necessários, surgir um problema de conectividade, etc., a réplica mudará para a leitura do WAL arquivado até que seja recuperada. Ele tentará periodicamente voltar ao streaming até conseguir.
Se você for usar apenas um, use o envio de log, porque a replicação de streaming sem fallback de envio de log é (até o PostgreSQL 9.4) potencialmente propenso a atrasos de replicação, causando falhas que forçam uma réplica a ser reconstruída.
O PostgreSQL 9.4 muda um pouco isso, porque a replicação de streaming agora pode usar "slots de replicação". Isso permite que o mestre acompanhe quanto WAL uma réplica precisa e evite jogá-lo fora até que a réplica o reproduza. Portanto, não há mais necessidade
wal_keep_segments
se você usar um slot de replicação (não o padrão).Veja meu artigo streaming de slots de replicação no PostgreSQL 9.4 .
9.4 também apresenta as bases para replicação lógica de streaming , que é ainda outro mecanismo, projetado para uso por sistemas de replicação lógica como Londiste, Slony-I e o novo recurso de replicação multimestre assíncrona bidirecional .