Répliquer des données entre AlloyDB Omni et d'autres bases de données

Sélectionnez une version de la documentation :

Cette page explique comment répliquer des données entre AlloyDB Omni et d'autres bases de données à l'aide de l'extension pglogical.

Pour en savoir plus, consultez À propos de l'extension pglogical et Terminologie et composants fondamentaux de pglogical.

Méthodes d'authentification compatibles

Les deux principales méthodes d'authentification utilisées avec l'extension pglogical sont les méthodes d'authentification par mot de passe et par confiance.

La méthode d'authentification recommandée est la méthode d'authentification par confiance. Pour en savoir plus, consultez Méthodes d'authentification acceptées.

Avant de commencer

Vous pouvez installer pglogical en tant qu'extension dans une base de données donnée.

Avant d'implémenter l'extension pglogical sur AlloyDB Omni, assurez-vous de respecter la configuration système requise suivante :

  • Accès à votre cluster PostgreSQL non AlloyDB en tant que superuser.
  • L'extension pglogical est installée dans votre cluster PostgreSQL non AlloyDB. Pour obtenir des instructions d'installation spécifiques à la publication et à la distribution, consultez pglogical.
  • Un serveur AlloyDB Omni installé et configuré. Pour savoir comment installer AlloyDB Omni, consultez Installer AlloyDB Omni.
  • Adresses IP du cluster PostgreSQL non AlloyDB et du serveur hôte AlloyDB Omni.
  • Un réseau établi et sécurisé entre le cluster PostgreSQL non AlloyDB et le serveur hôte AlloyDB Omni. La connectivité TCP sur le port PostgreSQL standard 5432 est requise.

Ajuster les paramètres sur le fournisseur non AlloyDB

  1. Définissez le paramètre wal_level sur logical, puis ajoutez pglogical au paramètre shared_preload_libraries dans le fichier postgresql.conf. L'extension pglogical nécessite un ensemble minimal d'ajustements de paramètres sur le cluster de fournisseur non AlloyDB.

    cp postgresql.conf postgresql.bak
    sed -r -i "s|(\#)?wal_level\s*=.*|wal_level=logical|" postgresql.conf
    sed -r -i "s|(\#)?(shared_preload_libraries\s*=\s*)'(.*)'.*$|\2'\3,pglogical'|" postgresql.conf
    sed -r -i "s|',|'|" postgresql.conf
  2. Vérifiez que les paramètres sont correctement définis :

    grep -iE 'wal_level|shared_preload_libraries' postgresql.conf
  3. Redémarrez votre cluster non AlloyDB pour que les modifications de paramètres prennent effet.

    Il est possible que d'autres paramètres soient déjà définis sur des valeurs suffisantes ou qu'ils nécessitent un ajustement en fonction de votre distribution et de votre version non AlloyDB.

    Vérifiez les paramètres suivants :

    • max_worker_processes : un par base de données du fournisseur et au moins un par nœud abonné. La valeur standard pour ce paramètre est d'au moins 10.
    • max_replication_slots : un par nœud sur les nœuds du fournisseur.
    • max_wal_senders : un par nœud sur les nœuds du fournisseur.
    • track_commit_timestamp : définissez cette valeur sur on si la résolution des conflits de la dernière ou de la première mise à jour est requise.
    • listen_addresses : doit inclure l'adresse IP AlloyDB Omni ou la mentionner via un bloc CIDR de couverture.
  4. (Facultatif) Si votre fournisseur autre qu'AlloyDB est Amazon RDS ou Aurora, l'extension pglogical doit être activée et les paramètres requis ajustés via des ajustements cluster parameter group.

    1. Dans un groupe de paramètres de cluster existant ou nouveau, définissez les paramètres suivants :

      • De rds.logical_replication à 1
      • De max_replication_slots à 50
      • De max_wal_senders à 50
      • De max_worker_processes à 64
      • De shared_preload_libraries à pg_stat_statements, pglogical
    2. Redémarrez votre cluster Amazon RDS ou Aurora pour que les ajustements du groupe de paramètres du cluster prennent effet.

  5. Vérifiez que toutes les valeurs de paramètre sont pertinentes :

    SELECT name, setting
    FROM pg_catalog.pg_settings
     WHERE name IN ('listen_addresses',
                    'wal_level',
                    'shared_preload_libraries',
                    'max_worker_processes',
                    'max_replication_slots',
                    'max_wal_senders',
                    'track_commit_timestamp')
     ORDER BY name;
    

