Postgresql-9.5 replication with repmgr

Scenario

OS :
Debian Jessie (8.x)

Apps :
postgresql-9.5
repmgr-3.3.1

Disk Partition :

/ 30GB
/var/lib/ 1T
/var/log 300-400GB
/boot 512
swap 8GB

Server node :

192.168.34.183 master
192.168.34.184 slave

Add user postgres

# adduser postgres
# echo "export PATH=\$PATH:/opt/pgsql-9.5.3/bin" |tee -a /home/postgres/.bashrc

Setup ssh less password among user postgres on master and slave

$ ssh -keygen -t rsa
$ ssh-copy-id (do on each node to share public key)

Geting source

# wget https://ftp.postgresql.org/pub/source/v9.5.6/postgresql-9.5.6.tar.gz

Install postgresql on master and slave node

install dependency package

# apt-get install gcc zlib1g-dev libreadline-dev make rsync -y

extract source

# tar xzvf postgresql-9.5.6.tar.gz

change dir to postgres

# cd postgresql-9.5.6

run configure and install

# ./configure --prefix=/opt/pgsql-9.5 
# make -j 8 
# make install

create directory for store data and log postgres

# mkdir -p /var/lib/postgresql/data
# mkdir /var/log/postgresql

change owner to postgres user

# chown -R postgres: /var/lib/postgresql
# chown -R postgres: /var/log/postgresql

run initdb to initialize data postgres as user postgres

$ initdb -D /var/lib/postgresql/data

start service postgresql

$ pg_ctl -D /var/lib/postgresql/data -l logfile start

Configuration file Postgresql

Postgresql have two files config are postgresql.conf and pg_hba.conf.
New in postgresql 9.5 and latter checkpoint_segments has replaced with min_wal_size and max_wal_size.

This is my postgresql.conf

postgresql.conf

listen_addresses = '*'					
port = 5432				
max_connections = 500

shared_buffers = 512MB
work_mem = 1048kB
maintenance_work_mem = 128MB
wal_level = hot_standby
wal_buffers = 16
max_wal_size = 4GB
min_wal_size = 2GB
checkpoint_completion_target = 0.9
shared_preload_libraries = 'repmgr_funcs'
archive_mode = on
archive_command = '/bin/true'

max_wal_senders = 10		
wal_keep_segments = 100		
wal_sender_timeout = 60s
max_replication_slots = 3

hot_standby = on

default_statistics_target = 100

log_destination = 'stderr'
logging_collector = on
log_directory = '/var/log/postgresql'
log_filename = 'postgresql-%Y-%m-%d.log'
log_truncate_on_rotation = on
log_min_duration_statement = 0
log_checkpoints = on
log_connections = on
log_disconnections = on
log_line_prefix = '%t [%p]: [%l-1] user=%u,db=%d '
log_lock_waits = on
log_temp_files = 0
lc_messages = 'C'

And my pg_hba.conf

pg_hba.conf

host    all             all             127.0.0.1/32   trust
host    repmgr          repmgr      192.168.34.183/32  trust
host    replication     repmgr      192.168.34.183/32  trust
host    repmgr          repmgr      192.168.34.184/32  trust
host    replication     repmgr      192.168.34.184/32  trust

Install repmgr (replication manager) on master and slave node

repmgr is a suite of open-source tools to manage replication and failover within a cluster of PostgreSQL servers.

Geting source

# wget http://www.repmgr.org/download/repmgr-3.3.1.tar.gz

extract source and install

# tar xzvf repmgr-3.3.1.tar.gz
# cd repmgr-3.3.1
# PATH="/opt/pgsql-9.5/bin:$PATH" (optional)
# make USE_PGXS=1 install

restart service postgresql to activated configuration

$pg_ctl -D /var/lib/postgresql/data -m fast restart

Create the directory for the repmgr configuration files and change owner file and dir to postgres

# mkdir /etc/repmgr
# chown -R postgres: /etc/repmgr

