Blog ENI : Toute la veille numérique !
🐠 -25€ dès 75€ 
+ 7 jours d'accès à la Bibliothèque Numérique ENI. Cliquez ici
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
  1. Livres et vidéos
  2. PostgreSQL
  3. Réplication
Extrait - PostgreSQL Administration et exploitation de vos bases de données (4e édition)
Extraits du livre
PostgreSQL Administration et exploitation de vos bases de données (4e édition) Revenir à la page d'achat du livre

Réplication

Réplication en flux

La réplication intégrée à PostgreSQL, dite « Streaming Replication », se base sur les mécanismes de sauvegarde et de restauration, pour mettre en œuvre une ou plusieurs instances dites « standby » d’une instance principale de PostgreSQL. 

Les procédés de sauvegardes physiques intégrées s’appuient eux-mêmes sur les journaux de transactions, et logiquement, la réplication de données consiste à rejouer, en continu, sur les instances « standby » le contenu de ces journaux de transactions.

Les premières techniques de réplication consistaient à relire les journaux de transactions archivés dans le cadre du paramètre archive_command. Cette technique existe toujours, et peut être utilisée pour permettre une souplesse accrue de la topologie des nœuds PostgreSQL.

Avec les versions 9 de PostgreSQL est apparu le protocole de réplication intégré, qui permet à une instance de se connecter à une autre instance, pour lire en continu le contenu des journaux de transactions.

Cette technique de réplication peut être utilisée en cascade, c’est-à-dire que chacun des serveurs « standby » peut servir de source de réplication à un autre serveur « standby » limitant ainsi le poids des serveurs « standby » sur le serveur principal.

1. Initialisation

L’initialisation d’une instance « standby » consiste à faire une sauvegarde physique, avec un outil comme pg_basebackup, tout en s’assurant de toujours pouvoir avoir accès aux journaux de transactions intermédiaires entre le début de la sauvegarde et le moment du démarrage de l’instance « standby ».

Ce dernier point est important car, comme dans le processus de restauration PITR, la continuité des journaux de transactions est le moyen utilisé pour assurer la continuité de la réplication.

La commande pg_basebackup permet de faire cette sauvegarde physique initiale simplement à partir de l’instance principale.

Les outils de sauvegarde comme pgbarman, pgbackrest, ou wal-e peuvent être...

Réplication en cascade

Il est possible d’élaborer des topologies de réplication complexes, notamment en mettant des instances « standby » les unes à la suite des autres. Ce choix est fait en fonction des possibilités du réseau, des besoins réels, et des évolutions envisagées dans le cadre du plan de reprise ou de continuité d’activité (PRA/PCA).

Il n’existe pas de limite au nombre d’instances « standby » qu’il est possible de mettre en cascade.

Changement de topologie

Il n’existe pas de mécanisme de bascule automatique intégrée à PostgreSQL. Des outils dédiés existent, mais s’incluent dans des plans de haute disponibilité qui dépassent le cadre de cet ouvrage.

Il existe une commande permettant à une instance « standby » de devenir une instance « primary » : il s’agit de la commande promote de l’outil pg_ctl, qui va simplement stopper la réplication et permettre les transactions en lecture/écriture. À cette occasion, l’instance va changer de ligne de temps (visible dans les noms des journaux de transactions) et il n’est alors plus possible de connecter l’instance promue à son ancienne instance « primary ». La commande est reprise dans le script de contrôle pg_ctlcluster disponible dans les systèmes Debian.

Les autres instances « standby » peuvent être connectées à cette nouvelle instance « primary » en modifiant le paramètre host de la directive primary_conninfo du fichier recovery.conf, et en indiquant la nouvelle ligne de temps à suivre, avec la directive recovery_target_timeline, ou plus simplement en indiquant latest comme valeur.

Réplication synchrone

Par défaut, la réplication intégrée est asynchrone, c’est à dire que la transaction dans le serveur « primary » est validée avant d’être répliquée. Il est possible de configurer la réplication en mode synchrone afin de répliquer les données avant de valider la transaction. Par défaut, les données sont répliquées, mais pas immédiatement visibles dans l’instance « standby ». À partir de la version 9.6 de PostgreSQL, il est possible de configurer la réplication pour qu’elle soit synchrone jusqu’à la visibilité des données dans l’instance « standby ».