Ajustements de l'authentification basée sur l'hôte pour le cluster de fournisseur non AlloyDB Omni

pglogical établit des connexions TCP locales à la base de données du fournisseur. Par conséquent, vous devez ajouter l'adresse IP du serveur hôte au fichier DATA_DIR/pg_hba.conf AlloyDB Omni, où DATA_DIR correspond au chemin d'accès au système de fichiers de votre répertoire de données (par exemple, /home/$USER/alloydb-data).

  1. Ajoutez une entrée d'authentification de confiance pour le serveur local, spécifique à un nouvel utilisateur pglogical_replication, au fichier DATA_DIR/pg_hba.conf.

    De plus, les nœuds abonnés doivent pouvoir s'authentifier auprès des nœuds fournisseurs. Ajoutez l'adresse IP de chaque nœud d'abonné ou la plage d'adresses IP du bloc CIDR approprié au fichier DATA_DIR/pg_hba.conf :

    echo -e "# pglogical entries:
    host all pglogical_replication samehost trust
    host all pglogical_replication SERVER_IP_ADDRESS/32 trust
    " | column -t | sudo tee -a DATA_DIR/pg_hba.conf

    Remplacez SERVER_IP_ADDRESS par l'adresse IP de l'instance principale AlloyDB Omni à partir de laquelle effectuer la réplication.

  2. Vérifiez que les informations saisies sont correctes :

    tail -3 DATA_DIR/pg_hba.conf
  3. Redémarrez votre cluster non AlloyDB pour que les modifications de paramètres prennent effet.

Ajuster les paramètres du cluster d'abonnés AlloyDB Omni

pglogical nécessite également un ensemble minimal d'ajustements de paramètres sur le cluster abonné AlloyDB Omni. Vous devez ajouter pglogical au paramètre shared_preload_libraries dans le fichier DATA_DIR/postgresql.conf. Si une base de données du cluster sert de base de données fournisseur, apportez les modifications de paramètres requises pour les bases de données fournisseur.

  1. Ajustez les paramètres :

    sudo sed -r -i "s|(shared_preload_libraries\s*=\s*)'(.*)'.*$|\1'\2,pglogical'|" DATA_DIR/postgresql.conf
  2. Vérifiez que le paramètre est correctement défini :

    grep -iE 'shared_preload_libraries' DATA_DIR/postgresql.conf
  3. Redémarrez AlloyDB Omni pour que la modification du paramètre prenne effet :

    Docker

     docker container restart CONTAINER_NAME

    Remplacez CONTAINER_NAME par le nom que vous avez attribué au conteneur AlloyDB Omni lorsque vous l'avez démarré.

    Podman

     podman container restart CONTAINER_NAME

    Remplacez CONTAINER_NAME par le nom que vous avez attribué au conteneur AlloyDB Omni lorsque vous l'avez démarré.

  4. Définissez les valeurs par défaut d'AlloyDB Omni pour les autres paramètres de base de données du fournisseur :

    • max_worker_processes : un par base de données du fournisseur et un par nœud abonné.
    • track_commit_timestamp : définissez cette valeur sur on si la dernière/première mise à jour doit être prise en compte pour résoudre les conflits.
  5. Vérifiez que toutes les valeurs de paramètre sont pertinentes :

    Docker

    docker exec CONTAINER_NAME psql -h localhost -U postgres -c "
    SELECT name, setting
      FROM pg_catalog.pg_settings
     WHERE name IN ('listen_addresses',
                    'wal_level',
                    'shared_preload_libraries',
                    'max_worker_processes',
                    'max_replication_slots',
                    'max_wal_senders',
                    'track_commit_timestamp')
         ORDER BY name;
    "

    Podman

    podman exec CONTAINER_NAME psql -h localhost -U postgres -c "
    SELECT name, setting
      FROM pg_catalog.pg_settings
     WHERE name IN ('listen_addresses',
                    'wal_level',
                    'shared_preload_libraries',
                    'max_worker_processes',
                    'max_replication_slots',
                    'max_wal_senders',
                    'track_commit_timestamp')
         ORDER BY name;
    "

Ajustements de l'authentification basée sur l'hôte apportés au cluster d'abonnés AlloyDB Omni

