Een tijd geleden heb ik een post geschreven over het opzetten van een MySQL server cluster voor master master replicatie. MySQL is één van de databases welke veel gebruikt worden voor het hosten van website. Vooral in combinatie met PHP en Apache.

Een andere database welke ook veel gebruikt wordt is PostgreSQL, ik deze blog wil ik beschrijven hoe je een failover systeem maakt voor PostgreSQL.

Als eerst heb ik 2 servers geïnstalleerd op basis van Ubuntu 10.04, hierbij heb ik voor een minimale installatie gekozen. Bij de installatie heb ik ervoor gekozen om ook openssh-server en vim te installeren. De ssh server heb ik nodig zodat ik vanaf afstand bij de server kan. Verder heb ik vim geïnstalleerd, deze heeft namelijk ondersteuning voor syntax highlighting. Voor het bewerken van configuratie bestanden kan dit erg handig zijn.

Hierna heb ik de PostgreSQL server geïnstalleerd

apt-get install postgresql

De aanpassingen aan de configuratie heb ik gedaan in het bestand /etc/postgresql/9.1/main/postgresql.conf.

listen_addresses = '*'
wal_level = hot_standby
max_wal_senders = 3
hot_standby = on

Daarnaast moet het bestand /etc/postgresql/9.1/main/pg_hba.conf aangepast worden.

host replication all <ipadres1>/32 trust
host replication all <ipadres2>/32 trust

Tevens moet er op de slave server een bestand worden toegevoegd in de data map: /var/lib/postgresql/9.1/main/recovery.conf.

standby_mode = 'on'
primary_conninfo = 'host=<ipadres1>'
trigger_file = '/var/lib/postgresql/9.1/main/trigger.txt'

Om na downtime van de master, de master als slave toe te voegen, is het verstandig om op de master een bestand /var/lib/postgresql/9.1/main/recovery.done aan te maken. Na downtime kan deze dan hernoemt worden naar recovery.conf, zodat de master dan een slave wordt.

Om de data te kopiëren naar de tweede server moeten we eerst een rsync verbinding beschikbaar maken tussen de eerste en de tweede server. Hiervoor moet de postgres user kunnen inloggen op de andere server dmv ssh keys zonder wachtwoord.

sudo su - postgres
rsync -a 192.168.1.15:/var/lib/postgresql/9.1/main/ /var/lib/postgresql/9.1/main/ --exclude postmaster.pid --exclude recovery.done --exclude recovery.conf --exclude=pg_xlog --exclude=server.*

De tweede database server kan nu gestart worden.

service postgresql start

Zodra de tweede PostgreSQL server gestart is (zie het log bestand in /var/log/postgresql), kan de eerste server gestart worden.
In het log bestand van de tweede PostgreSQL server zul je, zolang de eerste server niet gestart is, nog wel foutmeldingen zien.

could not connect to the primary server: could not connect to server: Connection refused

————————–

Op het moment dat er overgeswitcht moet worden naar de failback omgeving, moet het volgende gebeuren.

[failback server]
1. touch trigger.txt in /var/lib/postgresql/9.1/main/trigger.txt

[primaire server]
1. /etc/init.d/postgresql stop
2. sudo su – postgres
3. ssh <ipadres2> “psql -c \”;SELECT pg_start_backup(‘backup’, true)\”;”
4. rsync -a <ipadres2>:/var/lib/postgresql/9.1/main/ /var/lib/postgresql/9.1/main/ –exclude postmaster.pid –exclude recovery.done –exclude recovery.conf –exclude=pg_xlog –exclude=server.*
5. ssh <ipadres2> “psql -c \”;SELECT pg_stop_backup()\”;”
6. mv /var/lib/postgresql/9.1/main/recovery.done /var/lib/postgresql/9.1/main/recovery.conf
6. /etc/init.d/postgresql start

————————–