Maîtrise de la réplication PostgreSQL : Types et configuration expliqués

Maîtrisez la réplication PostgreSQL avec ce guide complet. Découvrez la réplication en flux (physique) et logique, leurs cas d'utilisation et comment les configurer. Assurez une haute disponibilité, une reprise après sinistre et une évolutivité en lecture pour votre base de données relationnelle open-source avancée.

47 vues

Maîtriser la Réplication PostgreSQL : Types et Configuration Expliqués

Dans le monde des bases de données relationnelles open-source avancées, PostgreSQL se distingue par sa robustesse, son extensibilité et ses fonctionnalités puissantes. Parmi celles-ci, la redondance des données et la haute disponibilité sont primordiales pour les applications critiques. La réplication PostgreSQL est le mécanisme qui vous permet d'atteindre ces objectifs en copiant les données d'un serveur PostgreSQL (le primaire) vers un ou plusieurs autres serveurs PostgreSQL (les répliques ou secondaires).

Cet article explore les concepts fondamentaux de la réplication PostgreSQL, en examinant les différents types disponibles et en fournissant des conseils pratiques sur la manière de les configurer. Comprendre ces mécanismes est crucial pour garantir que vos données sont toujours accessibles, protégées contre les pannes matérielles et capables de gérer des charges de lecture accrues. Nous couvrirons à la fois la réplication en streaming et la réplication logique, en expliquant leurs cas d'utilisation, leurs avantages et les étapes de configuration.

Pourquoi la Réplication PostgreSQL est Importante

Avant de plonger dans le « comment », il est essentiel de comprendre le « pourquoi ». La perte de données ou les temps d'arrêt prolongés peuvent avoir de graves conséquences pour les entreprises. La réplication répond à ces préoccupations en :

  • Haute Disponibilité (HA) : Si le serveur primaire tombe en panne, une réplique peut être rapidement promue pour devenir le nouveau primaire, minimisant ainsi les temps d'arrêt.
  • Reprise après Sinistre (DR) : Les répliques peuvent être situées dans différents emplacements géographiques, protégeant vos données contre les sinistres spécifiques à un site.
  • Mise à l'échelle des lectures : Décharger les charges de travail intensives en lecture vers les répliques peut améliorer les performances du serveur primaire, qui reste dédié aux opérations d'écriture.
  • Protection des données : La réplication agit comme une sauvegarde continue, offrant une copie de vos données plus à jour que les sauvegardes périodiques traditionnelles.

PostgreSQL offre deux méthodes principales de réplication : la réplication en streaming et la réplication logique. Bien que les deux permettent la synchronisation des données, elles fonctionnent selon des principes différents et conviennent à des scénarios variés.

Réplication en Streaming (Réplication Physique)

La réplication en streaming est la forme de réplication la plus courante et la plus fondamentale dans PostgreSQL. Elle fonctionne en envoyant les enregistrements du journal WAL (Write-Ahead Log) du serveur primaire à une ou plusieurs répliques. Ces enregistrements WAL représentent chaque modification apportée à la base de données. Les répliques appliquent ensuite ces enregistrements WAL à leurs propres fichiers de données, assurant ainsi leur cohérence avec le primaire.

Types de Réplication en Streaming :

  1. Réplication Synchrone : En mode synchrone, le serveur primaire attend la confirmation d'au moins une (ou un nombre spécifié) des répliques que les enregistrements WAL ont été reçus et écrits dans leur tampon WAL avant d'accuser réception de la validation de la transaction au client. Cela garantit que les transactions validées existent sur au moins une réplique, offrant le niveau le plus élevé de cohérence des données.

    • Avantages : Garantit aucune perte de données pour les transactions validées sur la réplique synchrone.
    • Inconvénients : Peut introduire une latence dans la validation des transactions, car le primaire doit attendre l'acquittement de la réplique.
  2. Réplication Asynchrone : En mode asynchrone, le serveur primaire envoie les enregistrements WAL aux répliques mais n'attend pas d'acquittement avant de valider la transaction. Le primaire accuse réception de la validation au client immédiatement après avoir écrit le WAL localement. Cela offre une latence plus faible mais comporte un risque de perte de données si le primaire échoue avant que les enregistrements WAL n'aient été envoyés et appliqués à la réplique.

    • Avantages : Impact minimal sur la latence de validation des transactions.
    • Inconvénients : Risque de perte de données si le primaire échoue et que les enregistrements WAL n'ont pas encore atteint la réplique.

Configuration de la Réplication en Streaming (Exemple Asynchrone)

La configuration de la réplication en streaming implique de configurer à la fois les serveurs primaire et réplique. Voici un guide simplifié :

1. Configuration du Serveur Primaire (postgresql.conf et pg_hba.conf)

