Les modules avancés

Formation interne DBA42

Dalibo SCOP

24.09

29 août 2024

Sur ce document

Formation Formation interne DBA42
Titre Les modules avancés
Révision 24.09
ISBN N/A
PDF https://dali.bo/dba42_pdf
EPUB https://dali.bo/dba42_epub
HTML https://dali.bo/dba42_html
Slides https://dali.bo/dba42_slides

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.

Travaux pratiques

Partitionnement

Partitionner pendant l’activité

Travaux pratiques (solutions)

Connexions distantes

Accès à distance à d’autres sources de données

  • Modules historiques : dblink
  • SQL/MED & Foreign Data Wrappers
  • Sharding par fonctions : PL/Proxy
  • Le sharding est Work In Progress

SQL/MED

  • Management of External Data
  • Extension de la norme SQL ISO
  • Données externes présentées comme des tables
  • Grand nombre de fonctionnalités disponibles
    • mais tous les connecteurs n’implémentent pas tout
  • Données accessibles par l’intermédiaire de tables
    • ces tables ne contiennent pas les données localement
    • l’accès à ces tables provoque une récupération des données distantes

Objets proposés par SQL/MED

  • Foreign Data Wrapper
    • connecteur permettant la connexion à un serveur externe et l’exécution de requête
  • Foreign Server
    • serveur distant
  • User Mapping
    • correspondance d’utilisateur local vers distant
  • Foreign Table
    • table distante (ou table externe)

Foreign Data Wrapper

  • Pilote d’accès aux données
  • Couverture variable des fonctionnalités
  • Qualité variable
  • Exemples de connecteurs
    • PostgreSQL, SQLite, Oracle, MySQL (lecture/écriture)
    • fichier CSV, fichier fixe (en lecture)
    • ODBC, JDBC
    • CouchDB, Redis (NoSQL)
  • Disponible généralement sous la forme d’une extension
    • ajouter l’extension ajoute le Foreign Data Wrapper à une base

Fonctionnalités disponibles pour un FDW (1/2)

  • Support des lecture de tables (SELECT)
  • Support des écriture de tables (y compris TRUNCATE)
    • directement pour INSERT
    • récupération de la ligne en local pour un UPDATE/DELETE
  • Envoi sur le serveur distant
    • des prédicats
    • des jointures si les deux tables jointes font partie du même serveur distant
    • des agrégations

Fonctionnalités disponibles pour un FDW (2/2)

  • Mais aussi
    • support du EXPLAIN
    • support du ANALYZE (amélioration en v16)
    • support des triggers
    • support de la parallélisation
    • support des exécutions asynchrones (v14)
    • possibilité d’importer un schéma complet

Foreign Server

  • Encapsule les informations de connexion
  • Le Foreign Data Wrapper utilise ces informations pour la connexion
  • Chaque Foreign Data Wrapper propose des options spécifiques
    • nom du fichier pour un FDW listant des fichiers
    • adresse IP, port, nom de base pour un serveur SQL
    • autres

User Mapping

  • Correspondance utilisateur local / utilisateur distant
  • Mot de passe stocké chiffré
  • Optionnel
    • aucun intérêt pour les FDW fichiers
    • essentiel pour les FDW de bases de données

Foreign Table

  • Définit une table distante
  • Doit comporter les colonnes du bon type
    • pas forcément toutes
    • pas forcément dans le même ordre
  • Peut être une partition d’une table partitionnée
  • Possibilité d’importer un schéma complet
    • simplifie grandement la création des tables distantes

Exemple : file_fdw

Foreign Data Wrapper de lecture de fichiers CSV.

CREATE EXTENSION file_fdw;

CREATE SERVER fichier FOREIGN DATA WRAPPER file_fdw ;

CREATE FOREIGN TABLE donnees_statistiques (f1 numeric, f2 numeric)
   SERVER fichier
   OPTIONS (filename  '/tmp/fichier_donnees_statistiques.csv',
            format    'csv',
            delimiter ';') ;

