Nouveautés de PostgreSQL 13

Workshop 13

Dalibo & Contributors

Nouveautés de PostgreSQL 13

Les nouveautés

  • Administration :
    • maintenance
    • sauvegarde physique
    • divers
  • Réplication physique & logique
  • Supervision
  • Performances
  • Régressions
  • Ateliers

Administration & maintenance

  • VACUUM & autovacuum
  • Réindexation parallélisée

Autovacuum : déclenchement par INSERT

  • Avant PostgreSQL v13 :
    • des INSERTs déclenchent un ANALYZE automatique
    • mais pas de VACUUM
  • VACUUM important pour les VM et FSM
  • Deux nouveaux paramètres :
    • autovacuum_vacuum_insert_threshold
    • autovacuum_vacuum_insert_scale_factor

VACUUM : nouveaux workers

  • VACUUM peut paralléliser le traitement des index
  • Nouvelle option PARALLEL
    • si 0, non parallélisé
  • La table doit avoir :
    • au minimum deux index
    • des index d’une taille supérieure à min_parallel_index_scan_size
  • Non disponible pour le VACUUM FULL

vacuumdb –parallel

  • Nouvelle option --parallel (-P)
  • Utilisé pour la nouvelle clause PARALLEL de VACUUM
  • À ne pas confondre avec l’option --jobs

reindexdb –jobs

  • Nouvelle option --jobs (-j) pour reindexdb
  • Lance autant de connexions sur le serveur PostgreSQL
  • Exécute un REINDEX par connexion
  • Incompatible avec les options SYSTEM et INDEX

Administration : amélioration de la sauvegarde physique

  • Fichiers manifeste
  • Suivi de la sauvegarde
  • Restauration & recovery_target non atteinte

Fichiers manifestes

  • pg_basebackup crée une liste des fichiers présents dans les sauvegardes : le fichier manifeste.

  • Trois nouvelles options :

    • --no-manifest
    • --manifest-force-encode
    • --manifest-checksums=[NONE|CRC32C|SHA224|SHA256|SHA384|SHA512]

Nouvel outil pg_verifybackup

  • Fonction : vérifier une sauvegarde au format plain grâce au fichier manifeste.

  • 4 étapes :

    • vérification de la présence du manifeste et de sa somme de contrôle
    • vérification de la présence des fichiers écrits dans le manifeste
    • vérification des sommes de contrôle des fichiers présents dans le manifeste
    • vérification des WALs (présence, somme de contrôle des enregistrements)
  • Ne dispense pas de tester les sauvegardes en les restaurant !

Suivi de l’exécution des sauvegardes

  • Nouvelle vue : pg_stat_progress_basebackup

  • Permet de surveiller :

    • la phase de la sauvegarde ;
    • la volumétrie sauvegardée et restant à sauvegarder ;
    • le nombre de tablespaces sauvegardés et restant à sauvegarder.

Erreur fatale quand recovery_target ne peut être atteinte

Erreur fatale quand la cible précisée n’est pas atteinte en fin de restauration :

FATAL: recovery ended before configured recovery target was reached

Administration : divers

  • Partitionnement : déclencheurs BEFORE
  • Nouveaux paramètres :
    • ignore_invalid_pages
    • maintenance_io_concurrency
  • DROP DATABASE & déconnexion forcée
  • Extensions de confiance
  • Prompt de psql

Déclencheurs BEFORE sur les partitions

  • possibilité de créer des déclencheurs BEFORE sur les tables partitionnées.

Nouveau paramètre maintenance_io_concurrency

  • Nouveau paramètre maintenance_io_concurrency
  • Permet d’augmenter le nombre d’I/O sur les opérations de maintenance
  • Équivalent à effective_io_concurrency

Nouveau paramètre ignore_invalid_pages

  • ignore_invalid_pages permet de continuer la récupération quand les WAL font référence à des pages invalides
  • Peut (et va) causer des crashs, pertes de données, cacher et propager des corruptions
  • Permet de démarrer en cas de corruption
  • À utiliser sur une copie de l’instance incidentée

Déconnexion des utilisateurs à la suppression d’une base de données

  • Nouvelle clause WITH FORCE pour DROP DATABASE
  • Force la déconnexion des utilisateurs
  • Nouvel argument --force pour l’outil dropdb

Extensions de confiance

  • Objet extension depuis la version 9.1
  • Installation uniquement par un superutilisateur
  • Apparaît la notion de trusted extension
    • installation par les utilisateurs ayant le droit CREATE sur la base
  • Quelques extensions des contribs sont déclarées TRUSTED

Prompt de psql

  • Prompt psql modifié
  • Intègre maintenant l’état de la transaction
  • L’étoile représente une transaction valide en cours
  • Le point d’exclamation représente une transaction erronée en cours

Réplication physique

  • Modification à chaud des paramètres de réplication
  • Slots : volume maximal de journaux (max_slot_wal_keep_size)
  • pg_rewind : nouvelles fonctionnalités

