Utilisation de pgactive pour prendre en charge la réplication active-active - Amazon Relational Database Service

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Utilisation de pgactive pour prendre en charge la réplication active-active

L'pgactiveextension utilise la réplication active-active pour prendre en charge et coordonner les opérations d'écriture sur plusieurs bases de données RDS SQL Postgre. Amazon RDS pour Postgre SQL prend en charge l'pgactiveextension sur les versions suivantes :

  • RDSpour Postgre SQL 16.1 et versions 16 supérieures

  • RDSpour Postgre SQL 15.4-R2 et versions 15 supérieures

  • RDSpour Postgre SQL 14.10 et versions 14 supérieures

  • RDSpour Postgre SQL 13.13 et versions 13 supérieures

  • RDSpour Postgre SQL 12.17 et versions 12 supérieures

  • RDSpour Postgre 11.22 SQL

Note

Lorsque des opérations d'écriture se produisent sur plusieurs bases de données dans une configuration de réplication, des conflits peuvent survenir. Pour plus d’informations, consultez Gestion des conflits de la réplication active-active.

Initialisation de la capacité d'extension pgactive

Pour initialiser la fonctionnalité d'pgactiveextension sur votre RDS SQL instance de base de données Postgre, définissez la valeur du rds.enable_pgactive paramètre sur, 1 puis créez l'extension dans la base de données. Les paramètres rds.logical_replication et track_commit_timestamp sont alors automatiquement activés et la valeur de wal_level est définie sur logical.

Vous devez disposer d'autorisations en tant que rôle rds_superuser pour effectuer ces tâches.

Vous pouvez utiliser le AWS Management Console ou le AWS CLI pour créer les éléments requis RDS pour les SQL instances de base de données Postgre. Les étapes suivantes supposent que votre SQL instance de base de données RDS for Postgre est associée à un groupe de paramètres de base de données personnalisé. Pour obtenir des informations sur la création d'un groupe de paramètres de base de données personnalisé, consultez Groupes de paramètres pour Amazon RDS.

Pour initialiser la capacité d'extension pgactive
  1. Connectez-vous à la RDS console Amazon AWS Management Console et ouvrez-la à l'adresse https://console.aws.amazon.com/rds/.

  2. Dans le volet de navigation, choisissez votre SQL instance de base de données RDS pour Postgre.

  3. Ouvrez l'onglet Configuration de votre SQL instance de base de données RDS for Postgre. Dans les détails de l'instance, recherchez le lien Groupe de paramètres d'instance de base de données.

  4. Cliquez sur le lien pour ouvrir les paramètres personnalisés associés à votre SQL instance RDS de base de données Postgre.

  5. Recherchez le paramètre rds.enable_pgactive et définissez-le sur 1 pour initialiser la fonctionnalité pgactive.

  6. Sélectionnez Enregistrer les modifications.

  7. Dans le volet de navigation de la RDS console Amazon, sélectionnez Databases.

  8. Sélectionnez votre SQL instance RDS de base de données Postgre, puis choisissez Redémarrer dans le menu Actions.

  9. Confirmez le redémarrage de l'instance de base de données pour que vos modifications prennent effet.

  10. Lorsque l'instance de base de données est disponible, vous pouvez utiliser psql un autre SQL client Postgre RDS pour vous connecter à l'instance de SQL base de données Postgre.

    L'exemple suivant suppose que votre SQL instance de base de données RDS pour Postgre possède une base de données par défaut nommée postgres.

    psql --host=mydb.111122223333.aws-region.rds.amazonaws.com --port=5432 --username=master username --password --dbname=postgres
  11. Pour vérifier que pgactive est initialisé, exécutez la commande suivante.

    postgres=>SELECT setting ~ 'pgactive' FROM pg_catalog.pg_settings WHERE name = 'shared_preload_libraries';

    Si pgactive se trouve dans shared_preload_libraries, la commande précédente renvoie ceci :

    ?column? ---------- t
  12. Créez l'extension, comme suit.

    postgres=> CREATE EXTENSION pgactive;
