Supervision de PostgreSQL

Module H1

Dalibo SCOP

24.09

29 août 2024

Sur ce document

Formation Module H1
Titre Supervision de PostgreSQL
Révision 24.09
PDF https://dali.bo/h1_pdf
EPUB https://dali.bo/h1_epub
HTML https://dali.bo/h1_html
Slides https://dali.bo/h1_slides
TP https://dali.bo/h1_tp
TP (solutions) https://dali.bo/h1_solutions

Licence Creative Commons CC-BY-NC-SA

Cette formation est sous licence CC-BY-NC-SA. Vous êtes libre de la redistribuer et/ou modifier aux conditions suivantes :

  • Paternité
  • Pas d’utilisation commerciale
  • Partage des conditions initiales à l’identique

Marques déposées

PostgreSQL® Postgres® et le logo Slonik sont des marques déposées par PostgreSQL Community Association of Canada.

Versions de PostgreSQL couvertes

Ce document ne couvre que les versions supportées de PostgreSQL au moment de sa rédaction, soit les versions 12 à 16.

Supervision

PostgreSQL

Introduction

  • Deux types de supervision
    • occasionnelle
    • automatique
  • Superviser PostgreSQL et le système
  • Pour PostgreSQL, statistiques et traces
  • Politique de supervision
  • Supervision de PostgreSQL
  • Traces : configuration & analyses
  • Statistiques d’activité

Politique de supervision

  • Pour quoi ?
  • Pour qui ?
  • Quels critères ?
  • Quels outils

Objectifs de la supervision

  • Améliorer/mesurer les performances
  • Améliorer l’applicatif
  • Anticiper/prévenir les incidents
  • Réagir vite en cas de crash

Acteurs concernés

  • Développeur
    • correction et optimisation de requêtes
  • Administrateur de bases de données
    • surveillance, performance
    • mise à jour
  • Administrateur système
    • surveillance, qualité de service

Exemples d’indicateurs - système d’exploitation

  • Charge CPU
  • Entrées/sorties disque
  • Espace disque
  • Sur-activité et non-activité du serveur
  • Temps de réponse
  • Outils Unix habituels :
    • top, atop, free, df, vmstat, sar, iotop

Exemples d’indicateurs - base de données

  • Nombre de connexions
  • Requêtes lentes et/ou fréquentes
  • Ratio d’utilisation du cache
  • Verrous
  • Volumétries

Supervision de PostgreSQL

  • Supervision occasionnelle
    • sur incident…
  • Supervision automatique
    • remonter des informations rapidement
    • archiver, suivre les tendances

Informations internes

  • PostgreSQL propose :
    • statistiques d’activité
    • traces
  • …mais rien pour les historiser

Outils externes

  • Pour conserver les informations
  • …et exécuter automatiquement des actions
    • graphiques (Munin, Zabbix…)
    • envoi d’alertes (Nagios, tail_n_mail)

check_pgactivity

  • Script de monitoring PostgreSQL pour Nagios
    • nombreuses sondes spécifiques à PostgreSQL
    • nombreuses métriques remontées
  • Développé au départ par Dalibo
    • utilisable indépendamment
  • https://github.com/OPMDG/check_pgactivity

check_postgres

Traces

  • Configuration
    • traces peu fournies par défaut
  • Récupération
    • des problèmes importants
    • des requêtes lentes/fréquentes
  • Outils externes de classement

Configuration des traces : principes

  • Où tracer ?
  • Quel niveau de traces ?
  • Tracer les requêtes 
    • durée, fichiers temporaires…
  • Tracer certains comportements
    • erreurs

Événements exceptionnels tracés

  • Crash de PostgreSQL :
PANIC:  could not write to file "pg_wal/xlogtemp.9109":
        No space left on device
  • Rechargement de la configuration :
LOG:  received SIGHUP, reloading configuration files
  • Envoi immédiat d’une alerte
  • Outil : tail_n_mail

