Imagine que eu tenho 3 bancos de dados PostgreSQL 9.3 (A, B e C) configurados em um cenário de replicação de streaming em cascata (ou seja, NÃO estou enviando arquivos WAL manualmente, estou fazendo com que o Postgres os envie por TCP internamente) assim:
A --> B
|
V
C
onde A é o mestre de replicação para B e B é o mestre de replicação para C.
Se B falhar (fica offline, mas não faz failover ) e eu preciso fazer C usar A como mestre de replicação o mais rápido possível, é seguro pular a reconstrução de C de A e apenas configurar A como mestre de replicação de C? Eu faria isso desativando o serviço Postgres em C, modificando o host mestre no arquivo replication.conf em C para apontar para A e, em seguida, iniciando o serviço Postgres em C. Fiz isso na prática e C replica fora de A sem nenhuma perda de dados em meus testes, mas há alguns casos em que isso pode resultar em corrupção de dados em C?
Intuitivamente, esta deve ser uma operação segura. Como nem B nem C fazem um failover, eles permanecerão na mesma linha do tempo de A e, como o novo mestre para C é "upstream" do mestre anterior, C nunca pode estar à frente da posição WAL do novo mestre.
Pergunta de acompanhamento (a ser respondida se a operação descrita anteriormente for considerada "segura"): Imagine que eu execute as etapas acima, B volte a ficar online, reconstrua-o a partir de A e inicie a replicação de streaming binário de A, de modo que agora tenho o seguinte cenário:
A --> B
|
V
C
onde A é o mestre de replicação para B e C.
Quero fazer com que B se torne o mestre de replicação de C novamente e, como antes, quero minimizar o tempo de inatividade de C. Posso interromper o serviço Postgres em C, garantir que a posição de reprodução do WAL em B esteja mais adiante do que a de C (esperando que B alcance C se C estiver "à frente" de B na reprodução do WAL) e, em seguida, alterne a replicação host mestre para C apontar para B no arquivo recovery.conf e iniciar o serviço Postgres?
Mais uma vez, fiz isso na prática e parece funcionar, mas quero ter certeza de que não há cenários que resultem em corrupção de dados em C. Nesse segundo caso, suponha que a replicação de A para B seja verificado que está funcionando corretamente quando o Postgres em C está desligado (se a replicação de A para B for interrompida enquanto C ainda estiver replicando de A, pode haver divergência entre os bancos de dados de C e B, o que obviamente causará problemas). Esta é uma operação segura?
Sim, é seguro. B é uma cópia idêntica de A que deve estar sempre no tempo ou atrás dele, então é seguro mudar a replicação de B para A.
Pessoalmente, porém, eu usaria a remessa WAL de A como meu substituto. Eu deixaria a replicação de streaming configurada para usar B. Se estiver inacessível, C tentará os arquivos WAL e encontrará os arquivos WAL de A e reproduzirá a partir deles, repetindo periodicamente B até que possa se conectar novamente.