Exemple : postgres_fdw

  • Pilote le plus abouti, et pour cause
    • il permet de tester les nouvelles fonctionnalités de SQL/MED
    • il sert d’exemple pour les autres FDW
  • Propose en plus :
    • une gestion des transactions explicites
    • un pooler de connexions

SQL/MED : Performances

  • Tous les FDW : vues matérialisées et indexations
  • postgres_fdw : fetch_size

SQL/MED : héritage

  • Une table locale peut hériter d’une table distante et inversement
  • Permet le partitionnement sur plusieurs serveurs
  • Pour rappel, l’héritage ne permet pas de conserver
    • les contraintes d’unicité et référentielles
    • les index
    • les droits
  • Permet le requêtage inter-bases PostgreSQL
  • Simple et bien documenté
  • En lecture seule sauf à écrire des triggers sur vue
  • Ne transmet pas les prédicats
    • tout l’objet est systématiquement récupéré
  • Préférer postgres_fdw

PL/Proxy

  • Langage de procédures
    • développée à la base par Skype
  • Fonctionnalités
    • connexion à un serveur ou à un ensemble de serveurs
    • exécution de fonctions, pas de requêtes
  • Possibilité de distribuer les requêtes
  • Utile pour le « partionnement horizontal »
  • Uniquement si votre application n’utilise que des appels de fonction
    • dans le cas contraire, il faut revoir l’application

Conclusion

  • Privilégier SQL/MED
  • dblink et PL/Proxy en perte de vitesse
    • à n’utiliser que s’ils résolvent un problème non gérable avec SQL/MED

Travaux pratiques

Foreign Data Wrapper sur un fichier

Foreign Data Wrapper sur une autre base

Travaux pratiques (solutions)

Extensions PostgreSQL pour l’utilisateur

PostgreSQL

Qu’est-ce qu’une extension ?

  • Pour ajouter :
    • types de données
    • méthodes d’indexation
    • fonctions et opérateurs
    • tables, vues…
  • Tous sujets, tous publics
  • Intégrées (« contribs ») ou projets externes

Administration des extensions

Techniquement :

  • « packages » pour PostgreSQL, en C, SQL, PL/pgSQL…
  • Langages : SQL, PL/pgSQL, C (!)…
  • Ensemble d’objets livrés ensemble
  • contrib <> extension

Installation des extensions

  • Packagées ou à compiler
  • Par base :
    • CREATE EXTENSION … CASCADE
    • ALTER EXTENSION UPDATE
    • DROP EXTENSION
    • \dx
  • Listées dans pg_available_extensions

Contribs - Fonctionnalités

  • Livrées avec le code source de PostgreSQL
  • Habituellement packagées (postgresql-*-contrib)
  • De qualité garantie car maintenues par le projet
  • Optionnelles, désactivées par défaut
  • Ou en cours de stabilisation
  • Documentées : Chapitre F : « Modules supplémentaires fournis »

Quelques extensions

…plus ou moins connues

pgcrypto

Module contrib de chiffrement :

  • Nombreuses fonctions pour chiffrer et déchiffrer des données
  • Gros inconvénient : oubliez les index sur les données chiffrées !
  • N’oubliez pas de chiffrer la connexion (SSL)
  • Permet d’avoir une seule méthode de chiffrement pour tout ce qui accède à la base

hstore : stockage clé/valeur

  • Contrib
  • Type hstore
  • Stockage clé-valeur
  • Plus simple que JSON
INSERT INTO demo_hstore (meta) VALUES ('river=>t');
SELECT * FROM demo_hstore WHERE meta@>'river=>t';

PostgreSQL Anonymizer

  • Extension externe (Dalibo)
  • Masquage statique et dynamique
  • Export anonyme (pg_dump_anon)
  • Les règles de masquage sont écrites en SQL
  • Autodétection de colonnes identifiantes
  • Plus simple et plus sûr qu’un ETL

PostGIS

Logo Postgis
  • Projet indépendant, GPL, https://postgis.net/
  • Module spatial pour PostgreSQL
    • Extension pour types géométriques/géographiques & outils
    • La référence des bases de données spatiales
    • « quelles sont les routes qui coupent le Rhône ? »
    • « quelles sont les villes adjacentes à Toulouse ? »
    • « quels sont les restaurants situés à moins de 3 km de la Nationale 12 ? »