repmgr.conf on master

$ vi /etc/repmgr/repmgr.conf
cluster=db_cluster
node=1
node_name=node1
conninfo='host=node1 user=repmgr dbname=repmgr'
pg_bindir=/opt/pgsql-9.5/bin/
loglevel=DEBUG
logfacility=STDERR
logfile='/var/log/repmgr/repmgr.log'
master_response_timeout=60
reconnect_attempts=6
reconnect_interval=10
priority=100
failover=automatic
promote_command='/opt/pgsql-9.5/bin/repmgr standby promote -f /etc/repmgr/repmgr.conf'
follow_command='/opt/pgsql-9.5/bin/repmgr standby follow -f /etc/repmgr/repmgr.conf'
use_replication_slots = 3

repmgr.conf on slave

$ vi /etc/repmgr/repmgr.conf
cluster=db_cluster
node=2
node_name=node2
conninfo='host=node2 user=repmgr dbname=repmgr'
pg_bindir=/opt/pgsql-9.5/bin/
loglevel=DEBUG
logfacility=STDERR
logfile='/var/log/repmgr/repmgr.log'
master_response_timeout=60
reconnect_attempts=6
reconnect_interval=10
priority=100
failover=automatic
promote_command='/opt/pgsql-9.5/bin/repmgr standby promote -f /etc/repmgr/repmgr.conf'
follow_command='/opt/pgsql-9.5/bin/repmgr standby follow -f /etc/repmgr/repmgr.conf'
use_replication_slots = 3

On Master node

Create the required users for replication and repmgr and the repmgr DB

postgres=# CREATE USER repmgr SUPERUSER LOGIN ENCRYPTED PASSWORD 'secret';
CREATE ROLE
postgres=# CREATE DATABASE repmgr OWNER repmgr;
CREATE DATABASE

Register node1 as master node for repmgr

run repmgr as user postgres

$ /opt/pgsql-9.5/bin/repmgr -f /etc/repmgr/repmgr.conf master register

On Slave node

Stop service postgresql

$ pg_ctl -D /var/lib/postgresql/data -m fast stop

Remove dir data

$ rm -rfv /var/lib/postgresql/data

run repmgr to clone data master to slave

$ /opt/pgsql-9.5/bin/repmgr -h node1 -U repmgr -d repmgr -D /var/lib/postgresql/data -f /etc/repmgr/repmgr.conf standby clone

start service postgres

$ pg_ctl -D /var/lib/postgresql/data start

run repmgr to register slave node

$ /opt/pgsql-9.5/bin/repmgr -f /etc/repmgr/repmgr.conf standby register

Start repmgr on both server, for permanent i recommend using the option -d, because repmgrd will running on back ground process

/opt/pgsql-9.5/bin/repmgrd -d -f /etc/repmgr/repmgr.conf --verbose > /var/log/repmgr/repmgr.log 2>&1

Testing Replication

Before we will do a test, let’s first look at the status of repmgr

$ /opt/pgsql-9.5/bin/repmgr -f /etc/repmgr/repmgr.conf cluster show

Role      | Name  | Upstream | Connection String
----------+-------|----------|---------------------------------------
* master  | node1 |          | host=debian1 user=repmgr dbname=repmgr
  standby | node2 | node1    | host=debian2 user=repmgr dbname=repmgr

Create the database on the master node

$ /opt/pgsql-9.5/bin/psql -U postgres -c "CREATE DATABASE test_rep"
CREATE DATABASE

list the current databases on the standby

$ psql -U postgres -c "\list"
                                  List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
 postgres  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 repmgr    | repmgr   | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 template0 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 test_rep  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
(5 rows)

is to check if the standby is read-only

$ /opt/pgsql-9.5/bin/psql -U postgres -c "CREATE DATABASE test_rep2"
ERROR:  cannot execute CREATE DATABASE in a read-only transaction

Done

CMIIW

Source :
postgresql-rep1
postgresql.com