PKS Standby failover architecture¶
PKS peut-être déployé en mode actif passif, afin de permettre une reprise en cas d'incident majeur. Dans cette configuration, les données seront synchronisées du serveur primaire vers le serveur secondaire. A noter que dans la configuration présentée dans cette page, la base secondaire n'est pas accessible en écriture.
Pré-requis¶
Vous devez déployer 2 instances complètes de PKS en suivant le process standard.
Mise en oeuvre¶
Les ports IP prévus pour la base de données primaire-secondaire sont, par exemple, les suivants :
- Primary DB: 10.0.3.10:5432
- Secondary DB: 10.0.3.11:5432
Préparation du server primaire¶
Warning
La DB doit-être redémarrée !
Créer un compte spécial pour les flux de réplication primary-secondary :
# 1. Entrer dans le container
docker exec -it pks-db bash
# 2. Se connecter à PostgreSQL
psql -U postgres
# 3. Créer le rôle utilisateur
CREATE ROLE repuser WITH LOGIN REPLICATION CONNECTION LIMIT 5 PASSWORD '123456';
# Username repuser; Maximum number of links: 5; Password: 123456
# 4. Voir les rôles
\du
List of roles
Role name | Attributes | Member of
-----------+------------------------------------------------------------+-----------
postgres | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
repuser | Replication +| {}
| 5 connections |
# 5. Quitter
\q
exit
Modifier le fichier de configuration du primaire :
# 1. Entrer dans le dossier du serveur primaire
cd /srv/pks/db
# 2. Et ajouter la règle à la fin
echo "host replication repuser 10.0.3.11/24 md5" >> pg_hba.conf
Modifier le fichier postgresql.conf , en trouvant les lignes suivantes, en décommentant et en modifiant ainsi:
archive_mode = on # Enable Archive Mode
archive_command = '/bin/date' # Set archiving behavior
# The sum of the number of concurrent connections from the slave to the host
max_wal_senders = 10
# Specifies that if the backup server needs to obtain log segment files for stream replication, pg_ The minimum size of past log file segments that can be retained in the wal directory
wal_keep_size = 16
# Specify a list of backup servers that support synchronous replication
synchronous_standby_names = '*'
Pour plus de détails sur les paramètres, veuillez vous référer à : https://www.postgresql.org/docs/
Redémarrer le container primaire :
#Using pg_ctl stop stops the database safely
docker exec -it -u postgres pks-db pg_ctl stop
docker start pks-db
Configuration du serveur secondaire¶
Editer la configuration de docker compose :
# Créer le dossier repl
mkdir /srv/pks/repl
chmod 777 /srv/pks/repl
# Stop pks
pks stop
# line 92 add :
- pks-db-repl:/var/lib/postgresql/repl
# line 180 add :
pks-db-repl:
driver: local
driver_opts:
type: 'none'
o: 'bind'
device: '/srv/pks/repl'
# Et démarrer pks
pks start
Synchronizer les donner
# 1. Entrer dans le container
docker exec -it -u postgres pks-db bash
# 2. Sauvegardez les données de l'hôte dans le dossier repl. Saisissez ici le mot de passe défini ci-dessus : 123456
pg_basebackup -R -D /var/lib/postgresql/repl -Fp -Xs -v -P -h 10.0.3.11 -p 5432 -U repuser
pg_basebackup: initiating base backup, waiting for checkpoint to complete
pg_basebackup: checkpoint completed
pg_basebackup: write-ahead log start point: 0/2000028 on timeline 1
pg_basebackup: starting background WAL receiver
pg_basebackup: created temporary replication slot "pg_basebackup_154"
24264/24264 kB (100%), 1/1 tablespace
pg_basebackup: write-ahead log end point: 0/2000138
pg_basebackup: waiting for background process to finish streaming ...
pg_basebackup: syncing data to disk ...
pg_basebackup: renaming backup_manifest.tmp to backup_manifest
pg_basebackup: base backup completed
# 3. Sortir du container après que la sauvegarde soit terminée
exit
Reconstruire le container secondaire
Grâce à la sauvegarde initiale de l'étape précédente, vous pouvez maintenant reconstruire le conteneur secondaire en utilisant les données contenues dans /srv/pks/repl. Supprimez d'abord le répertoire db, puis remplacez le répertoire repl par db, qui est le répertoire de données de la base de données secondaire :
# 1. Supprimer le container
docker rm -f pks-db
# 2. Supprimer le dossier de base et renommer repl en db
cd /srv/pks/
rm -rf db
mv repl db
cd /srv/pks/db
# 3. Voir les informations de configuration
# postgresql.auto.conf contiendra les informations nécessaires à la réplication
cat postgresql.auto.conf
primary_conninfo = 'user=repuser password=123456 channel_binding=prefer host=10.0.3.11 port=5432 sslmode=prefer sslcompression=0 ssl_min_protocol_version=TLSv1.2 gssencmode=prefer krbsrvname=postgres target_session_attrs=any'
Reconstruire le container secondaire:
# Supprimer les paramètres ajouté plus haut dans le fichier du docker compose
# Redémarrer le container DB
pks start
Visualiser les informations de réplication primaire-secondaire¶
ps -aux | grep postgres
Main library process:
postgres: walsender repuser 172.18.0.1(52678) streaming 0/3000148
Process from library:
postgres: walreceiver streaming 0/3000148
Visualiser les informations de réplication
# Entrer dans le container primaire et basculer en utilisateur postgres
docker exec -it pks-db bash
psql -U postgres
-- Query replication information
select * from pg_stat_replication;
pid | usesysid | usename | application_name | client_addr | client_hostname...
170 16384 repuser walreceiver 172.18.0.1 52678 2021-09-29 05:57:30.471391+00...
Gestion¶
Vous pouvez forcer les requêtes SIP sur l'un des 2 serveurs.
La base de données du serveur secondaire est uniquement en lecture seule, permettant un fonctionnement du SBC mais ne permettant pas d'effectuer de modification.
Si vous voulez forcer le trafic SIP sur un serveur, il suffit d'éteindre le container du proxy SIP : docker start pks-sip