Mais encore…

  • uuid-ossp : gérer des UUID
  • unaccent : supprime des accents
  • citex : recherche insensible à la casse

Autres extensions connues

  • Compatibilité :
    • orafce
  • Extensions propriétaires évitant un fork :
    • Citus (sharding)
    • TimescaleDB (time series)
    • être sûr que PostgreSQL a atteint ses limites !

Extensions pour de nouveaux langages

  • PL/pgSQL par défaut
  • Ajouter des langages :
    • PL/python
    • PL/perl
    • PL/lua
    • PL/sh
    • PL/R
    • PL/Java
    • etc.

Accès distants

Accès à des bases distantes

  • Contribs :
    • dblink (ancien)
    • les foreign data wrappers : postgresql_fdw, mysql_fdw…
  • Sharding :
    • PL/Proxy
    • Citus

Contribs orientés DBA

Accès à des informations ou des fonctions de bas niveau :

  • pg_prewarm : sauvegarde & restauration de l’état du cache de la base
  • pg_buffercache : état du cache
  • pgstattuple (fragmentation des tables et index), pg_freespacemap (blocs libres), pg_visibility (visibility map)
  • pageinspect : inspection du contenu d’une page
  • pgrowlocks : informations détaillées sur les enregistrements verrouillés
  • pg_stat_statement (requêtes normalisées), auto_explain (plans)
  • amcheck : validation des index
  • … et de nombreux projets externes

PGXN

PostgreSQL eXtension Network :

  • Site web : pgxn.org
    • nombreuses extensions
    • volontariat
    • aucune garantie de qualité
    • tests soigneux requis
  • Et optionnellement client en python pour automatisation de déploiement
  • Ancêtre : pgFoundry
  • Beaucoup de projets sont aussi sur github

Créer son extension

Conclusion

  • Un nombre toujours plus important d’extension pour étendre les possibilités de PostgreSQL
  • Un site central pour les extensions : PGXN.org
  • Rajoutez les vôtres !

Questions

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

Travaux pratiques

Masquage statique de données avec PostgreSQL Anonymizer

Masquage dynamique de données avec PostgreSQL Anonymizer

Extensions PostgreSQL pour les DBA

PostgreSQL

Préambule

  • Nombreuses extensions pour observer le comportement de PostgreSQL
  • Contribs ou projets externes

pgstattuple

pgstattuple fournit une mesure (par parcours complet de l’objet) sur:

  • Pour une table
    • remplissage des blocs
    • enregistrements morts
    • espace libre
  • Pour un index
    • profondeur de l’index
    • remplissage des feuilles
    • fragmentation (feuilles non consécutives)

pg_freespacemap

La freespacemap :

  • est renseignée par VACUUM, par objet (table/index)
  • est consommée par les sessions modifiant des données (INSERT/UPDATE)
  • est interrogée la freespacemap pour connaître l’espace libre
  • est rarement utilisée (doute sur l’efficacité de VACUUM)

pg_visibility

La Visibility Map :

  • Est renseignée par VACUUM, par table
  • Permet de savoir que l’ensemble des enregistrements de ce bloc est visible
  • Indispensable pour les parcours d’index seul
  • Interroger la visibility map permet de voir si un bloc est :
    • visible
    • gelé
  • Rarement utilisé

pageinspect

  • Vision du contenu d’un bloc
  • Sans le dictionnaire, donc sans décodage des données
  • Affichage brut
  • Utilisé surtout en debug, ou dans les cas de corruption
  • Fonctions de décodage pour les tables, les index (B-tree, hash, GIN, GiST), FSM
  • Nécessite de connaître le code de PostgreSQL

pgrowlocks

Les verrous mémoire de PostgreSQL ne verrouillent pas les enregistrements :

  • Il est parfois compliqué de comprendre qui verrouille qui, à cause de quel enregistrement
  • pgrowlocks inspecte une table pour détecter les enregistrements verrouillés, leur niveau de verrouillage, et qui les verrouille
  • scan complet de la table !