pglogical établit des connexions TCP locales à la base de données des abonnés AlloyDB Omni. Par conséquent, vous devez ajouter l'adresse IP du serveur hôte de l'abonné au fichier DATA_DIR/pg_hba.conf AlloyDB Omni.

  1. Ajoutez une entrée d'authentification approuvée pour le serveur local, spécifique à un nouvel utilisateur pglogical_replication, au fichier DATA_DIR/pg_hba.conf :

    echo -e "# pglogical entries:
    host all pglogical_replication samehost trust
    " | column -t | sudo tee -a DATA_DIR/pg_hba.conf
  2. Vérifiez que l'entrée est correcte :

    tail -2 DATA_DIR/pg_hba.conf
  3. Redémarrez AlloyDB Omni pour que la modification de l'authentification prenne effet :

    docker container restart CONTAINER_NAME

Créez un utilisateur pglogical dans les clusters du fournisseur et de l'abonné.

Vous devez créer un utilisateur dans le cluster du fournisseur et dans celui de l'abonné. pglogical exige que l'utilisateur dispose des attributs superuser et replication.

  1. Dans le cluster de fournisseur AlloyDB pour PostgreSQL, créez le rôle utilisateur :

    CREATE USER pglogical_replication LOGIN PASSWORD 'secret';
    ALTER USER pglogical_replication WITH replication;
    ALTER USER pglogical_replication WITH superuser;
    
  2. (Facultatif) Si votre fournisseur non AlloyDB est Amazon RDS ou Aurora, vous devez attribuer le rôle suivant :

    GRANT rds_superuser TO replication_user;
    

Ajouter pglogical et des nœuds à la base de données du fournisseur non AlloyDB

  1. Accordez les droits requis.

    Vous devez installer l'extension pglogical dans chaque base de données et accorder l'autorisation usage à l'utilisateur de la base de données pglogical.

    Par exemple, si votre base de données est my_test_db, exécutez la commande suivante :

    CREATE EXTENSION IF NOT EXISTS pglogical;
    GRANT usage ON SCHEMA pglogical TO pglogical_replication;
    
  2. Créez un nœud pglogical pour les bases de données du fournisseur. Le node_name est arbitraire et la chaîne dsn doit être une connexion TCP valide vers la même base de données.

    Par exemple, pour la base de données my_test_db, exécutez la commande suivante :

    SELECT pglogical.create_node(node_name := 'provider', dsn := 'host=SERVER_IP_ADDRESS port=5432 dbname=my_test_db user=pglogical_replication password=secret');
    

Créer une table et l'ajouter à l'ensemble de réplication par défaut

Créez une table et ajoutez-la à l'ensemble de réplication par défaut dans la base de données du fournisseur non AlloyDB.

  1. Créez une table de test appelée test_table_1 dans la base de données du fournisseur :

    CREATE TABLE test_table_1 (col1 INT PRIMARY KEY);
    INSERT INTO test_table_1 VALUES (1),(2),(3);
    
  2. Ajoutez manuellement la table de test à l'ensemble de réplication par défaut. Vous pouvez créer des ensembles de réplication pglogical personnalisés ou utiliser les ensembles de réplication par défaut. Plusieurs ensembles de réplication par défaut, tels que default, default_insert_only et ddl_sql, ont été créés lorsque vous avez créé l'extension. Vous pouvez ajouter des tables et des séquences aux ensembles de réplication individuellement ou toutes en même temps pour un schéma spécifié.

    -- Add the specified table to the default replication set:
    SELECT pglogical.replication_set_add_table(set_name := 'default', relation := 'test_table_1', synchronize_data := TRUE);
    
    -- Check which tables have been added to all replication sets:
    SELECT * FROM pglogical.replication_set_table;
    
  3. (Facultatif) Ajoutez toutes les tables d'un schéma spécifié, tel que public :

    -- Add all "public" schema tables to the default replication set:
    SELECT pglogical.replication_set_add_all_tables('default', ARRAY['public']);
    
    -- Check which tables have been added to all replication sets:
    SELECT * FROM pglogical.replication_set_table;
    
    -- Add all "public" schema sequences to the default replication:
    SELECT pglogical.replication_set_add_all_sequences('default', ARRAY['public']);
    
    -- Check which sequences have been added to all replication sets:
    SELECT * FROM pglogical.replication_set_seq;
    
  4. Supprimez la table de l'ensemble de réplication default. Si le schéma contient des tables sans clé primaire ni identité de réplique, seules les instructions INSERT peuvent être répliquées. Si vous avez ajouté ces tables à l'ensemble de réplication default automatiquement à l'aide de la fonction replication_set_add_all_tables, vous devez les supprimer manuellement de cet ensemble de réplication et les ajouter à l'ensemble default_insert_only.

    -- Remove the table from the **default** replication set:
    SELECT pglogical.replication_set_remove_table(set_name := 'default', relation := 'test_table_2');
    
    -- Manually add to the **default_insert_only** replication set:
    SELECT pglogical.replication_set_add_table(set_name := 'default_insert_only', relation := 'test_table_2');
    

    Si vous souhaitez ajouter automatiquement les tables nouvellement créées à l'ensemble de réplication, ajoutez le déclencheur pglogical_assign_repset comme suggéré dans la source pglogical.

