Cette procédure détaille la mise en place d'une architecture de réplication primaire-secondaire simplifiée sur une seule instance de serveur Linux, idéale pour comprendre les mécanismes de synchronisation de PostgreSQL.
Spécifications de l'environnement
| Paramètre | Valeur |
|---|---|
| Système d'exploitation | CentOS 7 / RHEL 7 |
| Version Database | PostgreSQL 10.x |
| Port Instance Primaire | 5433 |
| Port Instance Secondaire | 5434 |
Pour cet exercice, les deux instances résident sur la même machine. L'utilisateur système dédié est postgres.
1. Préparation et initialisation de l'instance maître
Après l'installation des paquets via yum, nous créons l'arborescence des données et initialisons la base de données principale.
# Création des répertoires de données
mkdir -p /srv/postgresql/primary
chown -R postgres:postgres /srv/postgresql
# Basculer vers l'utilisateur postgres
su - postgres
# Initialisation du cluster primaire
initdb -D /srv/postgresql/primary
2. Configuration de l'instance primaire
Modifiez le fichier postgresql.conf pour définir le port et l'accès réseau :
# Fichier : /srv/postgresql/primary/postgresql.conf
port = 5433
listen_addresses = 'localhost'
wal_level = replica
max_wal_senders = 5
unix_socket_directories = '/tmp'
Ensuite, autorisez les connexions de réplication dans pg_hba.conf :
# Fichier : /srv/postgresql/primary/pg_hba.conf
# Autoriser l'utilisateur local à demander la réplication
host replication all 127.0.0.1/32 trust
Démarrez l'instance primaire :
pg_ctl -D /srv/postgresql/primary -l /srv/postgresql/primary/logfile start
3. Clonage des données pour l'instance secondaire
L'instance secondaire doit démarrrer à partir d'une copie conforme de l'instance primaire. Nous utilisons ici une copie physique des fichiers.
# Arrêt temporaire de la source (ou utilisation de pg_basebackup)
# Pour cet exemple simplifié, nous copions directement les fichiers
cp -R /srv/postgresql/primary /srv/postgresql/secondary
# Nettoyage des fichiers inutiles sur la copie secondaire
rm -rf /srv/postgresql/secondary/postmaster.pid
4. Configuration de l'instance secondaire
Il est nécessaire de modifier le port pour éviter les conflits et de créer le fichier de contrôle de récupération.
Dans /srv/postgresql/secondary/postgresql.conf :
port = 5434
unix_socket_directories = '/tmp'
Créez le fichier recovery.conf dans le répertoire de données de l'esclave :
# Fichier : /srv/postgresql/secondary/recovery.conf
standby_mode = 'on'
primary_conninfo = 'host=127.0.0.1 port=5433 user=postgres'
recovery_target_timeline = 'latest'
Ajustez les permissions pour garantir que PostgreSQL puisse lire les répertoires :
chmod 0700 /srv/postgresql/secondary
Démarrez l'instance secondaire :
pg_ctl -D /srv/postgresql/secondary -l /srv/postgresql/secondary/logfile start
5. Validation de la synchronisation
Pour vérifier que la réplication fonctionne, créez une table sur le serveur primaire (port 5433) et observez sa propagation sur le serveur secondaire (port 5434).
Sur le Primaire :
psql -p 5433 -d postgres -c "CREATE TABLE stocks (id SERIAL PRIMARY KEY, produit TEXT, quantite INT);"
psql -p 5433 -d postgres -c "INSERT INTO stocks (produit, quantite) VALUES ('Serveur Dell', 5), ('Switch Cisco', 12);"
Sur le Secondaire :
# Lecture des données répliquées
psql -p 5434 -d postgres -c "SELECT * FROM stocks;"
Le résultat devrait afficher les données insérées précédemment. Notez que toute tentative d'écriture (INSERT/UPDATE) sur le port 5434 échouera, car l'instance secondaire est en mode lecture seule (read-only).