Réplication Logique : présentation et exercice pratique

Workshop Réplication Logique

Dalibo & Contributors

Réplication Logique : présentation et exercice pratique

PostgreSQL

Introduction

  • Principes
  • Mise en place
    • entre 2 versions majeures différentes
  • Supervision
  • Limitations

Principes

  • Réplication physique
    • depuis la 9.0
    • beaucoup de possibilités
    • mais des limitations
  • Réplication logique
    • permet de résoudre certaines des limitations de la réplication physique
    • auparavant uniquement disponible via des solutions externes
    • en interne depuis la version 10

Réplication physique vs logique

  • Réplication physique
    • instance complète
    • par bloc
    • asymétrique
    • asynchrone/synchrone
  • Réplication logique
    • par table
    • par type d’opération
    • asymétrique (une origine des modifications)
    • asynchrone/synchrone

Limitations de la réplication physique

  • Pas de réplication partielle
  • Pas de réplication entre différentes versions majeures
  • Pas de réplication entre différentes architectures
  • Pas de réplication multidirectionnelle

Quelques termes essentiels

  • Serveur origine
    • et serveurs de destination
  • Publication
    • et abonnement

Réplication en flux

  • Paramètre wal_level
  • Processus wal sender
    • mais pas de wal receiver
    • un logical replication worker à la place
  • Asynchrone / synchrone
  • Slots de réplication

Granularité

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

Limitations de la réplication logique

  • Pas de réplication des requêtes DDL
    • et donc pas de TRUNCATE
  • Pas de réplication des valeurs des séquences
  • Pas de réplication des LO (table système)
  • Contraintes d’unicité obligatoires pour les UPDATE/DELETE
  • Coût en CPU et I/O

Mise en place

  • Cas simple
    • 2 serveurs
    • une seule origine
    • un seul destinataire
    • une seule publication
  • Plusieurs étapes
    • configuration du serveur origine
    • configuration du serveur destination
    • création d’une publication
    • ajout d’une souscription

Configurer le serveur origine

  • Création et configuration de l’utilisateur de réplication
    • et lui donner les droits de lecture des tables à répliquer
  • Configuration du fichier postgresql.conf
    • wal_level = logical
  • Configuration du fichier pg_hba.conf
    • autoriser une connexion de réplication du serveur destination

TP : Configuration du serveur origine s1

  • Création et configuration de l’utilisateur de réplication
CREATE ROLE logrepli LOGIN REPLICATION;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO logrepli;
  • Fichier postgresql.conf
wal_level = logical
  • Fichier pg_hba.conf
local b1 logrepli trust
  • Redémarrer le serveur origine
  • Attention, dans la vraie vie, ne pas utiliser trust
    • et utiliser le fichier .pgpass

Configurer le serveur destination

  • Création de l’utilisateur de réplication
  • Création, si nécessaire, des tables répliquées
    • pg_dump -h serveur_origine -s -t la_table la_base | psql la_base

TP : Configurer le serveur destination s2

  • Création de l’utilisateur de réplication
CREATE ROLE logrepli LOGIN REPLICATION;
  • Création des tables répliquées (sans contenu)
createdb -p 5433 b1
pg_dump -p 5432 -s b1 | psql -p 5433 b1

Créer une publication complète

  • Ordre SQL
CREATE PUBLICATION nom
  [ FOR TABLE [ ONLY ] nom_table [ * ] [, ...]
    | FOR ALL TABLES ]
  [ WITH ( parametre_publication [= valeur] [, ... ] ) ]
  • parametre_publication étant seulement le paramètre publish
    • valeurs possibles : insert, update, delete
    • les trois par défaut

TP : Créer une publication complète

  • Création d’une publication de toutes les tables de la base b1 sur le serveur origine s1
CREATE PUBLICATION publi_complete
  FOR ALL TABLES;

Souscrire à une publication

  • Ordre SQL
CREATE SUBSCRIPTION nom
    CONNECTION 'infos_connexion'
    PUBLICATION nom_publication [, ...]
    [ WITH ( parametre_souscription [= value] [, ... ] ) ]
  • infos_connexion est la chaîne de connexion habituelle

Options de la souscription

  • copy_data
    • copie initiale des données (activé par défaut)
  • create_slot
    • création du slot de réplication (activé par défaut)
  • enabled
    • activation immédiate de la souscription (activé par défaut)
  • slot_name
    • nom du slot (par défaut, le nom de la souscription)
  • synchronous_commit
    • pour surcharger la valeur du paramètre synchronous_commit
  • connect
    • connexion immédiate (activé par défaut)

TP : Souscrire à la publication

  • Souscrire sur s2 à la publication de s1
CREATE SUBSCRIPTION subscr_complete
  CONNECTION 'port=5432 user=logrepli dbname=b1'
  PUBLICATION publi_complete;
  • Un slot de réplication est créé
  • Les données initiales sont immédiatement transférées

TP : Tests de la réplication complète

  • Insertion, modification, suppression sur les différentes tables de s1
  • Vérifications sur s2
    • toutes doivent avoir les mêmes données entre s1 et s2

Réplication partielle

  • Identique à la réplication complète, à une exception…
  • Créer la publication partielle
CREATE PUBLICATION publi_partielle
  FOR TABLE t1,t2;

Réplication croisée

  • On veut pouvoir écrire sur une table sur le serveur s1
    • et répliquer les écritures de cette table sur s2
  • On veut aussi pouvoir écrire sur une (autre) table sur le serveur s2
    • et répliquer les écritures de cette table sur s1

Supervision

  • Méta-données
  • Statistiques

Catalogues systèmes - méta-données

  • pg_publication
    • définition des publications
    • \dRp sous psql
  • pg_publication_tables
    • tables ciblées par chaque publication
  • pg_subscription
    • définition des souscriptions
    • \dRs sous psql

Vues statistiques

  • pg_stat_replication
    • statut de réplication
  • pg_stat_subscription
    • état des souscriptions
  • pg_replication_origin_status
    • statut des origines de réplication

Possibilités sur les tables répliquées

  • Possibilités sur les tables répliquées :
    • Index supplémentaires
    • Modification des valeurs
    • Colonnes supplémentaires
    • Triggers également activables sur la table répliquée
  • Attention à la cohérence

Empêcher les écritures sur un serveur destination

  • Par défaut, toutes les écritures sont autorisées sur le serveur destination
    • y compris écrire dans une table répliquée avec un autre serveur comme origine
  • Problème
    • serveurs non synchronisés
    • blocage de la réplication en cas de conflit sur la clé primaire
  • Solution
    • révoquer le droit d’écriture sur le serveur destination
    • mais ne pas révoquer ce droit pour le rôle de réplication !

Que faire pour les DDL

  • Les opérations DDL ne sont pas répliquées
  • De nouveaux objets ?
    • les déclarer sur tous les serveurs du cluster de réplication
    • tout du moins, ceux intéressés par ces objets
  • Changement de définition des objets ?
    • à réaliser sur chaque serveur

Que faire pour les nouvelles tables

  • Publication complète
    • rafraîchir les souscriptions concernées
  • Publication partielle
    • ajouter la nouvelle table dans les souscriptions concernées

Rappel des limitations

  • Pas de réplication des requêtes DDL
    • et donc pas de TRUNCATE
  • Pas de réplication des valeurs des séquences
  • Pas de réplication des LO (table système)
  • Contraintes d’unicité obligatoires pour les UPDATE/DELETE

Conclusion

  • Enfin une réplication logique
  • Réplication complète ou partielle
    • par objet (table)
    • par opération (insert/update/delete)

Questions

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