Modification à chaud des paramètres de réplication

  • Plus besoin de redémarrer un secondaire pour modifier les paramètres de réplication
  • Notamment les paramètres primary_conninfo et primary_slot_name
  • Évite la déconnexion des utilisateurs

Volume maximal de journaux conservé par les slots

  • max_slot_wal_keep_size permet de spécifier le volume maximal de WAL que les slots de réplication peuvent conserver dans le répertoire pg_wal ;
  • Ajout des colonnes wal_status et safe_wal_size à la vue pg_replication_slots pour permettre de suivre l’état des slots.

pg_rewind sait restaurer des journaux

  • -c/--restore-target-wal permet de restaurer les archives de journaux de transactions de l’instance cible.

pg_rewind récupère automatiquement une instance

  • pg_rewind lance automatiquement la phase de récupération du serveur cible si nécessaire avant son traitement.
  • il est possible de désactiver ce nouveau comportement avec --no-ensure-shutdown.

pg_rewind génère la configuration de réplication

  • --write-recovery-conf permet de générer le fichier standby.signal et configure la connexion à l’instance primaire dans postgresql.auto.conf ;
  • nécessite de préciser l’argument --source-server

Réplication logique

  • Publication de table partitionnée
  • Consommation mémoire des walsenders

Publication d’une table partitionnée

Il est désormais possible de :

  • ajouter une table partitionnée à une publication
  • répliquer vers une table partitionnée
  • répliquer depuis la racine d’une table partitionnée (option publish_via_partition_root)
    • en cas de partitionnement différent sur la cible

Consommation mémoire du décodage logique

  • Nouveau paramètre logical_decoding_work_mem
    • Défaut : 64 Mo par session
  • Contrôle la mémoire allouée au décodage logique avant de déborder sur disque
  • Concerne toute session consommant un slot logique, y compris les walsenders
  • Meilleur contrôle de la consommation mémoire des walsenders

Supervision

  • Journaux & type de processus
  • Échantillonnage des requêtes
  • Requêtes préparées : paramètres
  • pg_stat_statements : temps de planification
  • pg_stat_statements : leader_pid
  • Vue pg_stat_progress_analyze
  • Vue pg_shmem_allocations

Tracer le type de processus dans les journaux

  • Ajout d’un nouvel échappement (%b) à log_line_prefix pour tracer le type de backend.
  • Le type de backend est également ajouté aux traces formatées en csv.

Échantillonner les requêtes

  • log_min_duration_sample : durée minimum requise pour qu’une requête échantillonnée puisse être tracée.
  • log_statement_sample_rate : probabilité qu’une requête durant plus de log_min_duration_sample soit tracée.
  • priorité de log_min_duration_statement sur log_min_duration_sample.

Paramètres des requêtes préparées

  • log_parameter_max_length permet de définir le volume de paramètres maximal associé aux requêtes préparées dans les traces ;
  • ces valeurs sont notamment associées à leur requête préparée par les paramètres log_min_duration_statements ou log_min_duration_sample ;
  • log_parameter_max_length_on_error permet de définir le volume de paramètres maximal affiché dans les traces des requêtes préparées à cause d’erreurs.

pg_stat_statements : temps de planification

  • pg_stat_statements peut désormais collecter pour chaque requête le nombre de phases d’optimisation et le temps qui y est alloué ;
  • pg_stat_statements.track_planning permet d’activer cette collecte. Sa valeur par défaut est off.

pg_stat_activity : nouveau champ leader_pid

  • La vue pg_stat_activity contient une nouvelle colonne leader_pid pour identifier le leader d’un groupe de processus parallélisés ;
  • Pour un leader ou un processus non parallélisé, la valeur de cette colonne est NULL.

Nouvelle vue pg_stat_progress_analyze

  • Nouvelle vue pg_stat_progress_analyze

Nouvelle vue pg_shmem_allocations

Vue pg_shmem_allocations :

  • Voir les allocations du segment principal de mémoire partagée
  • PostgreSQL et extensions

Performances

  • B-Tree : déduplication
  • Tri incrémental
  • Statistiques étendues
  • Hash Aggregate : débord sur disque
  • Statistiques d’utilisation des WAL
  • EXPLAIN : Utilisation disque du planificateur

Déduplication des index B-Tree

Objectifs

  • Réduction du volume d’un index en ne stockant qu’une seule fois chaque valeur
  • Gain en espace disque et en performance en lecture
  • Implémentation paresseuse : pas de perte de performance en écriture

Nouveaux éléments

  • Nouvelles colonnes visibles avec l’extension pageinspect
  • Champ allequalimage dans bt_metap()
    • si true : possibilité de déduplication
  • Champs htid et tids dans bt_page_items()
    • utilisés pour stocker tous les tuples indexés pour une valeur donnée

Limitation

  • Déduplication non disponible pour plusieurs types de colonnes :

    • les types text, varchar et char si une collation non-déterministe est utilisée
    • le type numeric et par extension les types float4, float8 et jsonb
    • les types composites, tableau et intervalle
    • les index couvrants (mot clé INCLUDE)

