Nouveautés de PostgreSQL 10

Workshop 10

Dalibo & Contributors

Nouveautés de PostgreSQL 10

PostgreSQL

Introduction

  • Développement depuis août 2016
  • Version beta 1 sortie le 18 mai
  • Sortie de la version finale le 5 octobre 2017
  • Plus de 1,4 million de lignes de code C
  • Des centaines de contributeurs

Au menu

  • Changements importants
  • Partitionnement
  • Réplication logique
  • Performances
  • Sécurité
  • Autres nouveautés
  • Compatibilité
  • Futur

Changements importants

  • Changement de la numérotation
  • Changement de nommage
  • Changement de configuration par défaut

Numérotation des versions

Ancienne numérotation exprimée sur 3 nombres :

  9 . 6 . 3
  Majeure1 . Majeure2 . Mineure

Nouvelle numérotation exprimée sur 2 nombres uniquement :

  10 . 2
  Majeure . Mineure

Nommage

  • Au niveau des répertoires
    • pg_xlog -> pg_wal
    • pg_clog -> pg_xact
  • Au niveau des fonctions
    • xlog -> wal
    • location -> lsn
  • Au niveau des outils
    • xlog -> wal

Configuration

  • Changement des valeurs par défaut
  • postgresql.conf
    • wal_level : replica
    • max_wal_senders : 10
    • max_replication_slots : 10
    • hot_standby : on
  • pg_hba.conf
    • connexions de réplication autorisées sur localhost

Partitionnement

  • Petit rappel sur l’ancien partitionnement
  • Nouveau partitionnement
  • Nouvelle syntaxe
  • Quelques limitations

Ancien partitionnement

  • Le partitionnement par héritage se base sur
    • la notion d’héritage (1 table mère et des tables filles)
    • des triggers pour orienter les insertions vers les tables filles
    • des contraintes d’exclusion pour optimiser les requêtes
  • Disponible depuis longtemps

Nouveau partitionnement

  • Mise en place et administration simplifiées car intégrées au moteur
  • Plus de trigger
    • insertions plus rapides
    • routage des données insérées dans la bonne partition
    • erreur si aucune partition destinataire
  • Partitions
    • attacher/détacher une partition
    • contrainte implicite de partitionnement
    • expression possible pour la clé de partitionnement
    • sous-partitions possibles
  • Changement du catalogue système
    • nouvelles colonnes dans pg_class
    • nouveau catalogue pg_partitioned_table

Exemple de partitionnement par liste

  • Créer une table partitionnée :

    CREATE TABLE t1(c1 integer, c2 text) PARTITION BY LIST (c1);

  • Ajouter une partition :

    CREATE TABLE t1_a PARTITION OF t1 FOR VALUES IN (1, 2, 3);

  • Détacher la partition :

    ALTER TABLE t1 DETACH PARTITION t1_a;

  • Attacher la partition :

    ALTER TABLE t1 ATTACH PARTITION t1_a FOR VALUES IN (1, 2, 3);

Exemple de partitionnement par intervalles

  • Créer une table partitionnée :

    CREATE TABLE t2(c1 integer, c2 text) PARTITION BY RANGE (c1);

  • Ajouter une partition :

    CREATE TABLE t2_1 PARTITION OF t2 FOR VALUES FROM (1) TO (100);

  • Détacher une partition :

    ALTER TABLE t2 DETACH PARTITION t2_1;

Clé de partitionnement multi-colonnes

  • Clé sur plusieurs colonnes acceptée

    • uniquement pour le partitionnement par intervalles
  • Créer une table partitionnée avec une clé multi-colonnes :

    CREATE TABLE t1(c1 integer, c2 text, c3 date)   PARTITION BY RANGE (c1, c3);

  • Ajouter une partition :

    CREATE TABLE t1_a PARTITION of t1 FOR VALUES   FROM (1,'2017-08-10') TO (100, '2017-08-11');

Performances en insertion

Table non partitionnée

INSERT INTO t1 SELECT i, 'toto'
  FROM generate_series(0, 9999999) i;
Time: 10097.098 ms (00:10.097)

Nouveau partitionnement