Gestion du cache

  • pg_buffercache : voir ce qu’il y a dans mes shared buffers
  • pg_prewarm : forcer le chargement du cache

Pooling

PostgreSQL

Au menu

  • Concepts
  • Pool de connexion avec PgBouncer

Objectifs

  • Savoir ce qu’est un pool de connexion ?
  • Avantage, inconvénients & limites
  • Savoir mettre en place un pooler de connexion avec PgBouncer

Pool de connexion

  • Qu’est-ce qu’un pool de connexion ?
  • Présentation
  • Avantages et inconvénients
  • Mise en œuvre avec PgBouncer

Serveur de pool de connexions

Schéma de principe d’un pool de connexion

Serveur de pool de connexions

  • S’intercale entre le SGBD et les clients
  • Maintient des connexions ouvertes avec le SGBD
  • Distribue aux clients ses connexions au SGBD
  • Attribue une connexion existante au SGBD dans ces conditions
    • même rôle
    • même base de données
  • Différents poolers :
    • intégrés aux applicatifs
    • service séparé (où ?)

Intérêts du pool de connexions

  • Évite le coût de connexion
    • …et de déconnexion
  • Optimise l’utilisation des ressources du SGBD
  • Contrôle les connexions, peut les rediriger
  • Évite des déconnexions
    • redémarrage (mise à jour, bascule)
    • saturations temporaires des connexions sur l’instance

Inconvénients du pool de connexions

  • Transparence suivant le mode :
    • par sessions
    • par transactions
    • par requêtes
  • Performances, si mal configuré (latence)
  • Point délicat : l’authentification !
  • Complexité
  • SPOF potentiel
  • Impact sur les fonctionnalités, selon le mode

Pooling de sessions

Une connexion par utilisateur, pendant toute la durée de la session.

Schéma de principe d’un pool de connexion par session

Intérêts du pooling de sessions

  • Avantages :
    • limite le temps d’établissement des connexions
    • mise en attente si trop de sessions
    • simple
    • transparent pour les applications
  • Inconvénients :
    • périodes de non-activité des sessions conservées
    • nombre de sessions actives au pooler égal au nombre de connexions actives au SGBD

Pooling de transactions

Multiplexe les transactions des utilisateurs sur une ou plusieurs connexions.

Schéma de principe d’un pool de connexions par transaction

Avantages & inconvénients du pooling de transactions

  • Avantages
    • mêmes avantages que le pooling de sessions
    • meilleure utilisation du temps de travail des connexions
      • les connexions sont utilisées par une ou plusieurs sessions
    • plus de sessions possibles côté pooler pour moins de connexions au SGBD
  • Inconvénients
    • prise en charge partielle des instructions préparées
    • période de non-activité des sessions toujours possible

Pooling de requêtes

  • Un pool de connexions en mode requêtes multiplexe toutes les requêtes sur une ou plusieurs connexions
Schéma de principe d’un pool de connexion en mode requête

Avantages & inconvénients du pooling de requêtes

  • Avantages
    • les mêmes que pour le pooling de sessions et de transactions.
    • utilisation optimale du temps de travail des connexions
    • encore plus de sessions possibles côté pooler pour moins de connexions au SGBD
  • Inconvénients
    • les mêmes que pour le pooling de transactions
    • interdiction des transactions !

Pooling avec PgBouncer

  • Deux projets existent : PgBouncer et PgPool-II
  • Les deux sont sous licence BSD
  • PgBouncer
    • le plus évolué et éprouvé pour le pooling

PgBouncer : Fonctionnalités

  • Techniquement : un démon
  • Disponible sous Unix & Windows
  • Modes sessions / transactions / requêtes
  • Prise en charge partielle des requêtes préparées
  • Redirection vers des serveurs et/ou bases différents
  • Mise en attente si plus de connexions disponibles
  • Mise en pause des connexions
  • Paramétrage avancé des sessions clientes et des connexions aux bases
  • Mise à jour sans couper les sessions existantes
  • Supervision depuis une base virtuelle de maintenance
  • Pas de répartition de charge

