Comment configurer la réplication logique avec PostgreSQL 10 sur Ubuntu 18.04

introduction

Lors de la configuration d’une application pour la production, il est souvent utile de disposer de plusieurs copies de votre base de données. Le processus de synchronisation des copies de base de données est appeléreplication. La réplication peut fournir une mise à l'échelle horizontale à haute disponibilité pour de grands volumes d'opérations de lecture simultanées, avec des latences de lecture réduites. Il permet également une réplication entre homologues entre serveurs de base de données répartis géographiquement.

PostgreSQL est un système de base de données relationnelle objet open source hautement extensible et conforme àACID (atomicité, cohérence, isolation, durabilité) et au standard SQL. La version 10.0 de PostgreSQL a introduit la prise en charge delogical replication, en plus dephysical replication. Dans un schéma de réplication logique, les opérations d'écriture de haut niveau sont transférées d'un serveur de base de donnéesmaster vers un ou plusieurs serveurs de base de donnéesreplica. Dans un schéma de réplication physique, les opérations d'écriture binaires sont plutôt transmises du maître au réplica, produisant une copie exacte octet par octet du contenu d'origine. Dans les cas où vous souhaitez cibler un sous-ensemble de données particulier, tel que la génération de rapports, la correction ou la mise à niveau, la réplication logique peut offrir rapidité et flexibilité.

Dans ce didacticiel, vous allez configurer la réplication logique avec PostgreSQL 10 sur deux serveurs Ubuntu 18.04, l’un servant de maître et l’autre de réplique. À la fin du didacticiel, vous pourrez répliquer les données du serveur maître sur le réplica à l'aide de la réplication logique.

Conditions préalables

Pour suivre ce tutoriel, vous aurez besoin de:

  • Deux serveurs Ubuntu 18.04, que nous nommeronsdb-master etdb-replica, chacun configuré avec un compte utilisateur régulier et des privilèges sudo. Pour les configurer, suivezthis initial server setup tutorial.

  • Private networking enabled sur vos serveurs. La mise en réseau privée permet la communication entre vos serveurs sans les risques de sécurité associés à l’exposition des bases de données à l’Internet public.

  • PostgreSQL 10 installé sur les deux serveurs, en suivant l'étape 1 deHow To Install and Use PostgreSQL on Ubuntu 18.04.

[[step-1 -—- configuring-postgresql-for-logical-replication]] == Étape 1 - Configuration de PostgreSQL pour la réplication logique

Vous devrez modifier plusieurs paramètres de configuration pour activer la réplication logique entre vos serveurs. Tout d’abord, vous configurerez Postgres pour qu’il écoute sur l’interface réseau privée plutôt que sur l’interface publique, car l’exposition des données sur le réseau public constitue un risque pour la sécurité. Ensuite, vous allez configurer les paramètres appropriés pour autoriser la réplication versdb-replica.

Surdb-master, ouvrez/etc/postgresql/10/main/postgresql.conf, le fichier de configuration du serveur principal:

sudo nano /etc/postgresql/10/main/postgresql.conf

Trouvez la ligne suivante:

/etc/postgresql/10/main/postgresql.conf

...
#listen_addresses = 'localhost'         # what IP address(es) to listen on;
...

Décommentez-le en supprimant les#, et ajoutez vosdb_master_private_ip_address pour activer les connexions sur le réseau privé:

[.note] #Note: Dans cette étape et les étapes suivantes, assurez-vous d'utiliser les adresses IPprivate de vos serveurs et non leurs adresses IP publiques. L'exposition d'un serveur de base de données à l'Internet public est un risque de sécurité considérable.
#

/etc/postgresql/10/main/postgresql.conf

...
listen_addresses = 'localhost, db_master_private_ip_address'
...

Cela permet àdb-master d'écouter les connexions entrantes sur le réseau privé en plus de l'interface de bouclage.

Ensuite, trouvez la ligne suivante:

/etc/postgresql/10/main/postgresql.conf

...
#wal_level = replica                    # minimal, replica, or logical
...