Une instance « standby » doit être déclarée dans la directive synchronous_standby_names de l’instance « primary ». Cette directive peut contenir une liste de noms, séparés par des virgules, ou des combinaisons avec les opérateurs FIRST ou ANY, comme expliqué au chapitre Exploitation. Chaque instance « standby » s’identifie en utilisant le paramètre application_name de la chaîne de connexion primary_conninfo du fichier recovery.conf.

Une fois l’instance « standby » démarrée pour...

Réplication logique intégrée

À partir de la version 10 de PostgreSQL, il est possible de mettre en place une réplication logique sans outil supplémentaire, c’est-à-dire sans utiliser Slony ou Londiste. Cette fonctionnalité s’appuie sur les journaux de transactions enrichis et décodés par les fonctions de décodage logique de PostgreSQL. Dans le cas de la réplication logique, quelle que soit la technique, on parle de « provider » pour désigner l’instance qui fournit la donnée, et de « subscriber » pour l’instance la recevant.

Afin de permettre cette réplication, il est nécessaire de modifier la valeur de la directive de configuration wal_level à logical, au lieu de replica par défaut. Cette modification nécessite un redémarrage de l’instance.

Une fois cette modification appliquée, et le fichier pg_hba.conf adapté pour accepter les connexions, les ordres CREATE PUBLICATION et CREATE SUBSCRIPTION suivants permettent de mettre en place un jeu de tables à répliquer, puis de s’y abonner depuis une autre instance.

L’ordre suivant permet de créer la publication, dans l’instance où les données des tables sont modifiées :


CREATE PUBLICATION clients_repli FOR TABLE public.clients, 
public.factures, public.prestations...

Réplication logique avec Slony

L’outil Slony-I est un système de réplication logique asynchrone maître-esclave. Il permet de répliquer des données entre plusieurs serveurs PostgreSQL, sachant qu’un seul de ces serveurs sera le serveur maître et les autres, les serveurs esclaves. Ces serveurs esclaves peuvent être mis en cascade, mais la quantité de serveurs esclaves doit rester raisonnable, afin de ne pas avoir d’impact négatif sur les performances.

Le serveur maître est celui qui doit être utilisé par les applications pour toutes les modifications de données. Les serveurs esclaves reçoivent une copie de ces modifications de façon asynchrone. Cette réplication asynchrone implique que le serveur maître n’attend pas la validation des serveurs esclaves pour valider sa propre transaction à l’application cliente. La validation d’une transaction sur le serveur maître ne tient compte que de l’état du serveur maître, et pas de celui des serveurs esclaves.

La réplication peut s’effectuer sur un réseau local ou sur des réseaux étendus (WAN) ; ceci est dû au fait que Slony utilise des connexions TCP entre les serveurs.

Les différentes possibilités de Slony sont :

  • La possibilité d’ajouter des serveurs dans le groupe de réplications pendant le fonctionnement de ce groupe, ainsi que la possibilité de remplacer un serveur maître par un autre.

  • La possibilité de remplacer le serveur maître lors d’un dysfonctionnement, par exemple une indisponibilité, temporaire ou non.

  • La possibilité de modifier la structure des données pendant le fonctionnement et de propager ces modifications à tous les serveurs esclaves.

L’unité de réplication de Slony est la table. Dans un même groupe de serveurs, Slony-I copie les données d’une table en utilisant des déclencheurs placés sur ces tables à l’initialisation de Slony. Il est possible d’utiliser plusieurs tables, à condition que toutes les tables existent au sein de la même base de données.

De plus, chaque table doit avoir une clé primaire ; si le modèle de données ne définit pas de clé primaire...

Évolution des solutions de réplication

Les évolutions techniques amenées par les dernières versions de PostgreSQL permettent d’envisager des développements autour de la réplication logique intégrée à PostgreSQL, sans surcharge ni double écriture et donc sans impact sur les performances.

D’autres solutions voient le jour et vont permettre de compléter les possibilités actuelles de PostgreSQL 

BDR permet de créer des réplications de serveurs principaux à serveurs principaux, parfois appelées réplications multimaîtres. Cette solution est déjà fonctionnelle et devrait être intégrée dans une future version de PostgreSQL, peut-être la version 11 qui sortira courant 2018.