Subject: Best Practices for Checking PostgreSQL Server Mode with Multiple Connections

From: YoungUk Song <[email-masked]>
Date: Sun, 8 Dec 2024 21:45:34 +0900

Hi Team,

I’m currently implementing a solution to establish more than 500 database
connections to a single server to verify whether the PostgreSQL server is
in read-only or read-write mode.

My current approach is to create individual database connections and
execute the pg_is_in_recovery() function for each connection to determine
the mode.

I’m curious if there are any best practices or more efficient methods to
achieve this.

Additionally, I’m not very familiar with Psycopg, so I would greatly
appreciate any advice or suggestions on areas that might need improvement.

Looking forward to your insights!

---

From: Adrian Klaver <[email-masked]>
Date: Sun, 8 Dec 2024 09:09:59 -0800

On 12/8/24 04:45, YoungUk Song wrote:
> Hi Team,
> 
> I’m currently implementing a solution to establish more than 500 
> database connections to a single server to verify whether the PostgreSQL 
> server is in read-only or read-write mode.
The server as whole is either in recovery or it is not, that takes one 
connection to determine. What are the remaining 499 connections for?

> execute the |pg_is_in_recovery()| function for each connection to 
> determine the mode.
> 

-- 
Adrian Klaver
[email-masked]

---

From: YoungUk Song <[email-masked]>
Date: Mon, 9 Dec 2024 23:04:51 +0900

Thank you for your response!

I apologize for the confusion in my earlier message.

I need to check whether more than 500 different database servers (not just
one) are operating in read-only or read-write mode using Psycopg.

Are there any best practices for efficiently handling this task across such
a large number of servers?

Additionally, I’m considering using the target_session_attrs parameter to
solve this problem.

However, I’m unsure how to handle connection errors effectively in this
context.

Specifically, I’d like to differentiate between connection failures and
situations where the server is not in standby mode.

Can this be achieved using Psycopg's error-handling features, as described
here: https://www.psycopg.org/psycopg3/docs/api/errors.html?

Thanks!

2024년 12월 9일 (월) 오전 9:19, YoungUk Song <[email-masked]>님이 작성:

> Thanks for your reply!
>
> Actually, I made a mistake in my previous message. I need to check whether
> more than 500 different database servers (not just one) are in read-only or
> read-write mode using psycopg. I’m wondering if there are any best
> practices for checking all of them.
>
> Also, I’m not sure, but can the target_session_attrs parameter be used in
> this situation?
>
> Thanks!
>
> 2024년 12월 9일 (월) 오전 2:10, Adrian Klaver <[email-masked]>님이 작성:
>

---

From: Christophe Pettus <[email-masked]>
Date: Mon, 9 Dec 2024 06:14:30 -0800

> On Dec 9, 2024, at 06:04, YoungUk Song <[email-masked]> wrote:
> Are there any best practices for efficiently handling this task across such a large number of servers?

Out of curiosity, shouldn't something in your infrastructure know this information already?  After all, something created all these servers.

That being said, you will need to open connections to the servers to determine if they are in recovery or not.  You might be able to do a small optimization in that, when you connect, you also query to see what servers are attached to that server as binary replicas: you can then remove them from the list of servers that need to be checked, since you know they are in recovery.  If you have cascaded binary replicas, however, this could end up creating more work than it solves.

---

From: Adrian Klaver <[email-masked]>
Date: Mon, 9 Dec 2024 08:53:21 -0800

On 12/9/24 06:04, YoungUk Song wrote:
> I need to check whether more than 500 different database servers (not 
> just one) are operating in read-only or read-write mode using Psycopg.
> 

It is a matter of looping over a set of connection settings and 
recording the results. To me that points at a Postgres table with the 
connections settings and another table that tracks the results of the 
connection attempts.

Then it is a matter of writing code that uses psycopg to make 
connections using the connection data on whatever schedule you want to 
follow. The results of the connection are then written out to the status 
table. Where results can be 1) Successful connection and server mode. 2) 
Unsuccessful connection and connection error.

> 
> Can this be achieved using Psycopg's error-handling features, as 
> described here: https://www.psycopg.org/psycopg3/docs/api/errors.html 
> <https://www.psycopg.org/psycopg3/docs/api/errors.html>?

Yes use try/except for the connection attempts and capture the error if 
there is one.