La réplication Master/Slave en mode asynchrone consiste à mettre en place un PostgreSQL maître (Master)  qui gère l’ensemble des demandes d’écritures et X esclaves qui ne gèrent que les requêtes de lectures. Un cas courant est celui ou vous voulez répliquer vos bases de données en production sur un serveur secondaire pour des raisons de haute disponibilité ou de répartition des charges. Cet article décrit  le processus pour mettre en place une réplication Master/Slave en mode asynchrone, en se servant du mécanisme natif des versions 9.x .

Pour la demo, nous considérerons que nous avons 2 serveurs :

-le master qui a pour ip : 1.2.3.4

-le slave qui a pour ip : 5.6.7.8

Etapes de configurations du Master :

1 – Creer l’utilisateur de réplication : c’est l’utilisateur qui sera utilisé pour l’opération de replication.
[cce lang= »sql » tab_size= »2″ escaped= »true »]
sudo -u postgres psql -c « CREATE USER replicateur REPLICATION LOGIN ENCRYPTED PASSWORD ‘thepassword’; »
[/cce]
où replicateur est le nom de l’utilisateur (a qui on donne les privilèges de réplication) et thepassword son mot de passe

2 – Editer le fichier  /etc/postgresql/9.4/main/postgresql.conf et modifier quelques paramètres :
[cce lang= »sql » tab_size= »2″ escaped= »true »]listen_address = ‘localhost, addresse_ip_du_master'[/cce] (ou tout simplement ‘*’)
[cce lang= »sql » tab_size= »2″ escaped= »true »]wal_level = hot_standby[/cce]
La 1ère chose à faire est de faire en sorte que Postgres produise assez de logs de transaction (transaction logs) pour la réplication. Lorsque nous répliquons toute une instance de base de données, nous avons besoin d’un peu plus d’informations qu’en cas de simple crash. Pour s’assurer qu’assez de logs de transactions seront écrits, nous devons ajuster la variable wal_level comme précédemment.
[cce lang= »sql » tab_size= »2″ escaped= »true »]max_wal_senders = 5[/cce]
Nous devons également indiquer au Master qu’il devrait accepter les connexions provenant des logs de transactions du slave. La variable max_wal_senders permet de limiter le nombre de processus disponibles sur le master pour cela.
[cce lang= »sql » tab_size= »2″ escaped= »true »]
checkpoint_segments = 8
wal_keep_segments = 8
[/cce]
Nous indiquons également la taille que doit atteindre le fichier de log avant d’être écrit sur le serveur de réplication. Chaque segment a une taille de 16MB (donc dans ce cas 8×16=128MB).
3 – Editer le fichier/etc/postgresql/9.4/main/pg_hba.conf

pour autoriser les connexions à partir du slave, ajouter la ligne :
[cce lang= »sql » tab_size= »2″ escaped= »true »]
host replication replicateur 5.6.7.8 md5
[/cce]
OU
[cce lang= »sql » tab_size= »2″ escaped= »true »]
hostssl replication replicateur 5.6.7.8 md5
[/cce]
si vous voulez que le slave se connecte uniquement en ssl
4 – Redemarrer Postgres sur le Master :
[cce lang= »sql » tab_size= »2″ escaped= »true »]
sudo service postgresql restart
[/cce]

Etapes de configurations du Slave :

1 – Editer le fichier  /etc/postgresql/9.4/main/postgresql.conf et modifier quelques paramètres :
[cce lang= »sql » tab_size= »2″ escaped= »true »]
wal_level = hot_standby
max_wal_senders = 3
checkpoint_segments = 8
wal_keep_segments = 8
hot_standby = on
[/cce]
Le paramètre hot_standby indique que des opérations de lectures pourront être effectuées sur le Slave, et qu’il sera en lecture seule.

2 – Arrêter Postgres sur le Slave :
[cce lang= »sql » tab_size= »2″ escaped= »true »]
sudo service postgresql stop
[/cce]

3 – Recupérer la sauvegarde initiale de l’instance sur le Master

On utilise pour cela l’outil pg_basebackup disponible depuis la version 9.1

[cce lang= »sql » tab_size= »2″ escaped= »true »]
sudo -u postgres pg_basebackup -h 1.2.3.4 -D /var/lib/postgresql/9.4/main -U replicateur -v -P
[/cce]

l’option -h permet d’indiquer  l’addresse du Master, -D indique où stocker les données dans le système cible (le Slave), -U l’utilisateur de connexion, -P permet d’afficher les informations progressivement, et -v les messages renvoyées par l’opération.

4 – Creer le fichier/var/lib/postgresql/9.4/main/recovery.conf  et remplir les informations suivantes :
[cce lang= »sql » tab_size= »2″ escaped= »true »]
standby_mode = ‘on’
primary_conninfo = ‘host=1.2.3.4 port=5432 user=replicateur password=thepassword sslmode=require’
trigger_file = ‘/tmp/postgresql.trigger’
[/cce]

Le fichier /tmp/postgresql.trigger est utile lorsque vous voulez transformer votre Slave en Master. Pour cela, vous n’avez qu’a creer ce fichier dans l’emplacement indiqué.

5 – Démarrer postgres sur le Slave

[cce lang= »sql » tab_size= »2″ escaped= »true »]
sudo service postgresql start
[/cce]

Vous pouvez vérifier que la réplication fonctionne en insérant une nouvelle ligne dans une table sur le Master et en vérifiant son écriture sur le Slave.