[pgpool-general: 5475] Re: how can i force selection of primary backend?

Tatsuo Ishii ishii at sraoss.co.jp
Tue May 16 22:13:53 JST 2017


> Hello.
> 
> Is there any way I can specify particular backend to be a primary one, so  that  write requests  are routed to it?
> In short: out of three nodes two respond with "f" to "select pg_is_in_recovery();" request. 
> But I want only one of them, #0, to be considered master by pgool.
> 
> I'll try to explain what I mean below.
> 
> My setup:
> pgpool-3.6.2
> three PgSQL servers:
>    - master on amazon RDS
>    - streaming replica on amazon RDS
>    - replica  in  amazon ec2 instance created with Bucardo. It is the same server where pgpool runs.
> 
> No (automatic) failover  of  master  is  planned,  this is the description of backends in pgpool.conf:
> ###################################################################################
> #aws rds master
> backend_hostname0 = 'aws-master-ip'
> backend_port0 = 5432
> backend_weight0 = 20
> backend_flag0 = 'DISALLOW_TO_FAILOVER'
> 
> #aws rds slave, postgresql streaming replication
> backend_hostname1= 'aws-slave-ip'
> backend_port1 = 5432
> backend_weight1 = 40
> backend_flag1 = 'ALLOW_TO_FAILOVER'
> 
> #aws ec2 slave, created with Bucardo
> backend_hostname2= '127.0.0.1'
> backend_port2 = 5433
> backend_weight2 = 40
> backend_flag2 = 'ALLOW_TO_FAILOVER'
> 
> ###################################################################################
> 
> Since  replica  created with bucardo is not, from PgSQL point of view, running in replication mode, I set 
> sr_check_period = 0. 
> However sr_check_user, _password and _database variables are set with valid values.
> Right  now  "show nodes_pool;"  shows  that all is as intended - the real
> master server is marked as primary:
> 
>  node_id |   hostname    | port | status | lb_weight |  role   | select_cnt | load_balance_node | replication_delay
> ---------+-----------------------------------------------------------------+------+--------+-----------+---------+------------+-------------------+-------------------
>  0       | aws-master-ip | 5432 | up     | 0.200000  | primary | 83327      | false             | 0
>  1       | aws-slave-ip  | 5432 | up     | 0.400000  | standby | 105534     | true              | 0
>  2       | 127.0.0.1     | 5433 | up     | 0.400000  | standby | 112791     | false             | 0
> 
> However, I'm worried - the node #2 responds with "f" to the select pg_is_in_recovery(); request. Because, as I stated before, this postgresql server does not consider itself to be a replicating slave. There is no way to attach a streaming replica slave to a master server running on amazon rds, therefore I have to use this complex scheme with Bucardo. I'm afraid that after pgpool restarts it may select node #2 as primary. 
> 
> I was thinking of leaving sr_check_user, _password and _database values blank so that pgpool would always use node number 0 as primary (as it was stated here: http://www.sraoss.jp/pipermail/pgpool-general/2014-February/002603.html ) but it brings other problems: after a slave failover I've got a lot of pgpool zombie processes and my log was flooded with these messages:
> pgpool[24961]: [338591-1] ERROR:  failed to authenticate
> pgpool[24961]: [338591-2] DETAIL:  no PostgreSQL user name specified in startup packet
> 
> So, to summarize: can i forcefully configure node #0 to be my primary one? 

I personaly did not try RDS but my guess is your set up will keep on
letting Pgpool-II recognize node 0 as master, because Pgpool-II always
starts searching for primary from node 0. So as long as "SELECT
pg_is_in_recovery()" against node 0 returns false, you are safe.

Best regards,
--
Tatsuo Ishii
SRA OSS, Inc. Japan
English: http://www.sraoss.co.jp/index_en.php
Japanese:http://www.sraoss.co.jp


More information about the pgpool-general mailing list