Tri incrémental

  • Nouveau nÅ“ud Incremental Sorting
  • Profiter des index déjà présents
  • Trier plus rapidement
    • notamment en présence d’un LIMIT

Paramétrage du détail pour les statistiques étendues

  • Permet de spécifier séparément la finesse de calcul pour les statistiques classiques et étendues

  • Nouvelle commande :

    ALTER STATISTICS stat_name SET STATISTICS target_value

Hash Aggregate : débord sur disque

  • les nÅ“uds Hash Aggregate peuvent désormais déborder sur disque
  • permet une gestion plus saine de la mémoire
  • nouveau paramètre hash_mem_multiplier
  • hash_mem_multiplier * work_mem définit la quantité de mémoire autorisée pour chaque nÅ“ud Hash Aggregate ou Hash
  • régression de performance possible si ce paramètre n’est pas adapté

Statistiques d’utilisation des WAL

Objectifs

  • Mesurer l’impact des écritures dans les WAL sur les performances ;
  • Statistiques calculées :
    • nombre d’enregistrements écrits dans les WAL ;
    • quantité de données écrites dans les WAL ;
    • nombre d’écritures de pages complètes.

pg_stat_statements : informations sur les WAL

Nouvelles colonnes :

  • wal_bytes : volume d’écriture dans les WAL en octets
  • wal_records : nombre d’écritures dans les WAL
  • wal_fpi : nombre d’écritures de pages complètes dans les WAL.

EXPLAIN : affichage des WAL

  • EXPLAIN :
    • ANALYZE : prérequis
    • WAL : affiche les statistiques d’utilisation des WAL
  Insert on test (actual time=3.231..3.231 rows=0 loops=1)
   WAL: records=1000 bytes=65893

auto_explain : affichage des WAL

  • auto_explain.log_analyze : prérequis
  • auto_explain.log_wal : affiche les statistiques d’utilisation des journaux de transactions dans les plans
  • équivalent de l’option WAL de EXPLAIN

autovacuum : affichage des WAL

  • statistiques d’utilisation des WAL ajoutées dans les traces de l’autovacuum.
        WAL usage: 120 records, 3 full page images, 27935 bytes

EXPLAIN : Utilisation disque du planificateur

  • EXPLAIN avec l’option BUFFERS affiche désormais l’utilisation des buffers lors de la phase de planification ;
  • L’option BUFFERS ne requiert plus l’utilisation de ANALYZE pour être utilisée.

Régressions

  • Réplication : wal_keep_segments devient wal_keep_size
  • effective_io_concurrency : changement d’échelle

wal_keep_segments devient wal_keep_size

  • wal_keep_segments devient wal_keep_size
  • La quantité de WAL à conserver est maintenant spécifiée en taille et plus en nombre de fichiers

effective_io_concurrency : changement d’échelle

Paramètre effective_io_concurrency :

  • Nombre d’I/O en parallèle pour une session
  • L’échelle change :
    • multiplier les valeurs par 1 à 5

Ateliers

TP - Partitionnement, déclencheur BEFORE

  • Création / suppression d’un déclencheur BEFORE sur une table partitionnée ;
  • Cas d’un déclencheur BEFORE qui modifie la partition cible.

TP - Fichiers manifeste et vérification des sauvegardes

  • Création d’une sauvegarde ;
  • Vérification du fichier manifeste ;
  • Test de corruptions.

TP - Colonne leader_pid dans pg_stat_activity

  • Compter les requêtes parallélisées et le nombre processus workers invoqués ;
  • Identifier les processus workers d’une requête parallélisée.

TP - Suivi de l’exécution des sauvegardes

  • Suivi d’une sauvegarde simple ;
  • Suivi sans estimation de la taille.

TP - Progression de la commande ANALYZE

  • mise en place des tables et données ;
  • calcul des statistiques et observations.

TP - HashAggregate, débord sur disque

Dimensionnement de hash_mem_multiplier.

TP - Statistiques d’utilisation des WAL

  • dans pg_stat_statements ;
  • dans les logs applicatifs ;
  • dans les plans d’exécution.

TP - Réplication logique et partitionnement

  • Ajout d’une table partitionnée à une publication ;
  • Réplication vers une table partitionnée de même schéma ;
  • Réplication vers une table partitionnée de schéma différent.

TP - Changement à chaud des informations de réplication

  • Mise en place d’une réplication ;
  • Changement de mot de passe ;
  • Utilisateur dédié et mot de passe dans .pgpass sans redémarrage.

TP - Volume maximal de journaux conservé par les slots

  • Création d’un slot ;
  • Modification de la configuration des slots ;
  • Simulation d’un décrochage.

TP - Outil pg_rewind

  • Création d’une instance primaire ;
  • Mettre en place la réplication ;
  • Simulation d’un failover ;
  • Utilisation de pg_rewind.

TP - wal_keep_segments et wal_keep_size

  • Simulation de migration du paramétrage.

TP - Déduplication des index B-Tree

Test sur :

  • la taille des index ;
  • les temps de création ;
  • les temps de sélection.