Installation de PostgreSQL

Module B

Dalibo SCOP

24.12

18 décembre 2024

Sur ce document

Formation Module B
Titre Installation de PostgreSQL
Révision 24.12
PDF https://dali.bo/b_pdf
EPUB https://dali.bo/b_epub
HTML https://dali.bo/b_html
Slides https://dali.bo/b_slides
TP https://dali.bo/b_tp
TP (solutions) https://dali.bo/b_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 13 à 17.

Installation de PostgreSQL

PostgreSQL

Introduction

  • Pré-requis
  • Installation depuis les sources
  • Installation depuis les binaires
    • installation à partir des paquets
    • installation sous Windows
  • Installation dans les conteneurs
  • Premiers réglages
  • Mises à jours

Pré-requis minimaux pour une instance PostgreSQL

Pré-requis minimaux

  • À peu près n’importe quel OS actuel
    • Linux (conseillé)
    • Unix propriétaires (dont macOS), FreeBSD
    • Windows
  • N’importe quelle machine
    • …selon les besoins
    • 64 bits conseillé
  • Stockage fiable
  • Pas d’antivirus !

Installation à partir des sources

Étapes d’une installation à partir des sources

  • Téléchargement
  • Vérification des prérequis
  • Compilation
  • Installation

Téléchargement

Phases de compilation/installation

# au choix
tar xvfj postgresql-17.0.tar.bz2
git clone --branch REL_17_0 https://git.postgresql.org/git/postgresql.git
./configure --prefix=/usr/local/pgsql   # beaucoup d'options !
make -j8
cd contrib/ && make -j8        # ne pas oublier les contrib
make check

sudo make install && cd contrib/ && sudo make install
pg_config --configure

Utilisateur dédié de PostgreSQL

  • Jamais root
  • Utilisateur dédié
    • propriétaire des répertoires et fichiers
    • peut lancer PostgreSQL
    • traditionnellement : postgres
  • Variables d’environnement (défaut) :
export PATH=/usr/local/pgsql/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/pgsql/lib:$LD_LIBRARY_PATH
export MANPATH=$MANPATH:/usr/local/pgsql/share/man
export PGDATA=/usr/local/pgsql/data    # Données

Création du répertoire de données de l’instance

$ initdb -D /usr/local/pgsql/data
  • Une seule instance sur le répertoire !
  • Pas à la racine d’un point de montage
  • Options d’emplacement :
    • --data pour les fichiers de données
    • --waldir pour les journaux de transactions
  • Autres options :
    • --data-checksums : sommes de contrôle (conseillé !)
    • et : chemin des journaux, mot de passe, encodage…

Lancement et arrêt

  • Avec le script de l’OS (recommandé) ou pg_ctl :
systemctl [action] postgresql     # systemd
/etc/init.d/postgresql [action]   # SysV Init
service postgresql [action]       # idem
$ pg_ctl --pgdata /usr/local/pgsql/data --log logfile [action]
         --mode [smart|fast|immediate]
  • [action] dépend du besoin :
    • start / stop / restart
    • reload pour recharger la configuration
    • status
    • promote, logrotate, kill

Installation à partir des paquets Linux

Paquets

  • Packages Debian
  • Packages RPM

Paquets Debian officiels

  • Nombreux paquets disponibles :
    • serveur, client, contrib, docs
    • extensions, outils
  • apt install postgresql-<version majeure>
    • installe les binaires
    • crée l’utilisateur postgres
    • exécute initdb
    • démarre le serveur

Paquets Debian : spécificités

  • Plusieurs versions majeures installables
  • Wrappers/scripts pour la gestion des différentes instances :
    • pg_lsclusters
    • pg_ctlcluster
      • ou : systemctl stop|start postgresql-15@main
    • pg_createcluster
    • etc.
  • Respect de la FHS
  • Configuration dans /etc/postgresql/

