Réplication Physique avancée

Module W2B

Dalibo SCOP

24.04

17 avril 2024

Sur ce document

Formation Module W2B
Titre Réplication Physique avancée
Révision 24.04
PDF https://dali.bo/w2b_pdf
EPUB https://dali.bo/w2b_epub
HTML https://dali.bo/w2b_html
Slides https://dali.bo/w2b_slides
TP https://dali.bo/w2b_tp
TP (solutions) https://dali.bo/w2b_solutions

Licence Creative Commons CC-BY-NC-SA

Cette formation est sous licence CC-BY-NC-SA. Vous êtes libre de la redistribuer et/ou modifier aux conditions suivantes :

  • Paternité
  • Pas d’utilisation commerciale
  • Partage des conditions initiales à l’identique

Marques déposées

PostgreSQL® Postgres® et le logo Slonik sont des marques déposées par PostgreSQL Community Association of Canada.

Versions de PostgreSQL couvertes

Ce document ne couvre que les versions supportées de PostgreSQL au moment de sa rédaction, soit les versions 12 à 16.

Réplication physique avancée

PostgreSQL

Introduction

  • Supervision
  • Fonctionnalités avancées

Au menu

  • Supervision
  • Gestion des conflits
  • Asynchrone ou synchrone
  • Réplication en cascade
  • Slot de réplication
  • Log shipping

Supervision (streaming)

  • Quelles vues et fonctions utilitaires ?
  • Comment voir et calculer le retard des secondaires ?

Utilitaires pour le streaming

  • pg_is_in_recovery() : instance en réplication ?
  • Calcul du retard en octets :
-- primaire
SELECT pg_wal_lsn_diff ( pg_current_wal_lsn(), '0/73D3C1F0' );
  • et en temps
-- secondaire
SELECT now() - pg_last_xact_replay_timestamp() ; -- si activité

pg_stat_replication

Type de réplication & lag des secondaires :

SELECT * FROM pg_stat_replication ;
-[ RECORD 1 ]----+------------------------------
pid              | 286511
usesysid         | 10
usename          | postgres
application_name | secondaire2
client_addr      | 192.168.0.55
client_hostname  | 
client_port      | -1
backend_start    | 2023-12-19 10:41:47.431471+01
backend_xmin     | 
state            | streaming
sent_lsn         | 14/C402A000
write_lsn        | 14/C402A000
flush_lsn        | 14/C402A000
replay_lsn       | 14/C311D460
write_lag        | 00:00:00.032183
flush_lag        | 00:00:00.032601
replay_lag       | 00:00:02.984354
sync_priority    | 1
sync_state       | sync
reply_time       | 2023-12-19 11:05:37.903584+01

Autres vues pour le streaming

  • S’il y un slot
    • pg_replication_slots
  • Sur le secondaire
    • pg_stat_wal_receiver

Supervision (log shipping)

  • Le primaire ne sait rien
  • Supervision de l’archivage comme pour du PITR
    • pg_stat_archiver
  • Secondaire :
    • pg_wal_lsn_diff()
    • traces
    • calcul du retard manuel (pg_last_wal_replay_lsn())

Conflits de réplication

Détection des conflits de réplication

  • Une requête en lecture pose des verrous
    • conflit possible avec changements répliqués !
  • Vue pg_stat_database_conflicts (secondaires)
  • Traces :
    • log_recovery_conflict_waits (v14+)

Prévenir les conflits de réplication

  • wal_standby_streaming_delay
  • hot_standby_feedback à on + wal_receiver_status_interval (10s)
  • gênent le vacuum !

Contrôle de la réplication

  • pg_wal_replay_pause() : mettre en pause le rejeu
  • pg_wal_replay_resume() : reprendre
  • pg_is_wal_replay_paused() : statut
  • Utilité :
    • requêtes longues
    • pg_dump depuis un secondaire

Réplication synchrone

Le primaire attend l’enregistrement sur le secondaire.

  • Comment configurer ?
  • Comment limiter l’impact sur les performances ?

Secondaires synchrones

  • Par défaut : réplication physique asynchrone
  • Secondaires synchrones :
# s1 synchrone, s2 en dépannage
synchronous_standby_names = 'FIRST 1 (s1, s2)'
# 2 synchrones au moins
synchronous_standby_names = 'ANY 2 (s1,s2,s3)'
# n'importe quel secondaire
synchronous_standby_names = '*'
  • Plusieurs synchrones simultanés possibles
    • ou un quorum

Niveau de synchronicité & performances

  • Niveau de synchronicité :
SET synchronous_commit = off / local / remote_write / on / remote_apply
  • Ajustable par base/utilisateur/session/transaction
  • Risque de blocage du primaire à cause des secondaires !

Réplication en cascade

  • Un secondaire peut fournir les informations de réplication
  • Décharger le serveur primaire de ce travail
  • Diminuer la bande passante du serveur primaire

Décrochage d’un secondaire

  • Par défaut, le primaire n’attend pas les secondaires pour recycler ses WAL
    • risque de « décrochage » !
  • 3 solutions :
  • archivage en plus du streaming
    • bascule automatique
    • mutualisation avec sauvegarde PITR
  • Slot de réplication
  • Garder des journaux
    • wal_keep_size (v13+) / wal_keep_segments (<13)

Sécurisation par log shipping

  • archive_command / restore_command
    • script par l’outil PITR
    • ou cp, scp, lftp, rsync, script…
  • Nettoyage
    • rétention des journaux si outil PITR
    • ou outil dédié :
archive_cleanup_command = '/usr/pgsql-14/bin/pg_archivecleanup -d rep_archives/ %r'

Slot de réplication : mise en place

  • Slot de réplication sur le primaire :
    • max_replication_slots
    • NB : non répliqué !
    • création manuelle :
    SELECT pg_create_physical_replication_slot ('nomsecondaire') ;
  • Secondaire :
    • dans postgresql.conf
    primary_slot_name = 'nomsecondaire'
    • redémarrage de l’instance (<v13) ou rechargement (v13+)

Slot de réplication : avantages & risques

  • Avantages :
    • plus de risque de décrochage des secondaires
    • supervision facile : pg_replication_slots
    • utilisable par pg_basebackup
  • Risque : accumulation des journaux
    • danger pour le primaire !
    • sécurité : max_slot_wal_keep_size (v13+)
  • Risque : vacuum bloqué
    • hot_standby_feedback ?

Synthèse des paramètres

Serveur primaire

Log shipping Streaming
wal_level = replica * wal_level = replica *
archive_mode = on *
archive_command *
archive_library
archive_timeout wal_sender_timeout
max_wal_senders
max_replication_slots
wal_keep_size
max_slot_wal_keep_size *

Serveur secondaire

Log shipping Streaming
wal_level = replica * wal_level = replica *
restore_command *
archive_cleanup_command
(selon outil) primary_conninfo *
wal_receiver_timeout
hot_standby
primary_slot_name*
max_standby_archive_delay max_standby_streaming_delay
hot_standby_feedback
wal_receiver_status_interval

Conclusion

  • Système de réplication fiable…
    • et très complet

Questions

N’hésitez pas, c’est le moment !

Quiz

Travaux pratiques

Réplication asynchrone en flux avec deux secondaires

Slots de réplication

Log shipping

Réplication synchrone en flux avec trois secondaires

Réplication synchrone : cohérence des lectures (optionnel)

Travaux pratiques (solutions)