Où tracer ?

Gestion des traces

Configuration de la destination des traces

  • log_destination :
    • stderr / csvlog / jsonlog (v15)
    • syslog / eventlog
  • logging_collector : géré par PostgreSQL (Red Hat)
    • log_directory, log_filename, log_file_mode
    • log_rotation_age, log_rotation_size, log_truncate_on_rotation
  • Sinon : si off, penser à logrotate (Debian)
  • syslog (Unix)
    • syslog_facility, syslog_ident
    • syslog_sequence_numbers, syslog_split_messages
  • eventlog (Windows) : event_source

Niveau des traces

  • log_min_messages
    • défaut : panic / fatal / log / error / warning
  • log_min_error_statement
    • défaut : error (ou warning)
  • log_error_verbosity
    • default / terse / verbose

Tracer les requêtes et leur durée

  • Toutes les requêtes :
    • log_min_duration_statement (ex : 1s)
    • ou log_statement + log_duration
  • Extrait aléatoire :
    • log_transaction_sample_rate
    • log_statement_sample_rate + log_min_duration_sample

Configuration : tracer certains comportements

  • log_connections, log_disconnections
  • log_autovacuum_min_duration
  • log_checkpoints
  • log_lock_waits (mini 1s)
  • log_recovery_conflict_waits (v14+)

Repérer les fichiers temporaires

  • Exemple :
LOG:  temporary file: path "base/pgsql_tmp/pgsql_tmp9894.0",
      size 26927104
  • log_temp_files à activer !
  • Alerte : problème potentiel de performances

Configuration : divers

  • log_line_prefix
    • Conseillé : %t [%p]: [%l-1] user=%u,db=%d,app=%a,client=%h
  • lc_messages = C
  • log_timezone = 'Europe/Paris'

Outils d’analyse des traces

  • Beaucoup d’outils existent
    • en temps réel / rétro-analyse
    • généralistes / spécifiques PostgreSQL
  • Exemples :
    • pgBadger
    • logwatch
    • tail_n_mail

pgBadger

  • Site officiel : https://pgbadger.darold.net/
  • Licence : PostgreSQL
  • Analyse des traces de durée d’exécution des requêtes
  • Analyse des traces du VACUUM, des connexions, des checkpoints
  • Compatible syslog, stderr, csvlog

pgBadger : exemple de rapport

Capture pgBadger

Utiliser pgBadger

  • Script Perl
  • Traite les journaux applicatifs
  • Recherche des informations
    • sur les requêtes (normalisées) et leur durée d’exécution
    • sur les connexions et sessions
    • sur les checkpoints
    • sur l’autovacuum
    • sur les verrous
    • etc.
  • Génération d’un rapport HTML très détaillé

Configurer PostgreSQL pour pgBadger

  • Minimum :
    • log_destination
    • log_line_prefix
    • lc_messages=C
  • Base :
    • log_connections, log_disconnections
    • log_checkpoints
    • log_lock_waits
    • log_temp_files
    • log_autovacuum_min_duration
  • Pour un audit :
    • log_min_duration_statement = 0 (attention !)

Options de pgBadger

  • Génération :
pgbadger-o rapport.html postgresql-Mon.log postgresql-Tue.log …
  • Très nombreuses options, dont :
    • --outfile
    • --prefix
    • --begin / --end
    • --dbname, --dbuser, --dbclient, --appname
    • --jobs

pgBadger : exemple 1

Exemple pgBadger : statistiques globales

pgBadger : exemple 2

Exemple pgBadger : requêtes

pgBadger : exemple 3

Exemple pgBadger : fichiers temporaires

pgBadger : exemple 4

Exemple pgBadger : journaux de transaction

pgBadger : exemple 5

Exemple pgBadger 5 : requêtes consommatrices en temps

logwatch

  • Outil externe écrit en Perl
  • À exécuter périodiquement
  • Analyse le contenu des journaux applicatifs
  • Envoie un mail s’il détecte certains motifs
  • Exemple :
