Nous allons mettre en place une réplication synchrone entre deux bases PostgreSQL
On part du principe que PostgreSQL est installé sur les serveurs
Dans notre exemple il y aura deux serveurs
- 192.168.1.114 qui sera le Master
- 192.168.1.184 qui sera le Slave
Dans notre exemple PostgreSQL est en version 17.7
1 – Préparer le master
Toutes les commandes seront à écrire sur le serveur master
- Éditer le fichier /etc/postgresql/17/main/postgresql.conf
nano /etc/postgresql/17/main/postgresql.conf
- Modifier / créer / de-commenter les lignes suivantes
listen_addresses = '*'
wal_level = replica
max_wal_senders = 10
max_replication_slots = 10
wal_keep_size = 1GB
# Pour la réplication synchrone :
synchronous_standby_names = 'node184'
synchronous_commit = on
(node184 sera le nom du standby que l’on paramétrera plus tard)
- Éditer le fichier /etc/postgresql/17/main/pg_hba.conf
nano /etc/postgresql/17/main/pg_hba.conf
- Rajouter sous host all all 0.0.0.0/0 md5
host replication replicator 192.168.1.184/32 md5
(Attention aux tabulations)
(192.168.1.184 est l’ip du slave selon la configuration)

(replicator est le nom de l’utilisateur qui fera la réplication et que l’on va créer à l’étape suivante)
- Créer l’utilisateur qui va servir pour la réplication
sudo -i -u postgres
psql
CREATE ROLE replicator WITH REPLICATION LOGIN ENCRYPTED PASSWORD 'motdepasse';
(Penser à mettre un mot de passe fort pour l’utilisateur)

- Relancer PostgreSQL pour mettre à jour le nouveau paramétrage
systemctl reload postgresql
2 – Préparer le Slave
Toutes les commandes seront à écrire sur le serveur slave
- On stoppe PostgreSQL
systemctl stop postgresql
- on supprime les données sur le serveur
rm -rf /var/lib/postgresql/17/main/*
- on récupére la base du Master
pg_basebackup -h 192.168.1.114 -U replicator -D /var/lib/postgresql/17/main -Fp -Xs -P -R
(Attention le 192.168.1.114 est l’ip du master à adapter selon la configuration)
-R pour créer automatiquement le fichier standby.signal et postgresql.auto.conf (ces fichiers servent à dire au serveur qu’il n’est plus un serveur en lecture-écriture mais que l’écriture se fait exclusivement à partir du master)
-Xs pour copier les WAL necessaires

- On va vérifier le fichier /var/lib/postgresql/17/main/postgresql.auto.conf
nano /var/lib/postgresql/17/main/postgresql.auto.conf
- on devrait avoir une ligne comme ça dedans
primary_conninfo = 'user=replicator password=motdepasse channel_binding=prefer host=192.168.1.114 port=5432 sslmode=prefer sslnegotiation=postgres sslcompression=0 sslcertmode=allow sslsni=1 ssl_min_protocol_version=TLSv1.2 gssencmode=prefer krbsrvname=postgres gssdelegation=0 target_session_attrs=any load_balance_hosts=disable'
(Bien vérifier le mot de passe et l’ip du master)
- Modifier la ligne pour ajouter application_name=node184 aprés port =5432
(node184 correspond au node que l’on a mis à l’étape 1 dans le fichier /etc/postgresql/17/main/postgresql.conf à la ligne synchronous_standby_names =)
- Changer les droits du fichier standby.signal pour les donner à postgres
chown postgres:postgres /var/lib/postgresql/17/main/standby.signal
chmod 600 /var/lib/postgresql/17/main/standby.signal
3 – Configuration de la réplication sur le Slave
- Éditer le fichier /etc/postgresql/17/main/postgresql.conf
- Ajouter / modifier / de-commenter
hot_standby = on

- Mettre au propre les droits du slave
chown -R postgres:postgres /var/lib/postgresql/17/main
chmod 700 /var/lib/postgresql/17/main
- Démarrer postgresql
systemctl start postgresql
4 – Vérification
4.1 Sur le master
sudo -i -u postgres
psql
SELECT application_name, state, sync_state FROM pg_stat_replication;
On devrait avoir

SHOW synchronous_standby_names;
SHOW synchronous_commit;

Tout est bien sur on
4.2 Sur PgAdmin (si installé)
- On insère une données sur le master

- La donnée est bien envoyées sur le slave



