Pour initialiser la capacité d'extension pgactive

Pour initialiser l'pgactiveutilisation de AWS CLI, appelez l'modify-db-parameter-groupopération pour modifier certains paramètres de votre groupe de paramètres personnalisé, comme indiqué dans la procédure suivante.

  1. Utilisez la AWS CLI commande suivante pour définir sur rds.enable_pgactive 1 afin d'initialiser la pgactive fonctionnalité de l'instance de SQL base de données RDS for Postgre.

    postgres=>aws rds modify-db-parameter-group \ --db-parameter-group-name custom-param-group-name \ --parameters "ParameterName=rds.enable_pgactive,ParameterValue=1,ApplyMethod=pending-reboot" \ --region aws-region
  2. Utilisez la AWS CLI commande suivante pour redémarrer l'SQLinstance de base de données RDS for Postgre afin que la pgactive bibliothèque soit initialisée.

    aws rds reboot-db-instance \ --db-instance-identifier your-instance \ --region aws-region
  3. Lorsque l'instance est disponible, utilisez-la psql pour vous connecter à l'. RDSpour une SQL instance de base de données Postgre.

    psql --host=mydb.111122223333.aws-region.rds.amazonaws.com --port=5432 --username=master user --password --dbname=postgres
  4. Créez l'extension, comme suit.

    postgres=> CREATE EXTENSION pgactive;

Configuration de la réplication active-active pour le pour les instances de base de données Postgre SQL

La procédure suivante explique comment démarrer une réplication active-active entre deux pour des instances de base de données Postgre exécutant Postgre SQL SQL 15.4 ou une version ultérieure dans la même région. Pour exécuter l'exemple de haute disponibilité multirégionale, vous devez déployer les SQL instances Amazon RDS for Postgre dans deux régions différentes et configurer VPC Peering. Pour plus d'informations, voir VPCpeering.

Note

L'envoi de trafic entre plusieurs régions peut induire des coûts supplémentaires.

Ces étapes supposent que l'SQLinstance de base de données RDS for Postgre a été configurée avec l'pgactiveextension. Pour de plus amples informations, veuillez consulter Initialisation de la capacité d'extension pgactive.

Pour configurer le premier RDS pour l'SQLinstance de base de données Postgre avec l'extension pgactive

L'exemple suivant illustre la façon dont le pgactive groupe est créé, ainsi que les autres étapes requises pour créer l'pgactiveextension sur l'SQLinstance de base de données RDS for Postgre.

  1. Utilisez psql un autre outil client pour vous connecter à votre première SQL instance RDS de base de données Postgre.

    psql --host=firstinstance.111122223333.aws-region.rds.amazonaws.com --port=5432 --username=master username --password --dbname=postgres
  2. Créez une base de données sur l'SQLinstance RDS for Postgre à l'aide de la commande suivante :

    postgres=> CREATE DATABASE app;
  3. Faites basculer la connexion sur la nouvelle base de données à l'aide de la commande suivante :

    \c app
  4. Pour vérifier si le paramètre shared_preload_libraries contient pgactive, exécutez la commande suivante :

    app=>SELECT setting ~ 'pgactive' FROM pg_catalog.pg_settings WHERE name = 'shared_preload_libraries';
    ?column? ---------- t
  5. Créez et renseignez un exemple de table à l'aide des SQL instructions suivantes :

    1. Créez un exemple de tableau à l'aide de l'SQLinstruction suivante.

      app=> CREATE SCHEMA inventory; CREATE TABLE inventory.products ( id int PRIMARY KEY, product_name text NOT NULL, created_at timestamptz NOT NULL DEFAULT CURRENT_TIMESTAMP);
    2. Remplissez le tableau avec des exemples de données à l'aide de l'SQLinstruction suivante.

      app=> INSERT INTO inventory.products (id, product_name) VALUES (1, 'soap'), (2, 'shampoo'), (3, 'conditioner');
    3. Vérifiez que les données existent dans le tableau à l'aide de l'SQLinstruction suivante.

      app=>SELECT count(*) FROM inventory.products; count ------- 3
  6. Créez l'extension pgactive sur la base de données existante.

    app=> CREATE EXTENSION pgactive;
  7. Créez et initialisez le groupe pgactive à l'aide des commandes suivantes :

    app=> SELECT pgactive.pgactive_create_group( node_name := 'node1-app', node_dsn := 'dbname=app host=firstinstance.111122223333.aws-region.rds.amazonaws.com user=master username password=PASSWORD');

    node1-app est le nom que vous attribuez pour identifier de manière unique un nœud dans le groupe pgactive.

    Note

    Pour pouvoir effectuer cette étape sur une instance de base de données accessible au public, vous devez activer le paramètre rds.custom_dns_resolution en le définissant sur 1.

  8. Pour vérifier si l'instance de base de données est prête, utilisez la commande suivante :

    app=> SELECT pgactive.pgactive_wait_for_node_ready();

    Si la commande aboutit, vous obtenez la sortie suivante :

    pgactive_wait_for_node_ready ------------------------------ (1 row)
