2019-09-17 23:28:05 +02:00
|
|
|
# _Réplication Logique_ avec PostgreSQL
|
|
|
|
|
|
|
|
<https://www.postgresql.org/docs/11/logical-replication.html>
|
|
|
|
|
|
|
|
## Mise en place
|
|
|
|
|
|
|
|
Sur le serveur primaire et réplica, on s'assure d'avoir deux bases :
|
|
|
|
|
|
|
|
~~~
|
|
|
|
postgres $ createuser -p 5432 -P foo
|
|
|
|
Enter password for new role:
|
|
|
|
|
|
|
|
postgres $ createdb -p 5432 -O foo foo
|
|
|
|
~~~
|
|
|
|
|
|
|
|
Sur le serveur primaire, on modifie la directive `wal_level` :
|
|
|
|
|
|
|
|
~~~
|
|
|
|
wal_level = logical
|
|
|
|
~~~
|
|
|
|
|
|
|
|
Puis l'on crée un utilisateur `replication` et une publication liée à cette base :
|
|
|
|
|
|
|
|
~~~
|
|
|
|
postgres $ createuser -p 5432 -P --replication replication
|
|
|
|
|
|
|
|
postgres $ psql -p 5432 foo
|
|
|
|
|
|
|
|
foo=# GRANT SELECT on ALL TABLES IN SCHEMA public TO replication;
|
|
|
|
GRANT
|
|
|
|
|
|
|
|
foo=# CREATE PUBLICATION alltables FOR ALL TABLES;
|
|
|
|
CREATE PUBLICATION
|
|
|
|
~~~
|
|
|
|
|
|
|
|
Sur le serveur réplica, on crée une subscription liée à cette base :
|
|
|
|
|
|
|
|
~~~
|
|
|
|
postgres $ psql -p 5432 foo
|
|
|
|
|
|
|
|
foo=# CREATE SUBSCRIPTION mysub CONNECTION 'dbname=foo host=192.0.2.1 port=5436 user=replication password=PASSWORD' PUBLICATION alltables;
|
|
|
|
NOTICE: created replication slot "mysub" on publisher
|
|
|
|
CREATE SUBSCRIPTION
|
|
|
|
~~~
|
|
|
|
|
|
|
|
Attention, contrairement à la réplication physique, rien n'empêche d'écrire sur le serveur réplica.
|
|
|
|
|
|
|
|
Ensuite, il faut créer les tables de façon identique sur les deux bases :
|
|
|
|
|
|
|
|
~~~
|
|
|
|
postgres $ psql -U foo -h 127.0.0.1 -p 5432 foo
|
|
|
|
foo=> CREATE TABLE t (a INT);
|
|
|
|
~~~
|
|
|
|
|
|
|
|
Enfin, l'insertion de données sur le serveur primaire, devrait provoquer le transfert de ces données sur le serveur réplica :
|
|
|
|
|
|
|
|
~~~
|
|
|
|
LOG: logical replication table synchronization worker for subscription "mysub", table "t" has started
|
|
|
|
~~~
|
|
|
|
|
|
|
|
Si besoin, on peut « rafraichir » la subscription sur le serveur replica via la commande :
|
|
|
|
|
|
|
|
~~~
|
|
|
|
postgres $ psql -p 5432 foo
|
|
|
|
|
|
|
|
foo=# ALTER SUBSCRIPTION mysub REFRESH PUBLICATION;
|
|
|
|
~~~
|
|
|
|
|
|
|
|
|
|
|
|
## Administration
|
|
|
|
|
|
|
|
### Ajout / modification d'une table
|
|
|
|
|
|
|
|
Si l'on veut ajouter ou modifier une table, il faut :
|
|
|
|
|
|
|
|
- créer / modifier la table sur les 2 serveurs maître et réplica
|
|
|
|
- relancer la commande suivante sur le serveur maître :
|
|
|
|
|
|
|
|
~~~
|
|
|
|
postgres $ psql -p 5432 foo
|
|
|
|
|
|
|
|
foo=# GRANT SELECT on ALL TABLES IN SCHEMA public TO replication;
|
|
|
|
GRANT
|
|
|
|
~~~
|
|
|
|
|
|
|
|
- relancer la commande suivante sur le serveur réplica :
|
|
|
|
|
|
|
|
~~~
|
|
|
|
postgres $ psql -p 5432 foo
|
|
|
|
|
|
|
|
foo=# ALTER SUBSCRIPTION mysub REFRESH PUBLICATION;
|
|
|
|
~~~
|
|
|
|
|
|
|
|
On peut ensuite insérer des données sur la nouvelle table qui sera répliquée.
|
|
|
|
|
2019-11-18 22:27:31 +01:00
|
|
|
### Suspendre une réplication
|
|
|
|
|
|
|
|
Mettre en pause une réplication :
|
|
|
|
|
|
|
|
~~~
|
|
|
|
foo=# ALTER SUBSCRIPTION mysub DISABLE;
|
|
|
|
|
|
|
|
LOG: le processus apply de réplication logique pour la souscription « mysub » s'arrêtera car la souscription a été désactivée
|
|
|
|
~~~
|
|
|
|
|
|
|
|
Reprendre une réplication :
|
|
|
|
|
|
|
|
~~~
|
|
|
|
foo=# ALTER SUBSCRIPTION mysub ENABLE;
|
|
|
|
~~~
|
|
|
|
|
2019-09-17 23:33:21 +02:00
|
|
|
### Suppression
|
|
|
|
|
|
|
|
~~~
|
|
|
|
DROP PUBLICATION alltables;
|
|
|
|
DROP SUBSCRIPTION mysub;
|
|
|
|
~~~
|
|
|
|
|
2019-09-17 23:28:05 +02:00
|
|
|
|
|
|
|
## Monitoring
|
|
|
|
|
|
|
|
Sur le serveur replica, on peut surveiller le bon fonctionnement de la réplication ainsi :
|
|
|
|
|
|
|
|
~~~
|
|
|
|
postgres=# select * from pg_subscription ;
|
|
|
|
subdbid | subname | subowner | subenabled | subconninfo | subslotname | subsynccommit | subpublications
|
|
|
|
---------+---------+----------+------------+----------------------------------------------------------------------------+-------------+---------------+-----------------
|
|
|
|
16385 | mysub | 10 | t | dbname=foo host=192.0.2.1 port=5432 user=replication password=PASSWORD | mysub | off | {alltables}
|
|
|
|
(1 row)
|
|
|
|
|
|
|
|
postgres=# select * from pg_stat_subscription ;
|
|
|
|
subid | subname | pid | relid | received_lsn | last_msg_send_time | last_msg_receipt_time | latest_end_lsn | latest_end_time
|
|
|
|
-------+---------+-------+-------+--------------+-------------------------------+-------------------------------+----------------+-------------------------------
|
|
|
|
16388 | mysub | 12767 | | 0/16A58D8 | 2019-09-17 21:09:16.512057+00 | 2019-09-17 21:09:16.512241+00 | 0/16A58D8 | 2019-09-17 21:09:16.512057+00
|
|
|
|
~~~
|
|
|
|
|
|
|
|
|