Primeiro, acho que o pgpool2 tem um comando de failback, mas isso não ajudaria muito nesse caso. O problema é que o caos resultará se ambas as máquinas acharem que são o mestre. Além do mais, aqui você tinha um caso simples: a rede caiu. E se a rede estiver particionada? Ou seja, ambas as máquinas estão conectadas, mas de alguma forma perdem a conectividade umas com as outras. Nesse caso, ambas as máquinas se tornarão a master e servirão clientes diferentes, e você terá um banco de dados bifurcado. É um caso mais raro, mas você tem certeza de que é tão improvável que esteja preparado para arriscar o caos resultante?
Uma alternativa seria esta:
+- master db
|
------ pgpool ------+
|
+- hot standby
Nesse caso, no entanto, você tem um único ponto de falha, pgpool, que você provavelmente não deseja. Eu sei apenas duas maneiras de resolver esse problema. O mais fácil é apenas promover um modo de espera para dominar manualmente, e isso é aplicável à sua arquitetura. Seus aplicativos precisarão ir para o modo somente leitura até a intervenção humana.
A segunda maneira é ter quóruns. Uma arquitetura que pode funcionar é esta:
+--- pgpool standing by -+ +- master db
| | |
failover ip -+--- active pgpool -+----+- hot standby 1
| | |
+--- pgpool standing by -+ +- hot standby 2
|
+- hot standby 3
(as many standby servers as
you want, so that you have
read-only load balancing)
Os três pgpools estão sendo executados em três máquinas diferentes, cada uma com seu próprio endereço IP, mas também fornecem um endereço IP de failover adicional, considerado apenas pela máquina ativa, e é o usado pelos clientes. Se o pgpool ativo falhar, um pgpool em standby assumirá o controle. Isso pode ser feito com heartbeat
.
Para promover um hot standby para master, um quorum de pgpools (ou seja, pelo menos dois dos três) deve ser decidido; e eles implementarão a decisão somente após um atraso de, digamos, 10 segundos após a decisão. Além disso, o pgpool ativo não pode continuar a usar o banco de dados mestre existente por mais de 10 segundos sem obter confirmação de pelo menos outro pgpool (isso é para evitar que os dois pgpools de espera percam sua conexão com o pgpool ativo e o master ao mesmo tempo, promove um hot standby para master, mas o pgpool ativo continua a usar o master antigo).
Na verdade, o terceiro pgpool não precisa participar do IP de failover e apenas estar lá para ajudar no quorum. Além disso, não sei se o pgpool tem recursos suficientes para fazer isso. Talvez você precise de outro daemon. Uma arquitetura mais geral é esta:
+--- active pgpool -+ +- master db
| | |
failover ip -+ -+----------+- hot standby 1
| | |
+--- pgpool standing by -+ +---+- hot standby 2
| |
| +- hot standby 3
monitoring daemon 1 ---+ |
| |
monitoring daemon 2 ---+------+
|
monitoring daemon 3 ---+
Nesse caso, o balanceamento de carga feito por pgpool é separado do monitoramento e da promoção de espera para um mestre. Observe que você pode colocar pgpools, servidores de banco de dados e monitores de daemons na mesma máquina, mas os dois pgpools devem estar em duas máquinas diferentes e os três daemons de monitoramento devem estar em três máquinas diferentes. Note que não sei se existe um daemon de monitoramento pronto para uso com todos os recursos necessários.
Os detalhes podem ser alterados, mas acho que, se você faz uma promoção de espera automática para dominar sem usar um quorum, está pedindo por problemas.