Mise à jour majeure par réplication logique

Pour les versions de PostgreSQL supérieures à 10

Dalibo & Contributors

Au menu

  • Principes de la réplication logique
  • Rappels sur les migrations de versions majeures
  • Exemples d’utilisation
  • Mise en place d’une mise à jour majeure

Principes de la réplication logique

  • Fonctionnement
  • Quelques termes
  • Processus et paramètres
  • Granularité et Type de réplication
  • Limitations

Fonctionnement

  • Réplication logique avant la version 10
    • Non native
    • Uniquement grâce à des outils externes par triggers (slony, bucardo,…)
  • Réplication logique après la 10
    • Native
    • Asymétrique
    • Asynchrone / synchrone

Quels termes

  • Sur l’instance d’origine (ou primaire)
    • Publication
  • Sur l’instance de destination (ou réplicat)
    • Abonnement

Les processus et les paramètres

  • Sur l’instance d’origine (primaire)
    • Paramètre wal_level = logical
    • Processus wal sender (max_wal_senders)
    • Slot de réplication créé automatiquement (max_replication_slots)
  • Sur l’instance de destination (réplicat)
    • Processus logical replication worker
    • Autorisation de connexion sur l’instance de publication

Granularité de la réplication logique

  • Par table
    • publication pour toutes les tables
    • publications pour des tables spécifiques
  • Par opération
    • insert, update, delete

Type de réplication logique

  • Réplication complète
    • CREATE PUBLICATION bd1_publication FOR ALL TABLES;
  • Réplication partielle
    • CREATE PUBLICATION bd1_publication FOR TABLE t1,t2,...;
    • CREATE PUBLICATION bd1_publication FOR TABLE t1 WHERE (c1 = 'xxx'); à partir de la V15
  • Réplication croisée

Limitations de la réplication logique

  • Pas de réplication des requêtes DDL (et TRUNCATE pour PostgreSQL < 11)
  • Pas de réplication des valeurs des séquences
  • Pas de réplication des LO (table système)
  • Pas de réplication (automatique) des partitions (<13)
  • Pas de réplication des vues, vues matérialisées, tables non journalisées
  • Réplication déclenchée uniquement lors du COMMIT (< v14)
  • Coût en CPU et I/O

Rappels sur les migrations de versions majeures

  • pg_dump / pg_restore
  • pg_upgrade mode normal
  • pg_upgrade mode lien physique
  • réplication logique
Outil Coupure production Retour arrière Fragmentation
pg_dump / pg_restore Élevé = sauvegarde + restauration OUI NON
pg_upgrade Moyen = copie physique des données OUI OUI
pg_upgrade Court = mise à jour directe des fichiers NON OUI
réplication logique Très Court = mais préparation en amont OUI OUI

Exemples d’utilisation

1 : Partage de bases

2 : Rassemblement de bases

3 : Migration échelonnée

Mise en place

Préparation de l’instance origine (primaire)

  • wal_level = logical (attention redémarrage requis)
  • Création de la publication
    • CREATE PUBLICATION ... FOR ALL TABLES;
  • Création de l’utilisateur pour la réplication
  • Attribution des droits sur les objets répliqués
    • GRANT SELECT ON ALL TABLES IN SCHEMA public TO user_repli;

Réplication des schémas

  • Récupération et création des objets globaux (utilisateurs, tablespaces)
    • utiliser pg_dumpall -g pour générer le script
  • Récupération et création des objets des bases à répliquer
    • utiliser pg_dump --schema-only pour générer le script

Abonnement à la publication

Sur l’instance destination (replicat)

  • Création de l’abonnement
    • CREATE SUBSCRIPTION ... CONNECTION ... PUBLICATION ...
  • Contrôle de la réplication
    • SELECT * FROM pg_subscription_rel

La bascule sur l’instance répliquée

  • Sur l’instance origine (primaire)
    • Arrêt des connexions applicatives (par le pg_hba.conf par exemple)
    • Récupération des paramètres des séquences
      • Ne pas oublier : les séquences ne sont pas répliquées !
      • Création d’un script de génération des séquences
  • Sur l’instance destination (réplicat)
    • Modification des paramètres des séquences
      • Rejeu du script généré
    • Suppression de l’abonnement
      • DROP SUBSCRIPTION ...

Supervision

  • Contrôle de la réplication initiale
    • SELECT * FROM pg_subscription_rel
  • Contrôle de la réplication
    • SELECT * FROM pg_stat_replication
  • Contrôle de l’abonnement
    • SELECT * FROM pg_stat_subscription

Atelier (Enoncé)

Atelier (solutions)