PostgreSQL
Créé un utilisateur et sa base
CREATE USER myuser WITH ENCRYPTED PASSWORD 'mypwd'; CREATE DATABASE mydb OWNER myuser;
Modifier le mot de passe d'un utilisateur
ALTER USER username WITH PASSWORD 'secret';
Mise en place d'un réplication
Tester sur PostgreSQL 15 en Debian Bookworm.
Sur le serveur maître (pré-installé et alimenté, IP 10.0.0.50
dans l'exemple suivant) :
- éditer le fichier
/etc/postgresql/15/main/postgresql.conf
:- ajuster le paramètre
listen_addresses
pour qu'il écoute sur une adresse accessible depuis le serveur esclave (ou*
pour0.0.0.0
) - mettre le paramètre
wal_level
àreplica
- mettre le paramètre
max_wal_senders
à3
par exemple (nombre maximum de connexion simultanées de serveurs esclaves) - pour une connexion synchrone, ajuster également :
synchronous_commit = on
synchronous_standby_names = *
- Créer un utilisateur dédié à la réplication :
sudo -u postgres createuser –replication -P replication
- Autoriser les connexions de cette utilisateur depuis la machine esclave en ajoutant la ligne suivante dans le fichier
/etc/postgresql/15/main/pg_hba.conf
:host replication rep_user 10.0.0.51/32 scram-sha-256
- Redémarrer PostgreSQL :
systemctl restart postgresql
- Ajuster le parefeu pour accepter les connexions PostgreSQL (port TCP 5432 classiquement) depuis le serveur esclave
Sur le serveur esclave (pré-installé, peut importe la base, elle va être supprimée, IP 10.0.0.51
dans l'exemple suivant) :
- Ajuster le parefeu pour accepter les connexions sortantes PostgreSQL (port TCP 5432 classiquement) vers le serveur maître
- Stopper PostgreSQL :
systemctl stop postgresql
- Supprimer les données de la base actuelle :
rm -rf /var/lib/postgresql/15/*
- Restaurer les données depuis l'ancien serveur :
time sudo -u postgres pg_basebackup -R -h 10.0.0.50 -U replication -D /var/lib/postgresql/15/main/ -P
- Éditer le fichier
/etc/postgresql/15/main/postgresql.conf
et ajouterhot_standby = on
- Redémarrer PostgreSQL :
systemctl start postgresql
Pour vérifier que le serveur esclave est bien démarré et synchronisé, utiliser les requêtes SQL suivantes :
- depuis le serveur maître :
SELECT usename, application_name, client_addr, state, sync_priority, sync_state FROM pg_stat_replication;
- depuis le serveur esclave :
SELECT * FROM pg_stat_wal_receiver;
Resynchronisation
# Retrieve remote host configuration PGDIR=/var/lib/postgresql/15/main PGUSER=$(grep primary_conninfo $PGDIR/postgresql.auto.conf |sed 's/.*user=\([^ ]\+\) .*/\1/') PGPASSWORD=$(grep primary_conninfo $PGDIR/postgresql.auto.conf |sed 's/.* password=\([^ ]\+\) .*/\1/') PGHOST=$(grep primary_conninfo $PGDIR/postgresql.auto.conf |sed 's/.* host=\([^ ]\+\) .*/\1/') cat << EOF Remote host: $PGHOST Username: $PGUSER Password: $PGPASSWORD EOF # Start resync systemctl stop postgresql rm -rf $PGDIR/* time sudo -u postgres pg_basebackup -h $PGHOST -U $PGUSER -D $PGDIR/ -R --progress systemctl start postgresql