Décommentez-le et modifiez-le pour définir le niveau PostgreSQLWrite Ahead Log (WAL) surlogical. Cela augmente le volume d'entrées dans le journal, en ajoutant les informations nécessaires à l'extraction des écarts ou des modifications apportées à des ensembles de données particuliers:

/etc/postgresql/10/main/postgresql.conf

...
wal_level = logical
...

Les entrées de ce journal seront utilisées par le serveur de réplica, ce qui permettra la réplication des opérations d'écriture de haut niveau à partir du maître.

Enregistrez le fichier et fermez-le.

Ensuite, éditons/etc/postgresql/10/main/pg_hba.conf, le fichier qui contrôle les hôtes autorisés, l'authentification et l'accès aux bases de données:

sudo nano /etc/postgresql/10/main/pg_hba.conf

Après la dernière ligne, ajoutons une ligne pour autoriser les connexions réseau entrantes à partir dedb-replica. Nous utiliserons l'adresse IP privée dedb-replica et spécifierons que les connexions sont autorisées à partir de tous les utilisateurs et bases de données:

/etc/postgresql/10/main/pg_hba.conf

...
# TYPE      DATABASE        USER            ADDRESS                               METHOD
...
host         all            all             db_replica_private_ip_address/32      md5

Les connexions réseau entrantes seront désormais autorisées à partir dedb-replica, authentifiées par un hachage de mot de passe(md5).

Enregistrez le fichier et fermez-le.

Ensuite, définissons nos règles de pare-feu pour autoriser le trafic dedb-replica vers le port5432 surdb-master:

sudo ufw allow from db_replica_private_ip_address to any port 5432

Enfin, redémarrez le serveur PostgreSQL pour que les modifications prennent effet:

sudo systemctl restart postgresql

Avec votre configuration configurée pour permettre la réplication logique, vous pouvez maintenant passer à la création d'une base de données, d'un rôle utilisateur et d'une table.

[[step-2 -—- setting-up-a-database-user-role-and-table]] == Étape 2 - Configuration d'une base de données, d'un rôle d'utilisateur et d'une table

Pour tester la fonctionnalité de vos paramètres de réplication, créons une base de données, une table et un rôle utilisateur. Vous allez créer une base de donnéesexample avec un exemple de table, que vous pourrez ensuite utiliser pour tester la réplication logique entre vos serveurs. Vous allez également créer un utilisateur dédié et lui attribuer des privilèges à la fois sur la base de données et sur la table.

Tout d'abord, ouvrez lepsql prompt en tant qu'utilisateurpostgres avec la commande suivante sur lesdb-master etdb-replica:

sudo -u postgres psql
sudo -u postgres psql

Créez une nouvelle base de données appeléeexample sur les deux hôtes:

CREATE DATABASE example;
CREATE DATABASE example;

[.note] #Note: Le; final de ces commandes est requis. Sur les sessions interactives, PostgreSQL n'exécutera pas de commandes SQL tant que vous ne les terminerez pas par un point-virgule. Les méta-commandes (celles commençant par une barre oblique inverse, comme\q et\c) contrôlent directement le client psql lui-même, et sont donc exemptées de cette règle. Pour plus d'informations sur les méta-commandes et le client psql, reportez-vous auxPostgreSQL documentation.
#

À l'aide de la méta-commande\connect, connectez-vous aux bases de données que vous venez de créer sur chaque hôte:

\c example
\c example

Créez une nouvelle table appeléewidgets avec des champs arbitraires sur les deux hôtes:

CREATE TABLE widgets
(
    id SERIAL,
    name TEXT,
    price DECIMAL,
    CONSTRAINT widgets_pkey PRIMARY KEY (id)
);
CREATE TABLE widgets
(
    id SERIAL,
    name TEXT,
    price DECIMAL,
    CONSTRAINT widgets_pkey PRIMARY KEY (id)
);

La table surdb-replica n'a pas besoin d'être identique à son homologuedb-master. Cependant, il doit contenir chaque colonne présente sur la table àdb-master. Les colonnes supplémentaires ne doivent pas avoir deNOT NULL ou d'autres contraintes. Si tel est le cas, la réplication échouera.

