Skip to content

Instantly share code, notes, and snippets.

@lcuevastodoit
Created December 3, 2023 09:57
Show Gist options
  • Save lcuevastodoit/065b401dc114db5343f3f42cfad80779 to your computer and use it in GitHub Desktop.
Save lcuevastodoit/065b401dc114db5343f3f42cfad80779 to your computer and use it in GitHub Desktop.
HOW TO SETUP POSTGRES DB WITH REPLICA IN DOCKER

1.- Make 1 directory for pgmaster.

sudo mkdir pgmasterdata

2.- Create a new docker container called pgmaster

docker run -dit -v "$PWD"/pgmasterdata/:/var/lib/postgresql/data -e POSTGRES_PASSWORD=abc --restart=unless-stopped --network=acme-network --name=pgmaster postgres

3.- Backup and edit pgmaster's postgresql.conf with below settings

sudo cp pgmasterdata/postgresql.conf pgmasterdata/postgresql.conf.ori
cat > postgresql.conf <<EOF
listen_addresses = '*'
port = 5432
max_connections = 50
ssl = off
shared_buffers = 32MB
# Replication Settings - Master
wal_level = hot_standby
max_wal_senders = 3
EOF
sudo cp postgresql.conf pgmasterdata/postgresql.conf

4.- Login to pgmaster and create a user for replication

docker exec -it pgmaster psql -U postgres -h localhost -d postgres

postgres=#
	  CREATE ROLE replicator WITH REPLICATION LOGIN PASSWORD 'abc';
	  
postgres=#
	  \q

5.- Backup and edit pgmaster's pg_hba.conf with ip range from selected docker network in step 2

sudo cp pgmasterdata/pg_hba.conf pgmasterdata/pg_hba.conf.ori

echo "host    replication  all  172.25.0.0/16  trust" | sudo tee -a pgmasterdata/pg_hba.conf

6.- Restart pgmaster container

docker restart pgmaster

7.- Run backup of master into /slavedata in the same pgmaster container

docker exec -it pgmaster bash
mkdir /pgslavedata
pg_basebackup -h pgmaster -D /pgslavedata -U replicator -v -P --wal-method=stream
exit

8.- Copy /slavedata that is in pgmaster to host

docker cp pgmaster:/pgslavedata pgslavedata

9.- Tell to pgslave data in host that it is a slave

sudo touch  pgslavedata/standby.signal

10.- Edit postgresql.conf in the pgslave data in host

sudo cp pgslavedata/postgresql.conf pgslavedata/postgresql.conf.ori
cat > postgresql.conf <<EOF
listen_addresses = '*'
port = 5432
max_connections = 50
ssl = off
shared_buffers = 32MB
# Replication Settings - Slave
hot_standby = on
primary_conninfo = 'host=172.25.0.128 port=5432 user=replicator password=abc'
EOF
sudo cp postgresql.conf pgslavedata/postgresql.conf

11.- Start new pgslave container

docker run -dit -v "$PWD"/pgslavedata/:/var/lib/postgresql/data -e POSTGRES_PASSWORD=abc --network=acme-network --restart=unless-stopped --name=pgslave postgres

12.- TO Check replication state in pgmaster

docker exec -it pgmaster psql -h localhost -U postgres -d postgres -c "select usename,state from pg_stat_activity where usename = 'replicator';"

13.- Verify the setup by creating a database in pgmaster, and check if the same database appear in pgslave.

docker exec -it pgmaster psql -U postgres -h localhost -d postgres
CREATE DATABASE testdb;
\l
exit
docker exec -it pgslave psql -U postgres -h localhost -d postgres
\l

14.- To promote to pgslave if pgmaster is down, simply run "pg_ctl promote" command

docker exec -it pgslave bash

pg_ctl promote
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment