Mettre en place une streaming replication avec PostgreSQL 10

March 13, 2018
postgresql pgfr

Streaming replication avec PostgreSQL 10

Dans ce post, je vais vous expliquer comment mettre en place une streaming replication avec PostgreSQL 10. Par contre, je n’expliquerais pas comment installer PostgreSQL donc je suppose que cela est déjà le cas.

Mon setup est le suivant :

```sql
postgres=# CREATE ROLE replicate WITH REPLICATION LOGIN ;
CREATE ROLE
postgres=# set password_encryption = 'scram-sha-256';
SET
postgres=# \password replicate
Enter new password: 
Enter it again:
```

Si vous pensez que le nombre que vous avez mis dans wal_keep_segments est suffisant, vous pouvez vous arrêter ici. Mais en cas d’incertitude, il vaut mieux configurer le archive_mode pour stocker les WAL (si jamais vous avez un pic d’écriture et que le slave ne va pas assez vite ou si votre slave doit être arrêté pendant une longue période)

```bash
archive_mode = on
archive_command = 'rsync -a %p postgres@slave:/home/postgresql_wal/%f' 
   # placeholders: %p = path of file to archive
   #               %f = file name only
```

Le paramêtre archive_command va copier les segments WAL dans un répertoire qui doit être accessible par le serveur slave. Dans l’exemple ci dessus, j’ai utilisé rsync pour les copier directement sur le slave. Rien ne vous empêche de les copier sur un NFS aussi.

**Attention** : Si comme moi, vous utilisez *rsync*, n'oubliez pas de configurer le ssh pour utiliser l"authentification par clef !!

Et voila, toutes les données sont copiées sur le slave. Si vous avez du sauvegarder les fichiers postgresql.conf et pg_hba.conf, il faut les restaurer.

Voici une expliquation pour chaque ligne :

* standby_mode=on : indique à postgresql qu'il faut démarrer en mode standby
* primary_conninfo : les paramètres à utiliser pour se connecter au master
* trigger_file : si ce fichier existe, la réplication s'arrête et postgresql va devenir maître (donc acceptera les écritures)
* restore_command : cette ligne n'est nécessaire que si vous avez utilisé la commande *archive_mode* sur le master

2018-03-11 19:08:55.777 UTC [8789] LOG: could not bind IPv6 address “::1”: Cannot assign requested address 2018-03-11 19:08:55.777 UTC [8789] HINT: Is another postmaster already running on port 5432? If not, wait a few seconds and retry. 2018-03-11 19:08:55.786 UTC [8789] LOG: listening on Unix socket “/var/run/postgresql/.s.PGSQL.5432” 2018-03-11 19:08:55.820 UTC [8790] LOG: database system was interrupted; last known up at 2018-03-11 18:58:20 UTC 2018-03-11 19:08:56.023 UTC [8790] LOG: entering standby mode 2018-03-11 19:08:56.034 UTC [8790] LOG: redo starts at 0/4000028 2018-03-11 19:08:56.039 UTC [8790] LOG: consistent recovery state reached at 0/40000F8 2018-03-11 19:08:56.040 UTC [8789] LOG: database system is ready to accept read only connections 2018-03-11 19:08:56.071 UTC [8794] LOG: started streaming WAL from primary at 0/5000000 on timeline 1 ```

Et voilà, votre serveur slave est prêt !

-[ RECORD 1 ]—-+—————————— datid | datname | pid | 9134 usesysid | 16384 usename | replicate application_name | walreceiver client_addr | 172.17.0.3 client_hostname | client_port | 45234 backend_start | 2018-03-11 19:08:56.049113+00 xact_start | query_start | state_change | 2018-03-11 19:08:56.071363+00 wait_event_type | Activity wait_event | WalSenderMain state | active backend_xid | backend_xmin | query | backend_type | walsender ```

Setup a streaming replication with PostgreSQL 10

March 11, 2018
postgresql pgen

OpenBSD / PostgreSQL / Authentification

November 29, 2017
openbsd postgresql pgfr

OpenBSD / PostgreSQL / Authentication

November 29, 2017
openbsd postgresql pgen