Sur le serveur primaire, vous devez activer l'archivage WAL et les connexions de réplication.

  • Modifications de postgresql.conf :

    ```ini
    wal_level = replica # ou logical pour la réplication logique
    max_wal_senders = 5 # Nombre de connexions de réplication concurrentes
    wal_keep_size = 512MB # Ou wal_keep_segments pour les anciennes versions

    Pour la réplication synchrone, ajoutez :

    synchronous_standby_names = 'replica1,replica2'

    Ou pour un nom/priorité de serveur spécifique :

    synchronous_standby_names = '1 (replica1), 2 (replica2)'

    archive_mode = on
    archive_command = 'cp %p /path/to/wal_archive/%f'
    `` *wal_level: Doit être au moinsreplicapour la réplication en streaming. *max_wal_senders: Spécifie le nombre de serveurs secondaires pouvant se connecter simultanément. *wal_keep_size: Empêche la suppression des fichiers WAL avant que les répliques puissent les récupérer (une alternative plus simple àarchive_commandpour les configurations de base, mais l'archivage est recommandé pour la robustesse). *archive_mode&archive_command` : Crucial pour la récupération à un instant T (PITR) et essentiel si une réplique prend trop de retard ou doit être reconstruite.

  • Modifications de pg_hba.conf :

    Autorisez la réplique à se connecter pour la réplication. Remplacez replica_ip_address par l'IP réelle de votre réplique.

    ```ini

    TYPE DATABASE USER ADDRESS METHOD

    host replication replication_user replica_ip_address/32 md5
    ```

    Vous devrez également créer un utilisateur de réplication :

    sql -- Sur le serveur primaire : CREATE ROLE replication_user WITH REPLICATION LOGIN PASSWORD 'your_password';

    Après avoir modifié ces fichiers, rechargez la configuration PostgreSQL :

    ```bash
    pg_ctl reload

    Ou redémarrez PostgreSQL si nécessaire

    ```

2. Préparation du Serveur Réplique

Avant de démarrer la réplique, son répertoire de données doit être une copie du répertoire de données du primaire à un instant précis. La méthode la plus simple consiste à utiliser pg_basebackup.

  • Arrêter PostgreSQL sur la réplique (s'il est en cours d'exécution).

  • Effectuer une sauvegarde de base :

    ```bash

    Assurez-vous que PGDATA est vide ou supprimé au préalable

    pg_basebackup -h primary_host_ip -p 5432 -U replication_user -D /var/lib/postgresql/data/ -Fp -Xs -P
    `` *-h,-p,-U: Spécifient les détails de connexion au serveur primaire. *-D: Le répertoire de données pour la réplique. *-Fp: Le format est brut (plain). *-Xs: Utilise le streaming TSL/WAL. Équivalent au paramètreprimary_conninfopour le streaming WAL. *-P: Afficher la progression. * Il vous sera demandé le mot de passe dereplication_user`.

3. Configuration du Serveur Réplique (postgresql.conf et recovery.conf ou postgresql.conf pour PG12+)

  • Modifications de postgresql.conf (pour PG12+) :

    ```ini
    hot_standby = on # Permet les requêtes en lecture seule sur la réplique
    primary_conninfo = 'host=primary_host_ip port=5432 user=replication_user password=your_password'

    Pour la réplication synchrone, ajoutez :

    primary_promote_delay = 10 # secondes

    Ou utilisez un mécanisme de fichier de déclenchement

    `` *hot_standby: Active les requêtes en lecture seule sur le secondaire. *primary_conninfo` : Chaîne de connexion au serveur primaire.

  • recovery.conf (pour les versions de PostgreSQL antérieures à 12) :

    Créez un fichier recovery.conf dans le répertoire de données de la réplique avec le contenu suivant :

    ```ini
    standby_mode = 'on'
    primary_conninfo = 'host=primary_host_ip port=5432 user=replication_user password=your_password'

    Si vous utilisez la récupération par archive au lieu du streaming, vous spécifieriez restore_command

    restore_command = 'cp /path/to/wal_archive/%f %p'

    recovery_target_timeline = 'latest'

    ```

    Pour PG12+, primary_conninfo et hot_standby sont définis directement dans postgresql.conf.

4. Démarrage du Serveur Réplique

Démarrez le service PostgreSQL sur la réplique. Il se connectera au primaire, recevra les enregistrements WAL et commencera à se synchroniser. Vous pouvez vérifier les journaux pour confirmation.

Astuce : Pour une HA robuste, envisagez d'utiliser des outils comme Patroni ou repmgr, qui automatisent le basculement et la gestion.

Réplication Logique

La réplication logique est une forme de réplication plus flexible et granulaire introduite dans PostgreSQL 10. Au lieu de répliquer des blocs entiers de données ou des enregistrements WAL, elle réplique les modifications de données en fonction de leur signification logique (par exemple, les instructions INSERT, UPDATE, DELETE) au niveau de la ligne. Ceci est réalisé en décodant les enregistrements WAL en un flux de modifications logiques.