Paquets Debian communautaires

  • La communauté met des paquets Debian à disposition :
  • Synchrone avec le projet PostgreSQL
  • Ajout du dépôt dans /etc/apt/sources.list.d/pgdg.list
  • Utilisation chaudement conseillée

Paquets Red Hat communautaires : yum.postgresql.org

Paquets Red Hat communautaires : installation

sudo dnf install -y \
     https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm
sudo dnf -qy module disable postgresql

sudo dnf install -y postgresql17-server
# dont : utilisateur postgres

sudo /usr/pgsql-17/bin/postgresql-17-setup initdb
sudo systemctl enable postgresql-17
sudo systemctl start postgresql-17

Paquets Red Hat communautaires : spécificités

  • Paquets séparés serveur, client, contrib
  • /usr/pgsql-XX/bin: binaires
  • Initialisation manuelle (postgresql-17-setup initdb)
    • vers : /var/lib/pgsql/XX/data
  • Gestion par systemd
  • Particularités :
    • plusieurs versions majeures installables
    • configuration : dans le répertoire de données

Industrialisation avec pglift

pglift : présentation rapide

  • Déploiement et infrastructure as code :
    • ligne de commande
    • collections Ansible
  • Couverture fonctionnelle :
    • Sauvegardes avec pgBackRest
    • Supervision avec Prometheus
    • Administration avec temBoard
    • Analyse avec PoWA
    • Haute disponibilité avec Patroni
    • Intégration système avec systemd ou rsyslog

pglift : fichier de configuration

prefix: /srv # fichier /etc/pglift/settings.yaml
postgresql:
  auth:
    host: scram-sha-256
prometheus:
  execpath: /usr/bin/prometheus-postgres-exporter
pgbackrest:
  repository:
    mode: path
    path: /srv/pgsql-backups
powa: {}
systemd: {}
rsyslog: {}

pglift : exemples de commandes

  • Initialisation
pglift instance create main --pgbackrest-stanza=main
  • Modification de configuration
pglift pgconf -i main set log_connections=on
  • Sauvegarde physique
pglift instance backup main
  • Utilisation des outils de l’instance
pglift instance exec main -- psql
pglift instance exec main -- pgbackrest info

Utiliser PostgreSQL dans un conteneur

Docker

docker run --name pg17 -e POSTGRES_PASSWORD=mdpsuperfort -d postgres
docker exec -it pg17 psql -U postgres
  • Image officielle Docker Inc (pas PGDG !) : https://hub.docker.com/_/postgres
  • Très pratique pour le développement
  • Beaucoup de possibilités avancées avec docker-compose
  • Ne jamais lancer 2 conteneurs Docker sur un même PGDATA
  • Une base de données est-elle faite pour du docker ?
    • supervision système délicate

Kubernetes

  • Dans les très grands environnements
    • mise à l’échelle automatique
    • complexité à assumer
  • Réclame de l’expérience sur PG et K8s
  • Réservez un worker à PostgreSQL
  • Quel opérateur ?
    • CrunchyData, CloudNativePG, Percona…
    • nombreux outils, HA…

Installation sous Windows

Comment installer sous Windows ?

  • Un seul installeur graphique disponible, proposé par EnterpriseDB
  • Ou archive des binaires

Installeur graphique

Installeur graphique - bienvenue

Premiers réglages

Au menu

  • Sécurité
  • Configuration
    • accès
    • connexions
    • mémoire
    • journaux
    • traces
    • tâches de fond

Sécurité

  • Politique d’accès :
    • pour l’utilisateur postgres système
    • pour le rôle postgres
  • Règles d’accès à l’instance dans pg_hba.conf

Configuration minimale

  • Fichier postgresql.conf
  • Configuration du moteur
  • Plus de 300 paramètres
  • Quelques paramètres essentiels

Précédence des paramètres

Ordre de précédence des paramètres

Configuration des connexions : accès au serveur

  • listen_addresses = '*' (systématique)
  • port = 5432
  • password_encryption = scram-sha-256 (v10+)

