Skip to content

Latest commit

 

History

History
433 lines (388 loc) · 7.78 KB

replication.md

File metadata and controls

433 lines (388 loc) · 7.78 KB

ON BOTH MASTER AND SLAVE INSTANCES

PGDATA=/var/lib/postgresql/data/pgdata
POSTGRES_PASSWORD=mysecretpassword

cmd=/bin/bash
dbname=postgres
entrypoint=/bin/bash
host_master=10.168.2.100
host_slave=10.168.2.200
image=academiaonline/postgres:latest
mount_data=/var/lib/postgresql/data
mount_run=/run/postgresql
mount_var=/var/lib/postgresql
network=replication
port=5432
protocol=tcp
samenet=10.168.2.0/24
user=postgres
username=postgres
user_replication=replicator

ON THE MASTER INSTANCE:

container=pg-master

volume_data=${container}_data
volume_run=${container}_run
volume_var=${container}_var

docker \
    network \
    create \
    ${network} \

docker \
    volume \
    create \
    ${volume_data} \

docker \
    volume \
    create \
    ${volume_run} \

docker \
    volume \
    create \
    ${volume_var} \

docker \
    container \
    run \
    --detach \
    --env PGDATA=${PGDATA} \
    --env POSTGRES_PASSWORD=${POSTGRES_PASSWORD} \
    --name ${container} \
    --network ${network} \
    --publish ${port}:${port}/${protocol} \
    --read-only \
    --restart always \
    --volume ${volume_data}:${mount_data} \
    --volume ${volume_run}:${mount_run} \
    --volume ${volume_var}:${mount_var} \
    ${image} \

docker \
    container \
    exec \
    --env dbname=${dbname} \
    --env mount_data=${mount_data} \
    --env samenet=${samenet} \
    --env username=${username} \
    --env user_replication=${user_replication} \
    --interactive \
    --tty \
    --user ${user} \
    ${container} \
    ${cmd} \

command="CREATE TABLE guestbook (visitor_email text, visitor_id serial, date timestamp, message text);"
psql \
    --command "${command}" \
    --dbname ${dbname} \
    --username ${username} \

command="INSERT INTO guestbook (visitor_email, date, message) VALUES ( '[email protected]', current_date, 'Test 1.');"
psql \
    --command "${command}" \
    --dbname ${dbname} \
    --username ${username} \

createuser \
    ${user_replication} \
    --replication \
    --username ${username} \

file=pg_hba.conf
echo "host replication ${user_replication} ${samenet} trust" | tee --append ${PGDATA}/${file}

exit
docker \
    container \
    restart \
    ${container} \

ON THE SLAVE INSTANCE:

container=pg-slave

volume_data=${container}_data
volume_run=${container}_run
volume_var=${container}_var

docker \
    network \
    create \
    ${network} \

docker \
    volume \
    create \
    ${volume_data} \

docker \
    volume \
    create \
    ${volume_run} \

docker \
    volume \
    create \
    ${volume_var} \

docker \
    container \
    run \
    --env PGDATA=${PGDATA} \
    --env host_master=${host_master} \
    --env user_replication=${user_replication} \
    --entrypoint ${entrypoint} \
    --interactive \
    --network ${network} \
    --read-only \
    --rm \
    --tty \
    --user ${user} \
    --volume ${volume_data}:${mount_data} \
    --volume ${volume_run}:${mount_run} \
    --volume ${volume_var}:${mount_var} \
    ${image} \

pg_basebackup \
    --host ${host_master} \
    --pgdata ${PGDATA} \
    --progress \
    --username ${user_replication} \
    --verbose \
    --wal-method stream \

exit
docker \
    container \
    run \
    --env PGDATA=${PGDATA} \
    --env host_master=${host_master} \
    --env port=${port} \
    --env user_replication=${user_replication} \
    --entrypoint ${entrypoint} \
    --interactive \
    --network ${network} \
    --read-only \
    --rm \
    --tty \
    --volume ${volume_data}:${mount_data} \
    --volume ${volume_run}:${mount_run} \
    --volume ${volume_var}:${mount_var} \
    ${image} \

file=postgresql.conf
echo "primary_conninfo = 'host=${host_master} port=${port} user=${user_replication}'" | tee --append ${PGDATA}/${file}
touch ${PGDATA}/standby.signal

