Mise en place d’une réplication asynchrone PostgreSQL

Nous allons mettre en place une réplication asynchrone entre deux serveurs PostgreSQL

1 – Prérequis

Il faut avoir installé PostgreSQL sur les serveurs

2 – Préambule

Dans notre exemple on va avoir deux serveurs

  • Le 192.168.1.114 qui va être considéré comme le Master. C’est lui qui enverra ses données au Slave
  • Le 192.168.1.184 qui va être considéré comme le Slave. C’est lui qui recevra les données du Master

3 – Préparation du Master

Toutes les commandes seront faites sur le Master

3.1 – Création de l’utilisateur qui fera la réplication

  • on se connecte au master
sudo -i -u postgres

(L’utilisateur postgre est crée automatiquement lors de l’installation de PostgreSQL. Se reporter à l’article parlant de l’installation de PostgreSQL)

psql
  • Créer l’utilisateur qui fera la réplication
CREATE ROLE replicator WITH REPLICATION LOGIN PASSWORD 'motdepasseutilisateur';

3.2 – Modification des fichiers PostgreSQL

  • Modifier le fichier /etc/postgresql/*/main/postgresql.conf
  • De-commenter, ajouter ou modifier les lignes suivantes
listen_addresses = '*'
wal_level = replica
max_wal_senders = 10
wal_keep_size = 512MB
  • En option mais recommandé pour archiver les WAL
  • De-commenter, ajouter ou modifier les lignes suivantes
archive_mode = on
archive_command = 'cp %p /var/lib/postgresql/wal_archive/%f'
  • Enregistrer le fichier /etc/postgresql/*/main/postgresql.conf
  • Modifier le fichier /etc/postgresql/*/main/pg_hba.conf
  • commenter
host    replication     all             127.0.0.1/32            scram-sha-256
host    replication     all             ::1/128                 scram-sha-256
  • Ajouter
host    replication     replicator     192.168.1.184/32     md5

(Attention, l’ip est l’ip du Slave, penser à la modifier si le Slave n’a pas l’ip 192.168.1.184)

(Attention aux tabulations)

  • Sauvegarder le fichier

3.3 Redémarrer le service PostgreSQL

sudo systemctl restart postgresql

4 – Préparation du Slave

Toutes les commandes seront faites sur le Slave

4.1 Arrêter le service PostgreSQL

sudo systemctl stop postgresql

4.2 Supprimer toutes les données de l’instance (On va récupérer les données du master plus tard)

sudo rm -rf /var/lib/postgresql/17/main/*

4.3 Cloner le master

pg_basebackup -h 192.168.1.114 -U replicator -D /var/lib/postgresql/17/main -Fp -Xs -P

(Attention, l’ip est l’ip du Master, si 192.168.1.114 n’est pas l’ip du Master il faut bien mettre l’ip du Master)

(Le mot de passe de l’utilisateur replicator rentré à l’étape 3.1 est demandé)

5 – Activation du mode standby

Le mode standby permet de dire au serveur que ce n’est pas un serveur normal mais qu’il doit se connecter à un master pour avoir ses données

5.1 – Créer le fichier standby.signal

sudo -u postgres touch /var/lib/postgresql/17/main/standby.signal

5.2 – Configurer la connexion au master

  • Modifier le fichier /var/lib/postgresql/*/main/postgresql.auto.conf
  • ajouter
primary_conninfo = 'host=192.168.1.114 port=5432 user=replicator password=motdepasseutilisateur'

(Attention, l’ip est l’ip du Master, le mot de passe est le mot de passe rentré à l’étape 3.1)

  • Enregistrer le fichier

6 – Démarrer le service PostgreSQL sur le Slave

sudo systemctl start postgresql@17-main

7 – Vérifications

On va faire trois vérifications

7.1 – Sur le master, rentrer en mode sql

sudo -i -u postgres
psql
  • Écrire
SELECT pid, state, client_addr FROM pg_stat_replication;

Le retour dois être xxxx streaming ip_du_slave

Le Master est bien configuré

7.2 – Sur le Slave, rentrer en mode sql

sudo -i -u postgres
psql
  • Écrire
SELECT pg_is_in_recovery();
  • T pour true, le slave est bien configuré

7.3 – Sur PGAdmin (si installé)

  • On crée un enregistrement sur la base Master
  • On vérifie sur la base Slave

Les données sont bien renvoyées sur le Slave