PgBouncer : Installation

  • Par les paquets fournis par le PGDG :
    • yum|dnf install pgbouncer
    • apt install pgbouncer
  • Installation par les sources

PgBouncer : Fichier de configuration

  • Format ini
  • Un paramètre par ligne
  • Aucune unité dans les valeurs
  • Tous les temps sont exprimés en seconde
  • Sections : [databases], [users], [pgbouncer]

PgBouncer : Connexions

  • TCP/IP
    • listen_addr : adresses
    • listen_port (6432)
  • Socket Unix (unix_socket_dir, unix_socket_mode, unix_socket_group)
  • Chiffrement TLS

PgBouncer : Définition des accès aux bases

  • Section [databases]
  • Une ligne par base sous la forme libpq :
data1 = host=localhost port=5433 dbname=data1 pool_size=50
  • Paramètres de connexion :
    • host, port, dbname ; user, password
    • pool_size, pool_mode, connect_query
    • client_encoding, datestyle, timezone
  • Base par défaut :
    + = host=ip1 port=5432 dbname=data0
  • auth_hba_file : équivalent à pg_hba.conf

PgBouncer : Authentification par fichier de mots de passe

  • Liste des utilisateurs contenue dans userlist.txt
  • Contenu de ce fichier
    • "utilisateur" "mot de passe"
  • Paramètres dans le fichier de configuration
    • auth_type : type d’authentification (trust, md5,scram-sha-256…)
    • auth_file : emplacement de la liste des utilisateurs et mots de passe
    • admin_users : liste des administrateurs
    • stats_users : liste des utilisateurs de supervision

PgBouncer : Authentification par délégation

  • Créer un rôle dédié
  • Copier son hash de mot de passe dans userlist.txt
  • Déclaration dans le pool avec auth_user  :
prod = host=p1 port=5432 dbname=erp auth_user=frontend
  • auth_query : requête pour vérifier le mot de passe via ce rôle
  • => Plus la peine de déclarer les autres rôles

PgBouncer : Nombre de connexions

  • Côté client :
    • max_client_conn (100)
    • attention à ulimit !
    • max_db_connections
  • Par utilisateur/base :
    • default_pool_size (20)
    • min_pool_size (0)
    • reserve_pool_size (0)

PgBouncer : Types de connexions

  • Mode de multiplexage
    • pool_mode (session)
  • À la connexion
    • ignore_startup_parameter = options
    • attention à PGOPTIONS !
  • À la déconnexion
    • server_reset_query
    • défaut : DISCARD ALL

PgBouncer : Instructions préparées

  • En mode Transaction
    • prise en charge partielle des instructions préparées
    • depuis la 1.21 : max_prepared_statements
    • nécessite un connecteur PG compatible

PgBouncer : Durée de vie

  • D’une tentative de connexion
    • client_login_timeout
    • server_connect_timeout
  • D’une connexion
    • server_lifetime
    • server_idle_timeout
    • client_idle_timeout
  • Pour recommencer une demande de connexion
    • server_login_retry
  • D’une requête
    • query_timeout = 0

PgBouncer : Traces

  • Fichier
    • logfile
  • Évènements tracés
    • log_connections
    • log_disconnections
    • log_pooler_errors
  • Statistiques
    • log_stats (tous les stats_period s)

PgBouncer : Administration

  • Pseudo-base pgbouncer :
sudo -iu postgres psql -h /var/run/postgresql -p 6432 -d pgbouncer
  • Administration
    • RELOAD, PAUSE, SUSPEND, RESUME, SHUTDOWN
  • Supervision
    • SHOW CONFIG|DATABASES|POOLS|CLIENTS|…
    • …|SERVERS|STATS|FDS|SOCKETS|…
    • …|ACTIVE_SOCKETS|LISTS|MEM

Conclusion

  • Un outil pratique :
    • pour parer à certaines limites de PostgreSQL
    • pour faciliter l’administration
  • Limitations généralement tolérables
  • Ne jamais installer un pooler sans être certain de son apport :
    • SPOF
    • complexité

Questions

SELECT * FROM questions ;

Travaux pratiques

Travaux pratiques (solutions)