Surdb-master, créons un nouveau rôle utilisateur avec l'optionREPLICATION et un mot de passe de connexion. L'attributREPLICATION doit être affecté à tout rôle utilisé pour la réplication. Nous appellerons notre utilisateursammy, mais vous pouvez le remplacer par votre propre nom d'utilisateur. Assurez-vous de remplacer égalementmy_password par votre propre mot de passe sécurisé:

CREATE ROLE sammy WITH REPLICATION LOGIN PASSWORD 'my_password';

Notez votre mot de passe, car vous l'utiliserez plus tard ledb-replica pour configurer la réplication.

Toujours surdb-master, accordez tous les privilèges sur la base de donnéesexample au rôle utilisateur que vous venez de créer:

GRANT ALL PRIVILEGES ON DATABASE example TO sammy;

Ensuite, accordez à votre utilisateur les privilèges sur toutes les tables contenues dans la base de données:

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO sammy;

Lepublic schema est un schéma par défaut dans chaque base de données dans lequel les tables sont automatiquement placées.

Avec ces privilèges définis, vous pouvez maintenant passer à rendre les tables de votre base de donnéesexample disponibles pour la réplication.

[[step-3 -—- setting-up-a-publication]] == Étape 3 - Configuration d'une publication

Publications est le mécanisme utilisé par PostgreSQL pour rendre les tables disponibles pour la réplication. Le serveur de base de données gardera trace en interne de la connexion et de l'état de la réplication de tous les serveurs de réplicas associés à une publication donnée. Ledb-master, vous allez créer une publication,my_publication, qui fonctionnera comme une copie principale des données qui seront envoyées à vossubscribers - dans notre cas,db-replica .

Surdb-master, créez une publication appeléemy_publication:

CREATE PUBLICATION my_publication;

Ajoutez-y la tablewidgets que vous avez créée précédemment:

ALTER PUBLICATION my_publication ADD TABLE widgets;

Avec votre publication en place, vous pouvez maintenant ajouter un abonné qui en extraira des données.

[[step-4 -—- creation-a-subscription]] == Étape 4 - Création d'un abonnement

LesSubscriptions sont utilisés par PostgreSQL pour se connecter aux publications existantes. Une publication peut avoir de nombreux abonnements sur différents serveurs de réplica, et les serveurs de réplica peuvent également avoir leurs propres publications avec des abonnés. Pour accéder aux données de la table que vous avez créée surdb-master, vous devrez créer un abonnement à la publication que vous avez créée à l'étape précédente,my_publication.

Ledb-replica, créons un abonnement appelémy_subscription. La commandeCREATE SUBSCRIPTION nommera l'abonnement, tandis que le paramètreCONNECTION définira la chaîne de connexion à l'éditeur. Cette chaîne comprendra les détails de connexion et les informations de connexion du serveur maître, y compris le nom d'utilisateur et le mot de passe que vous avez définis précédemment, ainsi que le nom de la base de donnéesexample. Encore une fois, n'oubliez pas d'utiliser l'adresse IP privée dedb-master et remplacezmy_password par votre propre mot de passe:

CREATE SUBSCRIPTION my_subscription CONNECTION 'host=db_master_private_ip_address port=5432 password=my_password user=sammy dbname=example' PUBLICATION my_publication;

Vous verrez la sortie suivante confirmant l'abonnement:

OutputNOTICE:  created replication slot "my_subscription" on publisher
CREATE SUBSCRIPTION

Lors de la création d'un abonnement, PostgreSQL ™ synchronisera automatiquement toutes les données préexistantes du maître vers le réplica. Dans notre cas, il n'y a pas de données à synchroniser car la tablewidgets est vide, mais c'est une fonctionnalité utile lors de l'ajout de nouveaux abonnements à une base de données existante.

Avec un abonnement en place, testons la configuration en ajoutant des données de démonstration à la tablewidgets.

[[step-5 -—- testing-and-troubleshooting]] == Étape 5 - Test et dépannage