exit
docker \
    container \
    run \
    --detach \
    --env PGDATA=${PGDATA} \
    --env POSTGRES_PASSWORD=${POSTGRES_PASSWORD} \
    --name ${container} \
    --network ${network} \
    --publish ${port}:${port}/${protocol} \
    --read-only \
    --restart always \
    --volume ${volume_data}:${mount_data} \
    --volume ${volume_run}:${mount_run} \
    --volume ${volume_var}:${mount_var} \
    ${image} \

docker \
    container \
    exec \
    --env dbname=${dbname} \
    --env username=${username} \
    --interactive \
    --tty \
    --user ${user} \
    ${container} \
    ${cmd} \

command="SELECT * FROM guestbook;"
psql \
    --command "${command}" \
    --dbname ${dbname} \
    --username ${username} \

exit

ON THE MASTER INSTANCE:

docker \
    container \
    exec \
    --env dbname=${dbname} \
    --env username=${username} \
    --interactive \
    --tty \
    --user ${user} \
    ${container} \
    ${cmd} \

command="INSERT INTO guestbook (visitor_email, date, message) VALUES ('[email protected]', current_date, 'Test 2.');"
psql \
    --command "${command}" \
    --dbname ${dbname} \
    --username ${username} \

exit

ON THE SLAVE INSTANCE:

docker \
    container \
    exec \
    --env dbname=${dbname} \
    --env username=${username} \
    --interactive \
    --tty \
    --user ${user} \
    ${container} \
    ${cmd} \

command="SELECT * FROM guestbook;"
psql \
    --command "${command}" \
    --dbname ${dbname} \
    --username ${username} \

exit

ON THE MASTER INSTANCE:

docker \
    container \
    exec \
    --env PGDATA=${PGDATA} \
    --interactive \
    --tty \
    --user ${user} \
    ${container} \
    ${cmd} \

touch ${PGDATA}/standby.signal

exit
docker \
    container \
    restart \
    ${container} \

docker \
    container \
    exec \
    --env dbname=${dbname} \
    --env username=${username} \
    --interactive \
    --tty \
    --user ${user} \
    ${container} \
    ${cmd} \

command="INSERT INTO guestbook (visitor_email, date, message) VALUES ('[email protected]', current_date, 'Test 3.');"
psql \
    --command "${command}" \
    --dbname ${dbname} \
    --username ${username} \

exit

ON THE SLAVE INSTANCE:

docker \
    container \
    exec \
    --env dbname=${dbname} \
    --env username=${username} \
    --interactive \
    --tty \
    --user ${user} \
    ${container} \
    ${cmd} \

command="INSERT INTO guestbook (visitor_email, date, message) VALUES ('[email protected]', current_date, 'Test 4.');"
psql \
    --command "${command}" \
    --dbname ${dbname} \
    --username ${username} \

pg_ctl promote
command="INSERT INTO guestbook (visitor_email, date, message) VALUES ('[email protected]', current_date, 'Test 5.');"
psql \
    --command "${command}" \
    --dbname ${dbname} \
    --username ${username} \

command="SELECT * FROM guestbook;"
psql \
    --command "${command}" \
    --dbname ${dbname} \
    --username ${username} \

exit

ON THE MASTER INSTANCE:

docker \
    container \
    exec \
    --env PGDATA=${PGDATA} \
    --env host_slave=${host_slave} \
    --env port=${port} \
    --env user_replication=${user_replication} \
    --interactive \
    --tty \
    --user ${user} \
    ${container} \
    ${cmd} \

file=postgresql.conf
echo "primary_conninfo = 'host=${host_slave} port=${port} user=${user_replication}'" | tee --append ${PGDATA}/${file}
touch ${PGDATA}/standby.signal

exit
docker \
    container \
    restart \
    ${container} \

docker \
    container \
    exec \
    --env dbname=${dbname} \
    --env username=${username} \
    --interactive \
    --tty \
    --user ${user} \
    ${container} \
    ${cmd} \

command="SELECT * FROM guestbook;"
psql \
    --command "${command}" \
    --dbname ${dbname} \
    --username ${username} \

exit

CLEAN UP

docker container rm --force $( docker container ls --all --quiet )
docker network rm $( docker network ls --quiet )
docker volume rm $( docker volume ls --quiet )