Pour configurer la seconde SQL instance RDS pour Postgre et la joindre au groupe pgactive

L'exemple suivant illustre comment vous pouvez joindre une SQL instance de base de données RDS pour Postgre au pgactive groupe, ainsi que les autres étapes nécessaires pour créer l'pgactiveextension sur l'instance de base de données.

Ces étapes supposent qu'un autre pour les SQL instances de base de données Postgre a été configuré avec l'pgactiveextension. Pour de plus amples informations, veuillez consulter Initialisation de la capacité d'extension pgactive.

  1. Utilisez psql pour vous connecter à l'instance qui doit recevoir les mises à jour du serveur de publication.

    psql --host=secondinstance.111122223333.aws-region.rds.amazonaws.com --port=5432 --username=master username --password --dbname=postgres
  2. Créez une base de données sur la seconde SQL instance RDS de base de données Postgre à l'aide de la commande suivante :

    postgres=> CREATE DATABASE app;
  3. Faites basculer la connexion sur la nouvelle base de données à l'aide de la commande suivante :

    \c app
  4. Créez l'extension pgactive sur la base de données existante.

    app=> CREATE EXTENSION pgactive;
  5. Joignez le pour la SQL deuxième instance de base de données Postgre au pgactive groupe comme suit.

    app=> SELECT pgactive.pgactive_join_group( node_name := 'node2-app', node_dsn := 'dbname=app host=secondinstance.111122223333.aws-region.rds.amazonaws.com user=master username password=PASSWORD', join_using_dsn := 'dbname=app host=firstinstance.111122223333.aws-region.rds.amazonaws.com user=postgres password=PASSWORD');

    node2-app est le nom que vous attribuez pour identifier de manière unique un nœud dans le groupe pgactive.

  6. Pour vérifier si l'instance de base de données est prête, utilisez la commande suivante :

    app=> SELECT pgactive.pgactive_wait_for_node_ready();

    Si la commande aboutit, vous obtenez la sortie suivante :

    pgactive_wait_for_node_ready ------------------------------ (1 row)

    Si le premier RDS pour la SQL base de données Postgre est relativement volumineux, vous pouvez voir l'pgactive.pgactive_wait_for_node_ready()émission du rapport de progression de l'opération de restauration. La sortie ressemble à ce qui suit:

    NOTICE: restoring database 'app', 6% of 7483 MB complete NOTICE: restoring database 'app', 42% of 7483 MB complete NOTICE: restoring database 'app', 77% of 7483 MB complete NOTICE: restoring database 'app', 98% of 7483 MB complete NOTICE: successfully restored database 'app' from node node1-app in 00:04:12.274956 pgactive_wait_for_node_ready ------------------------------ (1 row)

    À partir de cet instant, pgactive synchronise les données entre les deux instances de base de données.

  7. Vous pouvez utiliser la commande suivante pour vérifier si la base de données de la deuxième instance de base de données contient les données :

    app=> SELECT count(*) FROM inventory.products;

    Si les données ont bien été synchronisées, vous obtenez la sortie suivante :

    count ------- 3
  8. Exécutez la commande suivante pour insérer de nouvelles valeurs :

    app=> INSERT INTO inventory.products (id, product_name) VALUES ('lotion');
  9. Connectez-vous à la base de données de la première instance de base de données et exécutez la requête suivante :

    app=> SELECT count(*) FROM inventory.products;

    Si la réplication active-active est initialisée, vous obtenez une sortie de ce type :

    count ------- 4
