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