Configuration du nombre de connexions

  • max_connections = 100
  • 1 connexion = 1 processus serveur
  • Compromis entre
    • CPU / nombre requêtes actives / RAM / complexité
  • Danger si trop haut !
    • performances (même avec des connexions inactives)
    • risque de saturation
  • Possibilité de réserver quelques connexions pour l’administration

Configuration de la mémoire partagée

  • shared_buffers = (?)GB
    • 25 % de la RAM généralement
    • max 40 %
    • complémentaire du cache OS

Configuration : mémoire des processus

  • work_mem

    • par processus, voire nœud
    • valeur très dépendante de la charge et des requêtes
    • fichiers temporaires vs saturation RAM
  • × hash_mem_multiplier

  • maintenance_work_mem

  • Pas de limite stricte à la consommation mémoire des sessions

    • Augmenter prudemment & superviser

Configuration des journaux de transactions 1/2

fsync = on (si vous tenez à vos données)

Configuration des journaux de transactions 2/2

Niveaux de cache et fsync

Configuration des traces

  • Selon système/distribution :
    • log_destination
    • logging_collector
    • emplacement et nom différent pour postgresql-????.log
  • log_line_prefix à compléter :
    • log_line_prefix = '%t [%p]: user=%u,db=%d,app=%a,client=%h '
  • lc_messages = C (anglais)

Configuration des tâches de fond

Laisser ces deux paramètres à on :

  • autovacuum
  • track_counts

Se faciliter la vie

Mise à jour

Mise à jour

  • Recommandations
  • Mise à jour mineure
  • Mise à jour majeure
  • Mise à jour de l’OS

Recommandations

  • Les Release Notes
  • Intégrité des données
  • Bien redémarrer le serveur !

Mise à jour mineure

  • Méthode
    • arrêter PostgreSQL
    • mettre à jour les binaires
    • redémarrer PostgreSQL
  • Pas besoin de s’occuper des données, sauf cas exceptionnel
    • bien lire les Release Notes pour s’en assurer

Mise à jour majeure

  • Bien lire les Release Notes
  • Bien tester l’application avec la nouvelle version
    • rechercher les régressions en terme de fonctionnalités et de performances
    • penser aux extensions et aux outils
  • Pour mettre à jour
    • mise à jour des binaires
    • et mise à jour/traitement des fichiers de données
  • 3 méthodes
    • dump/restore
    • réplication logique
    • pg_upgrade

Mise à jour majeure par dump/restore

  • Méthode historique
  • Simple et sans risque
    • mais d’autant plus longue que le volume de données est important
  • Outils :
    • pg_dumpall -g puis pg_dump
    • psql puis pg_restore

Mise à jour majeure par réplication logique

  • Possible entre versions 10 et supérieures
  • Bascule très rapide
  • Et retour possible

Mise à jour majeure par pg_upgrade

  • pg_upgrade : fourni avec PostgreSQL
  • Prérequis : pas de changement de format des fichiers entre versions
  • Nécessite les deux versions sur le même serveur
  • Support des serveurs PostgreSQL à migrer :
    • version minimale 9.2 pour pg_upgrade v15
    • version minimale 8.4 sinon

Mise à jour de l’OS

Si vous migrez aussi l’OS ou déplacez les fichiers d’une instance :

  • compatibilité architecture
  • compatibilité librairies
    • réindexation parfois nécessaire
    • ex : Debian 10 et glibc 2.28

Conclusion

  • L’installation est simple…
  • …mais elle doit être soigneusement préparée
  • Préférer les paquets officiels
  • Attention aux données lors d’une mise à jour !

Pour aller plus loin

  • Documentation officielle, chapitre Installation
  • Documentation Dalibo, pour l’installation sur Windows

Questions

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

Quiz

Travaux pratiques

Installation depuis les paquets binaires du PGDG (Rocky Linux)

Installation à partir des sources (optionnel)

Travaux pratiques (solutions)

Installation de PostgreSQL depuis les paquets communautaires