Temos um servidor de produção PostgreSQL 9.4.9 que estava replicando para uma instância escrava, mas hoje descobri que a instância está fora de sincronia!
As ações óbvias seriam recriar o escravo, configurar métricas e alarmes adequados para a atividade de replicação, para que possamos monitorar efetivamente o status de sincronização entre os nós mestre e escravo.
Mas, como a sincronização falhou, gostaria de primeiro diagnosticar o problema e tentar identificar a causa raiz dele, pois esta seria a segunda vez que isso acontece em cerca de 6 meses.
Pergunta : Como diagnosticar o que falhou no processo de replicação para que possa ser feito da melhor forma desta vez?
Especificações da versão:
PostgreSQL 9.4.9 on x86_64-unknown-linux-gnu, compiled by gcc (Debian 4.9.2-10) 4.9.2, 64-bit
Do nó escravo, em /var/log/postgresql/postgresql-9.4-main.log
posso ver:
2017-07-18 19:43:55 UTC [12816-1] LOG: started streaming WAL from primary at 125D/68000000 on timeline 1
2017-07-18 19:43:55 UTC [12816-2] FATAL: could not receive data from WAL stream: ERROR: requested WAL segment 000000010000125D00000068 has already been removed
2017-07-18 19:44:00 UTC [12817-1] LOG: started streaming WAL from primary at 125D/68000000 on timeline 1
2017-07-18 19:44:00 UTC [12817-2] FATAL: could not receive data from WAL stream: ERROR: requested WAL segment 000000010000125D00000068 has already been removed
2017-07-18 19:44:05 UTC [12821-1] LOG: started streaming WAL from primary at 125D/68000000 on timeline 1
2017-07-18 19:44:05 UTC [12821-2] FATAL: could not receive data from WAL stream: ERROR: requested WAL segment 000000010000125D00000068 has already been removed
2017-07-18 19:44:10 UTC [12825-1] LOG: started streaming WAL from primary at 125D/68000000 on timeline 1
2017-07-18 19:44:10 UTC [12825-2] FATAL: could not receive data from WAL stream: ERROR: requested WAL segment 000000010000125D00000068 has already been removed
2017-07-18 19:44:15 UTC [12826-1] LOG: started streaming WAL from primary at 125D/68000000 on timeline 1
2017-07-18 19:44:15 UTC [12826-2] FATAL: could not receive data from WAL stream: ERROR: requested WAL segment 000000010000125D00000068 has already been removed
Nova pergunta : Como posso ver para trás onde o problema real apareceu?
Mestre postgresql.conf
: https://pastebin.com/NJX5ku6m
Escravo postgresql.conf
: https://pastebin.com/CUZcyazC
Escravo recovery.conf
:
standby_mode = on
primary_conninfo = 'host=10.1.1.65 port=5432 user=replicador password=replicador'
Com base nisso, eu diria que você não tinha o suficiente
wal_keep_segments
no mestre, não estava usando um slot de replicação e estavahot_standby_feedback
desligado ou a conexão caiu por tempo suficiente para o mestre remover o WAL necessário.E você provavelmente não está usando o arquivamento WAL (
archive_command
no mestre,restore_command
na réplica) como fallback.Assim, o mestre removeu os logs de transações do modo de espera necessário.
Você precisará recriar o modo de espera. Qualquer então:
Defina o modo de espera para usar um slot de replicação e habilite
hot_standby_feedback
; ouhabilitar
archive_command
erestore_command
Primeira coisa: veja os logs. Você encontrará avisos, mensagens de erro, fatais e de pânico.
Você pode encontrar onde seus logs estão em seu
postgresql.conf
arquivo.Procure a
logging_collector
configuração, se foron
, você encontrará os logs do servidor no diretório especificado nalog_directory
configuração.Se
logging_collector
estiver definido comooff
, observe alog_destination
configuração. Se for,syslog
você precisa examinar suas configurações de syslog para descobrir onde estão seus logs. Se for,stderr
você pode encontrar algo sob/proc/<PID>/fd/2
onde<PID>
está o PID do seu servidor PostgreSQL em execução.Você pode achar esta página de documentação útil.