INSERT INTO t2 SELECT i, 'toto'
  FROM generate_series(0, 9999999) i;
Time: 11448.867 ms (00:11.449)

Ancien partitionnement

INSERT INTO t3 SELECT i, 'toto'
  FROM generate_series(0, 9999999) i;
Time: 125351.918 ms (02:05.352)

Limitations

  • La table mère ne peut pas avoir de données
  • La table mère ne peut pas avoir d’index
    • ni PK, ni UK, ni FK pointant vers elle
  • Pas d’UPDATE impliquant un changement de partition
  • Pas de colonnes additionnelles dans les partitions
  • Pas de mélange des deux types de partitionnement
  • Une partition ne peut faire partie que d’une seule table partitionnée
  • Valeurs nulles acceptées dans les partitions uniquement si la table partitionnée le permet
  • Partitions distantes uniquement en lecture
  • En cas d’attachement d’une partition
    • vérification du respect de la contrainte (verrou bloquant sur la partition)
    • sauf si ajout au préalable d’une contrainte CHECK identique

Réplication logique

  • Petit rappel sur la réplication physique
  • Qu’est-ce que la réplication logique ?
  • Fonctionnement
  • Limitations
  • Supervision
  • Exemples

Réplication physique

  • Réplication de toute l’instance
    • au niveau bloc
    • par rejeu des journaux de transactions
  • Quelques limitations :
    • intégralité de l’instance
    • même architecture (x86, ARM…)
    • même version majeure
    • pas de requête en écriture sur le secondaire

Réplication logique - Principe

  • Réutilisation de l’infrastructure existante
    • réplication en flux
    • slots de réplication
  • Réplique les changements sur une seule base de données
    • d’un ensemble de tables défini
  • Uniquement INSERT / UPDATE / DELETE
    • pas les DDL, ni les TRUNCATE

Fonctionnement

Schéma du fonctionnement de la réplication logique

Limitations

  • Non répliqué :
    • Schéma
    • Séquences
    • Large objects
  • Pas de publication des tables parents du partitionnement
  • Ne convient pas comme fail-over
  • Contrainte d’unicité nécessaire pour UPDATE et DELETE

Supervision

  • Nouveaux catalogues
    • pg_publication
    • pg_subscription
    • pg_stat_subscription
  • Anciens catalogues
    • pg_stat_replication
    • pg_replication_slot
    • pg_replication_origin_status

Exemple - Création d’une publication

  • Définir wal_level à logical

  • Initialiser une base de données et sauvegarder son schéma

  • Créer une publication pour toutes les tables

    CREATE PUBLICATION ma_publication FOR ALL TABLES;

  • Créer une publication pour une table

    CREATE PUBLICATION ma_publication FOR TABLE t1;

Exemple - Création d’une souscription

  • Initialiser une base de données et importer son schéma
  • Créer l’abonnement :
CREATE SUBSCRIPTION ma_souscription
CONNECTION 'host=127.0.0.1 port=5433 user=repliuser dbname=bench'
PUBLICATION ma_publication;

Exemple - Visualisation de l’état de la réplication

  • Sur l’éditeur
    • pg_stat_replication pour l’état de la réplication
    • pg_replication_slots pour la définition des slots de réplication
    • pg_publication pour la définition des publications
    • pg_publication_tables pour la liste des tables publiées par publication
  • Sur l’abonné
    • pg_subscription pour la définition des abonnements
    • pg_replication_origin_status pour l’état de la réplication

Performances

  • Tris
  • Agrégats
  • Statistiques multi-colonnes
  • Parallélisme

Gain sur les tris

  • Gains significatifs pour les tris sur disque
    • nœud Sort Method: external merge
  • Test avec installation par défaut et disques SSD
    • 9.6 : 2,2 secondes
    • 10 : 1,6 secondes

Gain sur les agrégats

  • Exécution d’un agrégat par hachage (HashAggregate)
    • lors de l’utilisation d’un ensemble de regroupement (par exemple, un GROUP BY)
  • Test avec installation par défaut et disques SSD :
    • 9.6 : 4,9 secondes
    • 10 : 2,6 secondes

