PostgreSQL HA: hot standby
Disclaimer: These notes give an idea of what is involved in setting up 'hot standby' HA mode in PostgreSQL. The below procedures are not regularly tested. Please use the PostgreSQL documentation when setting up HA on PostgreSQL.
The following variables are used on this page:
- PRIMARY_PG_IP: The IP address of the host that contains the primary database.
- SECONDARY_PG_IP: The IP address of the host that contains the secondary database.
- REP_USER: The internal database user that manages replication on the primary.
- REP_USER_PW: The password of the replication user.
- REP_ARCHIVE: The directory where the database will place files to be replicated.
Their values are represented when they are preceded with the '$' character (e.g. $REP_USER_PW). These are to be replaced with actual values in the commands and files below.
Primary
Perform these actions on the primary host.
Create internal database user
Create an internal database user to manage replication. You will be prompted to supply a password ($REP_USER_PW) for this new user:
sudo -u postgres createuser -U postgres $REP_USER -P -c 5 --replication
Set up replication file storage
Set up a place to store replication files:
REP_ARCHIVE=/var/backups/pgsql/archive sudo mkdir -p $REP_ARCHIVE sudo chown postgres $REP_ARCHIVE
Allow secondary host to connect
Edit /etc/postgresql/9.5/main/pg_hba.conf
to allow the secondary host to
contact this primary host.
host replication $REP_USER $SECONDARY_PG_IP/32 md5
Configure for replication
Edit /etc/postgresql/9.5/main/postgresql.conf
to listen on more than just its
localhost interface, turn on replication, and point to the archive directory:
listen_addresses = '*' wal_level = hot_standby archive_mode = on archive_command = 'test ! -f $REP_ARCHIVE/%f && cp %p $REP_ARCHIVE/%f' max_wal_senders = 3
Restart the database
Restart the database to apply the above changes:
sudo systemctl restart postgresql
Check log file /var/log/postgresql/postgresql-9.5-main.log
on this primary
host for any errors.
The primary database is now ready to accept replication requests from the secondary database (that will be set up below).
Secondary
Perform these actions on the secondary host.
This host should ideally match the primary host in terms of:
- CPU architecture
- OS type and version
- PostgreSQL version
Replication has been known to fail due to an architecture mismatch.
Install PostgreSQL and stop the service
Install PostgreSQL and stop the service:
sudo apt install postgresql sudo systemctl stop postgresql
Copy over primary database files
Move the default database files out of the way and replace them with a copy of the primary database files. You will be prompted for the password of the remote replication user.
sudo mv /var/lib/postgresql/9.5/main /var/lib/postgresql/9.5/main.old sudo -u postgres pg_basebackup -h $PRIMARY_PG_IP -D /var/lib/postgresql/9.5/main -U $REP_USER -v -P --xlog-method=stream Password:
Once a copy of the primary database is transferred, proceed to configure actual replication.
Place database in hot standby mode
Edit /etc/postgresql/9.5/main/postgresql.conf
and put this secondary host in
hot standby mode:
hot_standby = on
Set up recovery configuration file
Copy a sample recovery configuration file into place:
sudo cp /usr/share/postgresql/9.5/recovery.conf.sample /var/lib/postgresql/9.5/main/recovery.conf
Configure for recovery
Edit /var/lib/postgresql/9.5/main/recovery.conf
. Specify hot standby mode and
enter the information necessary for contacting the primary:
standby_mode = on primary_conninfo = 'host=$PRIMARY_PG_IP port=5432 user=$REP_USER password=$REP_USER_PW'
Start the database
Start the database:
sudo systemctl start postgresql
Check log file /var/log/postgresql/postgresql-9.5-main.log
on this secondary
host for any errors.
The secondary database is now replicating the primary database.
Verification of replication
This section includes a raw test that will show whether replication is functioning.
On the secondary database host, perform a query on the 'maasserver_node' table in the 'maasdb' database:
sudo -u postgres psql maasdb -c 'SELECT hostname,status,power_state FROM maasserver_node'
The output will look something like:
hostname | status | power_state -------------------+--------+------------- pmatulis-imp-maas | 0 | unknown node3 | 4 | off node1 | 6 | on node2 | 4 | off node4 | 6 | on (5 rows)
This includes any hosts that are being used for API servers or rack controllers ('pmatulis-imp-maas' in this example). There are 4 regular MAAS nodes.
To quickly check that replication is working simply (temporarily) rename a node's hostname in the web UI and re-invoke the above command to see if the change is reflected.
Another test could be to change the status of a node, for example, by Commissioning or Deploying (a status of '4' is 'Ready' and a status of '6' is 'Deployed').