/usr/sbin/logwatch --detail Med --service postgresql --range All

tail_n_mail

  • Outil externe écrit en Perl
  • À exécuter périodiquement
  • Analyse le contenu des journaux applicatifs
  • Envoie un mail s’il détecte certains motifs

Configurer tail_n_mail

EMAIL: astreinte@dalibo.com
MAILSUBJECT: HOST Postgres fatal errors (FILE)
FILE: /var/log/postgresql-%Y-%m-%d.log
INCLUDE: PANIC:
INCLUDE: FATAL:
EXCLUDE: database ".+" does not exist
INCLUDE: temporary file
INCLUDE: reloading configuration files

tail_n_mail : exemple

Exemple:

[1] Between lines 123005 and 147976, occurs 39 times.
First:  Jan  1 00:00:01 rojogrande postgres[4306]
Last:   Jan  1 10:30:00 rojogrande postgres[16854]
Statement: user=root,db=rojogrande
        FATAL: password authentication failed for user "root"

Statistiques d’activité

  • Configuration
  • Liste des vues statistiques
  • Outils externes de classement

Statistiques d’activité - configuration 1

  • Tracer l’activité :
    • track_activities = on
  • S’assurer que les requêtes ne sont pas tronquées :
    • track_activity_query_size = 10000 ou +
  • Récupérer l’identifiant de requête
    • compute_query_id = on

Statistiques d’activité - configuration 2

  • track_counts = on
  • track_io_timing = on
  • track_functions = off / pl / all

Statistiques d’activité - configuration 3

  • stats_temp_directory (<v15)
    • répertoire contenant les fichiers temporaires des statistiques
    • copié vers pg_stat lors d’un arrêt propre
    • à monter sur du tmpfs

Statistiques d’activité : perte

  • Les statistiques d’activité sont perdues en cas de crash ou restauration
    • ANALYZE (voire VACUUM)

Informations intéressantes à récupérer

Sur :

  • l’activité
  • l’instance
  • les bases
  • les tables
  • les index
  • les fonctions

Nombre de connexions par base

SELECT datname, numbackends FROM pg_stat_database;
SELECT datname, count(*) FROM pg_stat_activity
  WHERE datname IS NOT NULL
  GROUP BY datname;
Nombre de connexions par base

Taille des bases

SELECT datname, pg_database_size(oid) FROM pg_database;
Taille des bases

Nombre de verrous

SELECT d.datname, count(*) FROM pg_locks l
JOIN pg_database d ON l.database=d.oid
GROUP BY d.datname ORDER BY d.datname;
Nombre de verrous

Et un grand nombre d’autres informations

  • Ratio de lecture du cache (souvent appelé hit ratio)
  • Retard de réplication
  • Nombre de transactions par seconde

Outils

munin

  • Scripts Perl
  • Sondes PostgreSQL incluses
  • Récupère les statistiques toutes les 5 min
  • Crée des pages HTML statiques et des fichiers PNG
    • donc des graphes

Nagios

  • Outil GPL, sur https://www.nagios.org/
  • Nombreux concurrents et équivalents
  • Sondes dédiées à PostgreSQL : check_postgres et check_pgactivity

Outils - Zabbix

Outils - pg_stat_statements

  • Module contrib de PostgreSQL
  • Récupère et stocke des statistiques d’exécution des requêtes
  • Les requêtes sont normalisées
  • Pas d’historisation

Outils - PoWA

PoWA

Conclusion

  • Un système est pérenne s’il est bien supervisé
  • Supervision automatique
    • configuration des traces
    • configuration des statistiques
    • mise en place d’outils d’historisation

Questions

N’hésitez pas, c’est le moment !

Quiz

Travaux pratiques

Analyse de traces avec pgBadger

But : Analyser un journal de traces avec pgBadger

Travaux pratiques (solutions)