Vous n'êtes pas identifié(e).

#1 10/05/2019 14:51:48

pitpoule
Membre

Lag de réplication et requête longue sur standby

Bonjour,

Nous rencontrons régulièrement des pics de lag entre notre serveur primaire et notre standby (hot standby en pg 9.6). J'ai l’impression que ce lag est créé par des requêtes "SELECT" très longues qui tournent sur la standby (plusieurs dizaines de minutes). Pendant tout le temps où ces requêtes s'exécutent,les wal ne semblent pas appliqués par la standby.


Extrait du pg_stat_replication sur le primaire. Tout est ok mais le "replay" ne consomment pas les wals.

  usename   | application_name | client_addr | delta_sent_mb | delta_write_mb | delta_flush_mb | delta_replay_mb
-------------+------------------+-------------+---------------+----------------+----------------+-----------------
  replication | walreceiver      | ************  |          0.00 |           0.00 |           0.00 |        91167.93


Est ce que c'est "normal" ?

Merci

Hors ligne

#2 10/05/2019 15:28:20

Marc Cousin
Membre

Re : Lag de réplication et requête longue sur standby

Ça peut., ça dépend de votre paramétrage:
- est-ce que le standby a hot_standby_feedback activé ? (sinon le primaire va supprimer des enregistrements lors de vacuum qui pourraient encore être nécessaires au standby... et donc le standby va devoir arrêter la réplication le temps que ces requetes se terminent)
- que vaut max_standby_streaming_delay ? c'est le temps maximum que le standby va accepter d'attendre avant de commencer à tuer les requêtes qui bloquent la réapplication des journaux


Marc.

Hors ligne

#3 10/05/2019 15:45:17

pitpoule
Membre

Re : Lag de réplication et requête longue sur standby

postgres=# show hot_standby_feedback ;
hot_standby_feedback
----------------------
off
(1 row)

postgres=# show max_standby_streaming_delay ;
max_standby_streaming_delay
-----------------------------
30s
(1 row)


Vu le paramétrage, je ne comprends pas comment je peux avoir du lag

Hors ligne

#4 10/05/2019 15:50:57

Marc Cousin
Membre

Re : Lag de réplication et requête longue sur standby

Etes vous sûr que la réplication est en pause, pas juste très ralentie? Sans connaître votre serveur, il se peut que la sur-consommation de ressources par la requête en écriture ralentisse simplement l'application des journaux... Vous pouvez déjà surveiller pg_last_wal_replay_lsn() sur le standby pour vérifier que c'est en pause et pas très ralenti...


Marc.

Hors ligne

#5 10/05/2019 15:51:59

Marc Cousin
Membre

Re : Lag de réplication et requête longue sur standby

Tant que j'y pense, vérifiez aussi pg_is_wal_replay_paused() sur le standby quand ça se produit… sait on jamais, un développeur retors smile


Marc.

Hors ligne

#6 10/05/2019 16:12:39

pitpoule
Membre

Re : Lag de réplication et requête longue sur standby

Marc Cousin a écrit :

Etes vous sûr que la réplication est en pause, pas juste très ralentie? Sans connaître votre serveur, il se peut que la sur-consommation de ressources par la requête en écriture ralentisse simplement l'application des journaux... Vous pouvez déjà surveiller pg_last_wal_replay_lsn() sur le standby pour vérifier que c'est en pause et pas très ralenti...

C'est possible qu'elle soit ralentie, nous avons une forte charge en écriture sur le serveur primaire, la quantité de wal absorbée n'arrivait surement pas à compenser ce qui arrivaient. Et du coup, le lag montait constamment.

Hors ligne

#7 10/05/2019 16:14:04

pitpoule
Membre

Re : Lag de réplication et requête longue sur standby

Marc Cousin a écrit :

Tant que j'y pense, vérifiez aussi pg_is_wal_replay_paused() sur le standby quand ça se produit… sait on jamais, un développeur retors smile

J'ai eu le doute aussi...et j'ai lancé smile

postgres=# select pg_is_in_recovery();
pg_is_in_recovery
-------------------
t
(1 row)

Hors ligne

#8 10/05/2019 16:17:19

Marc Cousin
Membre

Re : Lag de réplication et requête longue sur standby

pg_is_in_recovery va être à true, normal. Par contre, pg_is_wal_replay_paused, c'est savoir si y aurait pas un petit malin qui met la réplication en pause... je le sais, parce que je l'ai déjà fait (pour passer des pg_dump parallélisé sur un standby par exemple smile )

Sinon, le replay est toujours plus lent que la génération: sur le serveur primaire, il y a plusieurs processus qui insèrent en même temps dans le WAL. Sur le standby, il y a un seul processus qui rejoue le tout. On peut aussi avoir les disques qui ont du mal à suivre ou d'autres choses. Donc vérifiez que la réplication n'est pas effectivement en pause ou bloquée par quelque chose, et si elle avance, il faut trouver la source de contention... cpu ou disque probablement


Marc.

Hors ligne

#9 10/05/2019 16:23:57

pitpoule
Membre

Re : Lag de réplication et requête longue sur standby

Marc Cousin a écrit :

pg_is_in_recovery va être à true, normal. Par contre, pg_is_wal_replay_paused, c'est savoir si y aurait pas un petit malin qui met la réplication en pause... je le sais, parce que je l'ai déjà fait (pour passer des pg_dump parallélisé sur un standby par exemple smile )

Sinon, le replay est toujours plus lent que la génération: sur le serveur primaire, il y a plusieurs processus qui insèrent en même temps dans le WAL. Sur le standby, il y a un seul processus qui rejoue le tout. On peut aussi avoir les disques qui ont du mal à suivre ou d'autres choses. Donc vérifiez que la réplication n'est pas effectivement en pause ou bloquée par quelque chose, et si elle avance, il faut trouver la source de contention... cpu ou disque probablement


Je vais chercher... merci pour le retour smile

Hors ligne

#10 13/05/2019 14:27:37

pitpoule
Membre

Re : Lag de réplication et requête longue sur standby

Il me reste quand même des questions au sujet de la réplication.

De ce que je comprends donc, quand un select est lancé côté standby, PG ne réapplique plus les wal si une modification (update/delete/insert) altère la vue du début du sélect (pour gérer la cohérence). Il attend  max_standby_streaming_delay ou alors, c'est géré par hot_standby_feedback.

C'est bien cela ?

Hors ligne

#11 13/05/2019 15:19:26

Marc Cousin
Membre

Re : Lag de réplication et requête longue sur standby

Non, c'est un peu plus compliqué que ça. Quand on fait un update sous PostgreSQL, on n'écrase pas l'enregistrement, on en fait une autre version dans la même table. Donc on a les deux versions simultanément, et les ordres SQL choisissent ce qu'ils veulent. Cette seconde version est répliquée, pas de problème. C'est les VACUUM qui posent problème, puisqu'ils veulent supprimer les vieilles versions d'enregistrement, qui ne sont plus nécessaires sur le primaire. Le hot_standby_feedback permet justement aux standby de prévenir le maître des enregistrement dont ils ont encore besoin.


Marc.

Hors ligne

Pied de page des forums