[pgpool-general: 8448] Re: Problem with load balancing

Bo Peng pengbo at sraoss.co.jp
Fri Oct 7 10:26:10 JST 2022


Hello,

> > 2022-09-29 10:59:05.544:  test_app   pid 441: LOG:  DB node id: 0 backend
> > pid: 525 statement: BEGIN;DELETE FROM scenario WHERE  Id =-1 and Role = 3
> >
> > 2022-09-29 10:59:05.546:  test_app   pid 441: LOG:  statement: SAVEPOINT
> > _EXEC_SVP_0xa3ff298
> >
> > 2022-09-29 10:59:05.546:  test_app   pid 441: LOG:  DB node id: 0 backend
> > pid: 525 statement: SAVEPOINT _EXEC_SVP_0xa3ff298
> >
> > 2022-09-29 10:59:05.546:  test_app   pid 441: LOG:  DB node id: 1 backend
> > pid: 15985 statement: SAVEPOINT _EXEC_SVP_0xa3ff298
> >
> > 2022-09-29 10:59:05.547:  test_app   pid 441: LOG:  pool_send_and_wait:
> > Error or notice message from backend: : DB node id: 1 backend pid: 15985
> > statement: "SAVEPOINT _EXEC_SVP_0xa3ff298" message: "SAVEPOINT can only be
> > used in transaction blocks"

SAVEPOINT can only be established when inside a transaction block.
Because the previous statement "BEGIN" wasn't sent to node1, this error occurs on node1.

Pgpool-II can't handle multi-statement correctly.
Because of this restriction, "BEGIN" wasn't sent to node1.
To avoid this error, please be sure to send the statements separately.

[Restrictions]
https://www.pgpool.net/docs/latest/en/html/restrictions.html
---------------------
Load Balancing

Multi-statement queries (multiple SQL commands on single line) are always sent to primary node (in streaming replication mode) or main node (in other modes). Usually Pgpool-II dispatch query to appropriate node, but it's not applied to multi-statement queries. 
---------------------

On Thu, 6 Oct 2022 17:24:13 +0200
Jesús Campoy <jesuscampoy at gmail.com> wrote:

> I forget to indicate the pgpool version: 4.3.2
> 
> El jue, 6 oct 2022 9:25, Jesús Campoy <jesuscampoy at gmail.com> escribió:
> 
> > Hi,
> >
> >
> >
> > I’m writing this email because I have problems with load balance. It would
> > be great if someone could help me with this issue.
> >
> >
> >
> > My environment is:
> >
> >
> >
> >    - OS: RHEL 5.7
> >    - Postgres 11
> >    - streaming replication as redundancy mode
> >    - In one server runs pgpool and the primary database (node 0), in
> >    another server runs the standby database (node 1).
> >    - Read Commited as default transaction isolation configured in Postgres
> >
> >
> >
> > Redundancy and load balancing is working in most of the cases as expected
> > and replication delay is 0.
> >
> >
> >
> > However, some transactions are not working and pgpool shows the following
> > log:
> >
> >
> >
> > 2022-09-29 10:59:05.544:  test_app   pid 441: LOG:  DB node id: 0 backend
> > pid: 525 statement: BEGIN;DELETE FROM scenario WHERE  Id =-1 and Role = 3
> >
> > 2022-09-29 10:59:05.546:  test_app   pid 441: LOG:  statement: SAVEPOINT
> > _EXEC_SVP_0xa3ff298
> >
> > 2022-09-29 10:59:05.546:  test_app   pid 441: LOG:  DB node id: 0 backend
> > pid: 525 statement: SAVEPOINT _EXEC_SVP_0xa3ff298
> >
> > 2022-09-29 10:59:05.546:  test_app   pid 441: LOG:  DB node id: 1 backend
> > pid: 15985 statement: SAVEPOINT _EXEC_SVP_0xa3ff298
> >
> > 2022-09-29 10:59:05.547:  test_app   pid 441: LOG:  pool_send_and_wait:
> > Error or notice message from backend: : DB node id: 1 backend pid: 15985
> > statement: "SAVEPOINT _EXEC_SVP_0xa3ff298" message: "SAVEPOINT can only be
> > used in transaction blocks"
> >
> > 2022-09-29 10:59:05.547:  test_app   pid 441: WARNING:  packet kind of
> > backend 1 ['E'] does not match with main/majority nodes packet kind ['C']
> >
> > 2022-09-29 10:59:05.547:  test_app   pid 441: FATAL:  failed to read kind
> > from backend
> >
> > 2022-09-29 10:59:05.547:  test_app   pid 441: DETAIL:  kind mismatch
> > among backends. Possible last query was: "SAVEPOINT _EXEC_SVP_0xa3ff298"
> > kind details are: 0[C] 1[E: SAVEPOINT can only be used in transaction
> > blocks]
> >
> > 2022-09-29 10:59:05.547:  test_app   pid 441: HINT:  check data
> > consistency among db nodes
> >
> > 2022-09-29 10:59:05.548: main pid 379: LOG:  child process with pid: 441
> > exits with status 512
> >
> >
> >
> > If I disable the load balance mode, this transaction always works.
> >
> > I also tried without success changing the following parameters:
> >
> > o   disable_load_balance_on_write
> >
> > o   app_name_redirect_preference_list
> >
> > o   black_query_pattern_list
> >
> > o   primary_routing_query_pattern_list
> >
> > o   database_redirect_preference_list
> >
> >
> >
> > Thanks in advance.
> >
> >
> >
> > Best,
> >
> > Jesús
> >


-- 
Bo Peng <pengbo at sraoss.co.jp>
SRA OSS LLC
https://www.sraoss.co.jp/


More information about the pgpool-general mailing list