Fonctionnalités Clés et Cas d'Utilisation :

  • Réplication Sélective : Vous pouvez choisir quelles tables ou même quelles colonnes répliquer. Ceci est très utile pour déplacer sélectivement des données entre bases de données.
  • Réplication Inter-Versions : La réplication logique peut répliquer des données entre différentes versions majeures de PostgreSQL.
  • Modifications de Schéma Sélectives : Vous pouvez répliquer les modifications pour des bases de données ou des schémas spécifiques, et même publier uniquement certaines tables.
  • Transformation de Données : Bien que non intégrée, la réplication logique fournit une base pour des processus ETL (Extract, Transform, Load) plus complexes.
  • Réplication d'un Primaire vers une Réplique qui n'est pas un clone complet : La base de données cible n'a pas besoin d'être une copie physique complète de la source.

Comment Cela Fonctionne :

  1. Éditeur (Publisher) : La base de données source (primaire) où se produisent les modifications de données. Elle nécessite wal_level = logical. Les modifications sont décodées à partir du WAL en un flux logique.
  2. Publication (Publication) : Un ensemble nommé de tables sur l'éditeur dont les modifications seront répliquées.
  3. Abonné (Subscriber) : La base de données cible (réplique) qui reçoit les modifications.
  4. Abonnement (Subscription) : Une connexion sur l'abonné qui se connecte à l'éditeur et applique les modifications d'une publication spécifique.

Configuration de la Réplication Logique

1. Configuration de l'Éditeur (Serveur Primaire)

  • Modifications de postgresql.conf :

    ini wal_level = logical max_replication_slots = 10 # Pour les slots de réplication logique max_wal_senders = 10 # Devrait être au moins max_replication_slots

  • Créer une Publication :

    ```sql
    -- Sur la base de données de l'éditeur :
    CREATE PUBLICATION my_publication FOR TABLE
    table1,
    table2
    WITH (publish = 'insert,update,delete');

    -- Pour toutes les tables :
    -- CREATE PUBLICATION all_tables_pub FOR ALL TABLES;
    ```

    Rechargez la configuration sur l'éditeur.

2. Configuration de l'Abonné (Serveur Réplique)

  • Assurez-vous que les tables cibles existent : La base de données de l'abonné doit posséder les tables cibles avec le même schéma que l'éditeur. Vous pouvez les créer manuellement ou utiliser pg_dump pour extraire le schéma.

  • Créer un Abonnement :

    sql -- Sur la base de données de l'abonné : CREATE SUBSCRIPTION my_subscription CONNECTION 'host=publisher_host_ip port=5432 user=replication_user password=your_password dbname=publisher_db' PUBLICATION my_publication;

    Le replication_user nécessite les autorisations appropriées sur l'éditeur.

    PostgreSQL créera automatiquement un slot de réplication sur l'éditeur et commencera à appliquer les modifications. Vous pouvez surveiller l'état de l'abonnement en utilisant pg_stat_subscription sur l'abonné.

Astuce : La réplication logique nécessite l'extension logical decoding, qui est généralement intégrée. Elle est plus gourmande en ressources que la réplication en streaming mais offre une plus grande flexibilité.

Choisir la Bonne Méthode de Réplication

  • Réplication en Streaming : Idéale pour la haute disponibilité et la reprise après sinistre, lorsque vous avez besoin d'une copie exacte, bit par bit, du primaire. Elle est plus simple à configurer pour la réplication complète de la base de données et offre la meilleure mise à l'échelle des lectures pour les répliques en lecture seule.
  • Réplication Logique : La mieux adaptée à la distribution sélective de données, aux migrations, aux mises à niveau inter-versions, ou lorsque vous n'avez besoin de répliquer qu'un sous-ensemble de données. Elle permet des scénarios plus complexes tels que la réplication vers différents schémas ou l'exécution de transformations de données.

Conclusion

La réplication PostgreSQL est une fonctionnalité puissante qui permet une disponibilité, une récupération et une évolutivité robustes des données. Que vous optiez pour le miroir complet des données de la réplication en streaming ou pour l'approche flexible et sélective de la réplication logique, comprendre leurs mécanismes et leurs configurations est essentiel pour maintenir un environnement PostgreSQL sain et résilient. En mettant en œuvre la réplication, vous améliorez considérablement la tolérance aux pannes et les capacités de performance de votre base de données.

Testez toujours minutieusement votre configuration de réplication, en particulier les scénarios de basculement, et surveillez le décalage de réplication pour vous assurer que vos répliques sont à jour. L'apprentissage continu et l'adaptation aux fonctionnalités évolutives de PostgreSQL consolideront davantage votre maîtrise de ce système de base de données indispensable.