Statistiques multi-colonnes

  • CREATE STATISTICS
    • création de statistiques sur plusieurs colonnes d’une même table
  • Corrige les erreurs d’estimation en cas de colonnes fortement corrélées
  • Deux statistiques calculables
    • nombre de valeurs distinctes
    • dépendances fonctionnelles

Parallélisme - nouvelles opérations supportées

  • Nœuds désormais gérés :
    • parcours d’index (Index Scan et Index Only Scan)
    • jointure-union (Merge Join)
  • Nouveau nœud :
    • collecte de résultats en préservant l’ordre de tri (Gather Merge)
  • Support également des :
    • requêtes préparées
    • sous-requêtes non-corrélées

Parallélisme - paramétrage

  • nouveaux paramètres
    • min_parallel_table_scan_size : taille minimale d’une table (8 Mo)
    • min_parallel_index_scan_size : taille minimale d’un index (512 ko)
  • suppression de min_parallel_relation_size
    • jugé trop générique
  • max_parallel_workers : nombre maximum de workers que le système peut supporter pour le besoin des requêtes parallèles

Sécurité

  • pg_hba.conf
  • Row-Level Security
  • Nouveaux rôles

pg_hba.conf

  • Nouvelle méthode d’authentification SCRAM-SHA-256
  • Vue pg_hba_file_rules
  • Par défaut, connexion locale de réplication possibles

Row-Level Security

  • Politique de sécurité pour l’accès aux lignes d’une table
  • Nouvel attribut pour l’instruction CREATE POLICY
    • PERMISSIVE : politiques d’une table reliées par des OR
    • RESTRICTIVE : politiques d’une table reliées par des AND
  • PERMISSIVE par défaut

Nouveaux rôles

  • Supervision normalement réservée aux super-utilisateurs
  • Nouveaux rôles
    • pg_monitor
    • pg_read_all_settings
    • pg_read_all_stats
    • pg_stat_scan_tables

Administration

  • pg_stat_activity
  • Architecture
  • SQL/MED
  • Quorum réplication synchrone
  • Changements dans pg_basebackup
  • pg_receivewal
  • Index hash
  • Renommage d’un enum

pg_stat_activity

  • Affichage des processus auxiliaires
    • nouvelle colonne backend_type
  • Nouveaux types d’événements pour lesquels le processus est en attente
    • Activity
    • Extension
    • Client
    • IPC
    • Timeout
    • IO
  • Renommage des types LWLockNamed et LWLockTranche en LWLock
  • Impact sur les outils de supervision

Architecture

  • Amélioration des options de connexion de la librairie libpq :
psql --dbname="postgresql://127.0.0.1:5432,127.0.0.1:5433/ma_db?target_session_attrs=any"
  • Ajout des slots de réplication temporaires
  • Support de la librairie ICU pour la gestion des collations

SQL/MED, Foreign Data Wrappers

  • file_fdw
    • Récupération du résultat d’un programme comme entrée
  • postgres_fdw
    • Support des agrégations et jointures (FULL JOIN) sur le serveur distant

Quorum réplication synchrone

  • Possibilités existantes de réplication synchrone avec une liste de plusieurs esclaves
    • Tous :

      synchronous_standby_names = (s1, s2, s3, s4)

    • Certains par ordre de priorité :

      synchronous_standby_names = [FIRST] 3 (s1, s2, s3, s4)

  • Nouveauté
    • Certains sur la base d’un quorum :

      synchronous_standby_names = [ANY] 3 (s1, s2, s3, s4)

Changements dans pg_basebackup

  • Suppression de l’option -x
  • Modification de la méthode de transfert des WAL par défaut
    • none : pas de récupération des WAL
    • fetch : récupération des WAL à la fin de la copie des données
    • stream : streaming (par défaut)
  • Nommage des arguments longs
    • –xlog-method -> –wal-method
    • –xlogdir -> –waldir

pg_receivewal

  • Gestion de la compression dans pg_receivewal
    • niveau 0 : pas de compression
    • niveau 9 : meilleure compression possible

Index Hash

  • Journalisation
  • Amélioration des performances
  • Amélioration de l’efficacité sur le grossissement de ces index