Pour détacher et supprimer une instance de base de données du groupe pgactive

Vous pouvez détacher et supprimer une instance de base de données du groupe pgactive en suivant ces étapes :

  1. Vous pouvez détacher la deuxième instance de base de données de la première à l'aide de la commande suivante :

    app=> SELECT * FROM pgactive.pgactive_detach_nodes(ARRAY[‘node2-app']);
  2. Supprimez l'extension pgactive de la deuxième instance de base de données à l'aide de la commande suivante :

    app=> SELECT * FROM pgactive.pgactive_remove();

    Pour supprimer l'extension de force :

    app=> SELECT * FROM pgactive.pgactive_remove(true);
  3. Supprimez l'extension à l'aide de la commande suivante :

    app=> DROP EXTENSION pgactive;

Gestion des conflits de la réplication active-active

L'extension pgactive fonctionne par base de données et non par cluster. Chaque instance de base de données qui utilise pgactive est une instance indépendante et peut accepter les modifications de données de n'importe quelle source. Lorsqu'une modification est envoyée à une instance de base de données, Postgre la SQL valide localement, puis l'utilise pgactive pour répliquer la modification de manière asynchrone sur d'autres instances de base de données. Lorsque deux SQL instances de base de données Postgre mettent à jour le même enregistrement à peu près au même moment, un conflit peut survenir.

L'extension pgactive propose des mécanismes de détection et de résolution automatique des conflits. Il suit l'horodatage du moment où la transaction a été validée sur les deux instances de base de données et applique automatiquement la modification avec l'horodatage le plus récent. L'extension pgactive journalise également la survenance d'un conflit dans la table pgactive.pgactive_conflict_history.

Ils pgactive.pgactive_conflict_history vont continuer de croître. Vous souhaiterez peut-être définir une politique de purge. Cela peut être fait en supprimant régulièrement certains enregistrements ou en définissant un schéma de partitionnement pour cette relation (puis en détachant, supprimant, tronquant les partitions qui vous intéressent). Pour mettre en œuvre régulièrement la politique de purge, l'une des options consiste à utiliser l'pg_cronextension. Consultez les informations suivantes concernant un exemple de table d'pg_cronhistorique, Planification de la maintenance avec l'extension Postgre SQL pg_cron.

Gestion des séquences dans une réplication active-active

Une SQL instance RDS de base de données Postgre dotée de l'pgactiveextension utilise deux mécanismes de séquence différents pour générer des valeurs uniques.

Séquences globales

Pour utiliser une séquence globale, créez une séquence locale avec l'instruction CREATE SEQUENCE. Utilisez pgactive.pgactive_snowflake_id_nextval(seqname) plutôt que usingnextval(seqname) pour obtenir la prochaine valeur unique de la séquence.

L'exemple suivant crée une séquence globale :

postgres=> CREATE TABLE gstest ( id bigint primary key, parrot text );
postgres=>CREATE SEQUENCE gstest_id_seq OWNED BY gstest.id;
postgres=> ALTER TABLE gstest \ ALTER COLUMN id SET DEFAULT \ pgactive.pgactive_snowflake_id_nextval('gstest_id_seq');
Séquences partitionnées

Dans les séquences partitionnées ou fractionnées, une SQL séquence Postgre normale est utilisée sur chaque nœud. Chaque séquence s'incrémente de la même valeur et débute à des décalages différents. Par exemple, avec un pas de 100, le nœud 1 génère la séquence 101, 201, 301, etc. et le nœud 2 génère la séquence 102, 202, 302, etc. Ce mécanisme fonctionne bien même si les nœuds ne peuvent pas communiquer pendant de longues périodes. Cependant, il impose au concepteur de spécifier un nombre maximal de nœuds au moment d'établir le schéma et nécessite une configuration par nœud. Les erreurs peuvent facilement engendrer un chevauchement de séquences.

Il est relativement simple de configurer cette approche avec pgactive en créant la séquence souhaitée sur un nœud comme suit :

CREATE TABLE some_table (generated_value bigint primary key);
postgres=> CREATE SEQUENCE some_seq INCREMENT 100 OWNED BY some_table.generated_value;
postgres=> ALTER TABLE some_table ALTER COLUMN generated_value SET DEFAULT nextval('some_seq');

Appelez ensuite setval sur chaque nœud pour donner une valeur de départ de décalage différente comme suit.

postgres=> -- On node 1 SELECT setval('some_seq', 1); -- On node 2 SELECT setval('some_seq', 2);

Référence des paramètres de l'extension pgactive

Vous pouvez utiliser la requête suivante pour afficher tous les paramètres associés à l'extension pgactive.

postgres=> SELECT * FROM pg_settings WHERE name LIKE 'pgactive.%';

Mesurer le délai de réplication entre les membres actifs

Vous pouvez utiliser la requête suivante pour visualiser le délai de réplication entre les pgactive membres. Exécutez cette requête sur chaque pgactive nœud pour obtenir une vue d'ensemble complète.

postgres=# SELECT *, (last_applied_xact_at - last_applied_xact_committs) AS lag FROM pgactive.pgactive_node_slots; -{ RECORD 1 ]----------------+----------------------------------------------------------------- node_name | node2-app slot_name | pgactive_5_7332551165694385385_0_5__ slot_restart_lsn | 0/1A898A8 slot_confirmed_lsn | 0/1A898E0 walsender_active | t walsender_pid | 69022 sent_lsn | 0/1A898E0 write_lsn | 0/1A898E0 flush_lsn | 0/1A898E0 replay_lsn | 0/1A898E0 last_sent_xact_id | 746 last_sent_xact_committs | 2024-02-06 18:04:22.430376+00 last_sent_xact_at | 2024-02-06 18:04:22.431359+00 last_applied_xact_id | 746 last_applied_xact_committs | 2024-02-06 18:04:22.430376+00 last_applied_xact_at | 2024-02-06 18:04:52.452465+00 lag | 00:00:30.022089

Limitations liées à l'extension pgactive

  • Toutes les tables nécessitent une clé primaire, faute de quoi, les mises à jour et les suppressions ne sont pas autorisées. Les valeurs de la colonne Primary Key (Clé primaire) ne doivent pas être mises à jour.

  • Les séquences peuvent présenter des écarts et parfois ne suivre aucun ordre. Les séquences ne sont pas répliquées. Pour de plus amples informations, veuillez consulter Gestion des séquences dans une réplication active-active.

  • DDLet les objets volumineux ne sont pas répliqués.

  • Les index uniques secondaires peuvent causer des divergences de données.

  • Le classement doit être identique sur tous les nœuds du groupe.

  • L'équilibrage de charge entre les nœuds est un anti-modèle.

  • Les transactions volumineuses peuvent occasionner un retard de réplication.