Thread: setting up streaming replication

setting up streaming replication

From
Brad White
Date:
I'm stumped.

Using this command to set up the slave and replication on PG v 15:
"C:\Program Files\PostgreSQL\15\bin\pg_basebackup" -h 192.168.1.126 -U pgrep_user -p 5433 -D "C:\Program Files\PostgreSQL\15\data" -Fp -Xs -R

If I have PG running on the remote server and the data directory is intact, then I get an error, Data exists and is not empty.

If I shut down PG, delete data\*, restart PG, then it fails to start because the conf files are missing.

If I leave PG shut down and run pg_basebackup, it times out and asks if pg is running and listening on the port. Of course it is not.

I see lots of posts on how to use pg_basebackup, but apparently this isn't interesting because no one mentions whether pg should be running on the remote server. Just that the data dir must be empty.

I know this works because I've done it before. But I don't see the trick I'm missing.

Thanks,
Brad.

Re: setting up streaming replication

From
Ron
Date:
On 10/23/23 18:16, Brad White wrote:
> I'm stumped.
>
> Using this command to set up the slave and replication on PG v 15:
> "C:\Program Files\PostgreSQL\15\bin\pg_basebackup" -h 192.168.1.126 -U 
> pgrep_user -p 5433 -D "C:\Program Files\PostgreSQL\15\data" -Fp -Xs -R
>
> If I have PG running on the remote server and the data directory is 
> intact, then I get an error, Data exists and is not empty.
>
> If I shut down PG, delete data\*, restart PG, then it fails to start 
> because the conf files are missing.
>
> If I leave PG shut down and run pg_basebackup, it times out and asks if pg 
> is running and listening on the port. Of course it is not.
>
> I see lots of posts on how to use pg_basebackup, but apparently this isn't 
> interesting because no one mentions whether pg should be running on 
> the remote server.

No, it should not.

This is what works for me, in Linux on the standby system, where "buddy" and 
"basebackup" are references in .pg_service.conf to the primary server:
PGHOST=...
pg_ctl status && pg_ctl stop -mfast
psql service=buddy -Xac "select pg_drop_replication_slot(slot_name)
                          from pg_replication_slots
                          where slot_name = 'pgstandby1';"
