Hi David,

please don't top-post.

> On 11. Aug, 2020, at 22:57, David Gauthier <davegauthie...@gmail.com> wrote:
> 
> Thanks for the response Paul :-)
> 
> Our code is actually perl which uses DBI which has functions to ping a DB on 
> a specific server and connect to it.
> But my question was more along the lines  of whether or not the onus to do 
> this sort of thing typically lies with the app or something outside which is 
> orchestrating the HA cfg.

it should be handled outside the app, im my opinion. But then, many 
installations don't use pg-bouncer, HA-proxy, virtual IP addresses or something 
like that. That's why I suggested using libpq. libpq can handle it. I'm not 
sure if and how it can in done in Perl, though.

I played around a little with perl-DBI, perl-DBI-Pg, perl-URI and perl-URI-db 
and, though I managed to get connected, I did not manage to specifically select 
a connect to the primary or replica database cluster.

Also, your initial steps should be done differently:

1. select count(*) from pg_stat_replication; => p
2. select count(*) from pg_stat_wal_receiver; => r

if:

p = 0 & r = 0 => single database cluster, no replication
p > 0 & r = 0 => primary database cluster
p = 0 & r > 0 => replica database cluster
p > 0 & r > 0 => primary and replica database cluster

The last case can for example happen, if you have database cluster A replicate 
to B, and B replicate to C, and then connect to B.

Also, the test that many people do to select pg_is_in_recovery(); is not a good 
idea because B and C of the above example are probably in recovery mode, so you 
still don't know which end you're on.

Also, pg_is_in_recovery() will probably not work with logical but only 
streaming replication (both async and sync) because I expect B and C to not be 
in recovery mode when using logical replication. I didn't try logical 
replication, so someone please correct me if I'm wrong here.

If you just want to know, whether your connection is read-write or read-only, 
you can simply:

show transaction_read_only;

Cheers,
Paul

Reply via email to