Copier la base de données dans le cluster abonné AlloyDB Omni

  1. Créez une sauvegarde du schéma uniquement de la base de données source à l'aide de l'utilitaire pg_dump.

  2. Exécutez la commande pg_dump à partir de votre serveur AlloyDB Omni abonné en utilisant l'adresse IP ou le point de terminaison de votre serveur non AlloyDB.

    pg_dump -h SERVER_IP_ADDRESS -U postgres --create --schema-only my_test_db > my_test_db.schema-only.sql
  3. Importez la sauvegarde dans la base de données de l'abonné sur le serveur AlloyDB Omni de l'abonné :

    Docker

    docker exec -i CONTAINER_NAME psql -h localhost -U postgres < my_test_db.schema-only.sql

    Podman

    podman exec -i CONTAINER_NAME psql -h localhost -U postgres < my_test_db.schema-only.sql

Cette action crée la base de données et le schéma, sans aucune donnée de ligne. Les données des lignes sont répliquées par l'extension pglogical. Copiez ou recréez manuellement les autres utilisateurs ou rôles requis.

Créer un nœud et un abonnement sur la base de données abonnée AlloyDB Omni

  1. Créez un nœud sur la base de données abonnée AlloyDB Omni. Ajoutez le mot de passe à votre dsn si vous choisissez d'utiliser l'authentification par mot de passe.

    Docker

    docker exec CONTAINER_NAME psql -h localhost -U postgres -d my_test_db -c "
    SELECT pglogical.create_node(node_name := 'subscriber', dsn := 'host=localhost port=5432 dbname=my_test_db user=pglogical_replication');
    "

    Podman

    podman exec CONTAINER_NAME psql -h localhost -U postgres -d my_test_db -c "
    SELECT pglogical.create_node(node_name := 'subscriber', dsn := 'host=localhost port=5432 dbname=my_test_db user=pglogical_replication');
    "
  2. Créez un abonnement dans la base de données de l'abonné, en pointant vers la base de données du fournisseur sur le serveur fournisseur AlloyDB Omni.

    Docker

    docker exec CONTAINER_NAME psql -h localhost -U postgres -d my_test_db -c "
    SELECT pglogical.create_subscription(subscription_name := 'test_sub_1', provider_dsn := 'host=SERVER_IP_ADDRESS port=5432 dbname=my_test_db user=pglogical_replication password=secret');
    "

    Podman

    podman exec CONTAINER_NAME psql -h localhost -U postgres -d my_test_db -c "
    SELECT pglogical.create_subscription(subscription_name := 'test_sub_1', provider_dsn := 'host=SERVER_IP_ADDRESS port=5432 dbname=my_test_db user=pglogical_replication password=secret');
    "
  3. En quelques secondes ou minutes, les données initiales doivent être répliquées du fournisseur à l'abonné :

    Docker

    docker exec CONTAINER_NAME psql -h localhost -U postgres -d my_test_db -c "
    SELECT * FROM test_table_1 ORDER BY 1;
    "

    Podman

    podman exec CONTAINER_NAME psql -h localhost -U postgres -d my_test_db -c "
    SELECT * FROM test_table_1 ORDER BY 1;
    "

    Les lignes supplémentaires ajoutées à la base de données du fournisseur sont également répliquées en temps réel en quelques secondes.

Autres remarques concernant le déploiement de pglogical

L'extension pglogical propose de nombreuses fonctionnalités avancées qui ne sont pas abordées dans ce document. Bon nombre de ces fonctionnalités s'appliquent à votre implémentation. Vous pouvez envisager d'utiliser les fonctionnalités avancées suivantes :

  • Résolution de conflits
  • Réplication multimaster et bidirectionnelle
  • Inclusion de séquences
  • Procédures de commutation et de basculement

Étapes suivantes