/usr/bin/rm -r $PGDATA/*
pg_basebackup --dbname=service=basebackup -D $PGDATA --progress \
               --checkpoint=fast -v \
               --write-recovery-conf --wal-method=stream \
               --create-slot --slot=pgstandby1 --compress=server-zstd
pg_ctl start -wt90 -l ${MajVer}/pgstart_standby.log

Source: 
https://www.tecmint.com/configure-postgresql-streaming-replication-in-centos-8/


-- 
Born in Arizona, moved to Babylonia.



Re: setting up streaming replication

From
b55white
Date:
On Oct 23, 2023 at 8:30 PM, Ron <ronljohnsonjr@gmail.com> wrote:

On 10/23/23 18:16, Brad White wrote:
> I'm stumped.
>
> Using this command to set up the slave and replication on PG v 15:
> "C:\Program Files\PostgreSQL\15\bin\pg_basebackup" -h 192.168.1.126 -U
> pgrep_user -p 5433 -D "C:\Program Files\PostgreSQL\15\data" -Fp -Xs -R
>
> If I have PG running on the remote server and the data directory is
> intact, then I get an error, Data exists and is not empty.
>
> If I shut down PG, delete data\*, restart PG, then it fails to start
> because the conf files are missing.
>
> If I leave PG shut down and run pg_basebackup, it times out and asks if pg
> is running and listening on the port. Of course it is not.
>
> I see lots of posts on how to use pg_basebackup, but apparently this isn't
> interesting because no one mentions whether pg should be running on
> the remote server.

No, it should not.

This is what works for me, in Linux on the standby system, where "buddy" and
"basebackup" are references in .pg_service.conf to the primary server:
PGHOST=...
pg_ctl status && pg_ctl stop -mfast
psql service=buddy -Xac "select pg_drop_replication_slot(slot_name)
                         from pg_replication_slots
                         where slot_name = 'pgstandby1';"
/usr/bin/rm -r $PGDATA/*
pg_basebackup --dbname=service=basebackup -D $PGDATA --progress \
              --checkpoint=fast -v \
              --write-recovery-conf --wal-method=stream \
              --create-slot --slot=pgstandby1 --compress=server-zstd
pg_ctl start -wt90 -l ${MajVer}/pgstart_standby.log

Source:
https://www.tecmint.com/configure-postgresql-streaming-replication-in-centos-8/

It sounds like you are saying that pg_basebackup should be run on the backup server,  not on the primary. But a detail that important would be mentioned in the documentation. Especially since it is directly compared to pg_dump, which I only run on the primary. 
If you are running it from the secondary, how can you have a pg_service.conf since data is empty?
Is all that stuff with slots necessary since the backup will automatically create a temporary slot for replication?

Thanks,  
Brad.

Re: setting up streaming replication

From
"David G. Johnston"
Date:
On Monday, October 23, 2023, Brad White <b55white@gmail.com> wrote:
I'm stumped.

Using this command to set up the slave and replication on PG v 15:


You must, by some means:

Have PostgreSQL binaries installed on the machine that is to become the replica.
Have the output of pg_basebackup present on the replica; removing the cluster that is initially installed and replacing it with the backup tends to be easiest.

The means by which you run pg_basebackup aren’t all that interesting since there is this thing called copy file.

The output of pg_basebackup is the data directory for the cluster so of course the cluster cannot be running until you’ve put the contents into place and ensured the proper configuration and added the standby.signal file.  Admittedly, if you choose to destroy an existing cluster in order to install the new one in its location of course you’ll need to shut down that existing cluster before destroying it.  But this later point isn’t going to be documented because it isn’t an inherent task but rather one you choose as a convenience due to using a packager that handles most of cluster configuration for you and a lack of desire to configure the replica cluster from scratch.

David J.


Re: setting up streaming replication

From
Ron
Date:
On 10/24/23 08:14, b55white wrote:
On Oct 23, 2023 at 8:30 PM, Ron <ronljohnsonjr@gmail.com> wrote:

On 10/23/23 18:16, Brad White wrote:
> I'm stumped.
>
> Using this command to set up the slave and replication on PG v 15:
> "C:\Program Files\PostgreSQL\15\bin\pg_basebackup" -h 192.168.1.126 -U 
> pgrep_user -p 5433 -D "C:\Program Files\PostgreSQL\15\data" -Fp -Xs -R
>
> If I have PG running on the remote server and the data directory is 
> intact, then I get an error, Data exists and is not empty.
>
> If I shut down PG, delete data\*, restart PG, then it fails to start 
> because the conf files are missing.
>
> If I leave PG shut down and run pg_basebackup, it times out and asks if pg 
> is running and listening on the port. Of course it is not.
>
> I see lots of posts on how to use pg_basebackup, but apparently this isn't 
> interesting because no one mentions whether pg should be running on 
> the remote server.

No, it should not.

This is what works for me, in Linux on the standby system, where "buddy" and 
"basebackup" are references in .pg_service.conf to the primary server:
PGHOST=...
pg_ctl status && pg_ctl stop -mfast
psql service=buddy -Xac "select pg_drop_replication_slot(slot_name)                          from pg_replication_slots                          where slot_name = 'pgstandby1';"
/usr/bin/rm -r $PGDATA/*
pg_basebackup --dbname=service=basebackup -D $PGDATA --progress \               --checkpoint=fast -v \               --write-recovery-conf --wal-method=stream \               --create-slot --slot=pgstandby1 --compress=server-zstd
pg_ctl start -wt90 -l ${MajVer}/pgstart_standby.log

Source: 
https://www.tecmint.com/configure-postgresql-streaming-replication-in-centos-8/


It sounds like you are saying that pg_basebackup should be run on the backup server,  not on the primary. 

Correct.

But a detail that important would be mentioned in the documentation. Especially since it is directly compared to pg_dump, which I only run on the primary. 

pg_dump can be run anywhere that can get to the pg server via port 5432 (and there's enough disk space).

If you are running it from the secondary, how can you have a pg_service.conf since data is empty?

.pg_service.conf goes in $HOME, not $PGDATA.

Is all that stuff with slots necessary since the backup will automatically create a temporary slot for replication?

I want a permanent slot so that replication automatically resumes if the secondary must temporarily be taken down.

--
Born in Arizona, moved to Babylonia.

Re: setting up streaming replication

From
Brad White
Date:
On Tue, Oct 24, 2023 at 8:56 AM Ron <ronljohnsonjr@gmail.com> wrote:
On 10/24/23 08:14, b55white wrote:
Is all that stuff with slots necessary since the backup will automatically create a temporary slot for replication?

I want a permanent slot so that replication automatically resumes if the secondary must temporarily be taken down.

--
Wait. 

Are you saying that once I get streaming replication set up, it quits working when I reboot the servers once a week?

Thanks,
Brad.

Re: setting up streaming replication

From
Christophe Pettus
Date:

> On Oct 24, 2023, at 11:31, Brad White <b55white@gmail.com> wrote:
> Are you saying that once I get streaming replication set up, it quits working when I reboot the servers once a week?

Not unless the downtime is sufficiently long that the replica can't find the WAL information it needs.  You can avoid
thiswith PostgreSQL settings, but you might also consider keeping a WAL archive in a cloud storage system like S3 (it
canbe combined with backups, using a tool like pgBackRest). 


Re: setting up streaming replication

From
Ron
Date:
On 10/24/23 13:31, Brad White wrote:
On Tue, Oct 24, 2023 at 8:56 AM Ron <ronljohnsonjr@gmail.com> wrote:
On 10/24/23 08:14, b55white wrote:
Is all that stuff with slots necessary since the backup will automatically create a temporary slot for replication?

I want a permanent slot so that replication automatically resumes if the secondary must temporarily be taken down.

--
Wait. 

Are you saying that once I get streaming replication set up, it quits working when I reboot the servers once a week?

Maybe with temporary slots, but definitely not with permanent slots.

I just stopped a replicated pair, and started them up again:

Secondary> pg_ctl stop -mfast
Primary> pg_ctl stop -mfast
Primary> pg_ctl start -w
Secondary> pg_ctl start -w
Primary> psql -Xc "select * from pg_stat_replication;"
Secondary> psql -Xc "select * from pg_stat_wal_receiver;"

--
Born in Arizona, moved to Babylonia.