Pour tester la réplication entre notre maître et notre réplica, ajoutons des données à la tablewidgets et vérifions qu’elles se répliquent correctement.

Surdb-master, insérez les données suivantes dans la tablewidgets:

INSERT INTO widgets (name, price) VALUES ('Hammer', 4.50), ('Coffee Mug', 6.20), ('Cupholder', 3.80);

Surdb-replica, exécutez la requête suivante pour récupérer toutes les entrées de cette table:

SELECT * FROM widgets;

Vous devriez maintenant voir:

Output id |    name    | price
----+------------+-------
  1 | Hammer     |  4.50
  2 | Coffee Mug |  6.20
  3 | Cupholder  |  3.80
(3 rows)

Succès! Les entrées ont été répliquées avec succès dedb-master versdb-replica. Désormais, toutes les requêtesINSERT,UPDATE etDELETE seront répliquées de manière unidirectionnelle sur les serveurs.

Une chose à noter sur les requêtes d'écriture sur les serveurs de réplica est qu'elles ne sont pas répliquées sur le serveur maître. PostgreSQL ne supporte actuellement que de manière limitée la résolution des conflits lorsque les données entre serveurs divergent. En cas de conflit, la réplication s'arrête et PostgreSQL attend que le problème soit résolu manuellement par l'administrateur de la base de données. Pour cette raison, la plupart des applications dirigent toutes les opérations d'écriture sur le serveur maître et distribuent les lectures entre les serveurs de répliques disponibles.

Vous pouvez maintenant quitter l'invitepsql sur les deux serveurs:

\q
\q

Maintenant que vous avez terminé de tester votre configuration, vous pouvez ajouter et répliquer vos propres données.

Dépannage

Si la réplication ne semble pas fonctionner, une bonne première étape consiste à vérifier le journal PostgreSQL surdb-replica pour d'éventuelles erreurs:

tail /var/log/postgresql/postgresql-10-main.log

Voici quelques problèmes courants susceptibles d'empêcher la réplication de fonctionner:

  • La mise en réseau privée n'est pas activée sur les deux serveurs, ou les serveurs sont sur des réseaux différents;

  • db-master n'est pas configuré pour écouter les connexions sur la bonne adresse IP du réseau privé;

  • Le niveau du journal d'écriture anticipée surdb-master n'est pas correctement configuré (il doit être défini surlogical);

  • db-master n'est pas configuré pour accepter les connexions entrantes de l'adresse IP privée correcte dedb-replica;

  • Un pare-feu comme UFW bloque les connexions PostgreSQL entrantes sur le port5432;

  • Il existe des noms de table ou des champs incompatibles entredb-master etdb-replica;

  • Le rôle de base de donnéessammy ne dispose pas des autorisations requises pour accéder à la base de donnéesexample surdb-master;

  • Le rôle de base de donnéessammy ne dispose pas de l'optionREPLICATION surdb-master;

  • Le rôle de base de donnéessammy ne dispose pas des autorisations requises pour accéder à la tablewidgets surdb-master;

  • Le tableau n'a pas été ajouté à la publication ledb-master.

Une fois le (s) problème (s) existant (s) résolu (s), la réplication doit s'effectuer automatiquement. Si ce n'est pas le cas, utilisez la commande suivante pour supprimer l'abonnement existant avant de le recréer:

DROP SUBSCRIPTION my_subscription;

Conclusion

Dans ce tutoriel, vous avez installé avec succès PostgreSQL 10 sur deux serveurs Ubuntu 18.04 et configuré la réplication logique entre eux.

Vous disposez maintenant des connaissances nécessaires pour expérimenter la mise à l'échelle horizontale de la lecture, la haute disponibilité et la distribution géographique de votre base de données PostgreSQL en ajoutant des serveurs de réplicas supplémentaires.

Pour en savoir plus sur la réplication logique dans PostgreSQL 10, vous pouvez lire leschapter on the topic sur la documentation officielle de PostgreSQL, ainsi que les entrées manuelles sur les commandesCREATE PUBLICATION etCREATE SUBSCRIPTION.

Related