Renommage d’un enum

Renommage possible de la valeur d’un enum

ALTER TYPE nom RENAME VALUE valeur_enum_existante
TO nouvelle_valeur_enum;

Utilisateurs

  • Full Text Search sur du json
  • Nouvelle fonction XMLTABLE
  • psql, nouvelles méta-commandes
  • Tables de transition
  • Amélioration sur les séquences
  • Nouveau type de colonne identity

Full Text Search sur du json

  • Type json et jsonb
  • Impacte les fonctions ts_headline() et to_tsvector()

XMLTABLE

  • Transformation d’un document XML en table
  • Nécessite libxml

psql, nouvelles méta-commandes

  • \gx, force l’affichage étendu de \g
  • structure conditionnelle \if, \elif, \else, \endif

Tables de transition

  • Pour les triggers de type AFTER et de niveau STATEMENT
  • Possibilité de stocker les lignes avant et/ou après modification
    • REFERENCING OLD TABLE
    • REFERENCING NEW TABLE
  • Par exemple
CREATE TRIGGER tr1
AFTER DELETE ON t1
REFERENCING OLD TABLE AS oldtable
FOR EACH STATEMENT
EXECUTE PROCEDURE log_delete();
  • Gain en performance

Amélioration sur les séquences

  • Création des catalogues système pg_sequence et pg_sequences
  • Ajout de l’option CREATE SEQUENCE AS type_donnee

Colonne identity

  • Nouvelle contrainte IDENTITY
  • Similaire au type serial mais conforme au standard SQL
  • Géré par PostgreSQL ou modifiable :
CREATE TABLE t1 (id int PRIMARY KEY GENERATED ALWAYS AS IDENTITY) ;
CREATE TABLE t2 (id int PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY) ;

Compatibilité

  • Changements dans les outils
  • Les outils de la sphère Dalibo

Changements dans les outils

  • Changements de comportement :
    • pg_ctl attend désormais que l’instance soit démarrée avant de rendre la main (identique au comportement à l’arrêt)
  • Fin de support ou suppression :
    • Type floating point timestamp
    • Contribution tsearch2
    • Support des versions < 8.0 dans pg_dump
    • Protocole client/serveur 1.0
    • Clause UNENCRYPTED pour les mots de passe

Les outils de la sphère Dalibo

Les outils Dalibo sont à présent compatibles :

Outil Compatibilité avec PostgreSQL 10
pgBadger Oui
pgCluu Oui, depuis 2.6
ora2Pg Oui (support du partitionnement déclaratif)
pg_stat_kcache Oui, depuis 2.0.3
ldap2pg Oui

Futur

  • Branche de développement de la version 11 créée le 15 août
    • … quelques améliorations déjà présentes
  • Nouvelle fonctionnalité de préchauffage automatique du cache pour pg_prewarm
  • Améliorations du partitionnement
    • partition par défaut
    • par hachage
    • possibilité de mise à jour de la clé de partitionnement
  • Améliorations de la parallélisation
    • pour les InitPlan
    • pour les hachages
  • Améliorations de la réplication logique
    • Fast Forward

Questions

SELECT * FROM questions;

Atelier

À présent, place à l’atelier…

  • Installation
  • Découverte de PostgreSQL 10
  • Authentification avec SCRAM-SHA-256
  • Vue pg_hba_file_rules
  • Vue pg_sequence
  • Modifications dans pg_basebackup
  • Parallélisation
  • Partitionnement
  • Performances
  • Collations ICU
  • Réplication logique

Installation

Découverte de PostgreSQL 10

Authentification avec SCRAM-SHA-256

Vue pg_hba_file_rules

Vue pg_sequence

Modifications dans pg_basebackup

Parallélisation

Parallélisation : Parallel Bitmap Heap Scan

Parallélisation : Parallel Index-Only Scan et Parallel Index Scan

Parallélisation : transmission des requêtes aux workers

Partitionnement : création

Partitionnement : limitations

Partitionnement : administration

Performances

Collations ICU

Réplication logique : publication

Réplication logique : souscription

Réplication logique : modification des données