Reviers, 7 juin 2024
Depuis quelques années, Guillaume Lelarge publie des articles dans le magazine « Linux Pratique » édité par les Éditions Diamond. Avec leur accord, il reprend ici une série destinée aux DBA débutant avec PostgreSQL.
Nous commençons une série d’articles qui se veut être un guide du débutant pour l’installation, la maintenance et l’utilisation de PostgreSQL. Le but est de vous permettre de débuter rapidement sur de bonnes bases. Les articles couvriront l’installation et la configuration, mais aussi la mise en place de la sauvegarde, de la supervision, de la maintenance et de la réplication dans des cas simples. Ce premier article concerne donc l’installation.
L’installation d’un serveur PostgreSQL n’offre pas vraiment de difficultés. Certains points particuliers sont à connaître, notamment sur les systèmes de fichiers mais en fait, la difficulté principale est de les connaître, pas de les appliquer.
L’installation de PostgreSQL se décompose en six étapes :
- préparation du système d’exploitation
- installation du dépôt de la communauté ;
- installation des paquets ;
- configuration du service ;
- initialisation du répertoire de données ;
- activation et démarrage du service.
Préparation du système d’exploitation
Tous les exemples sont basés sur une VM installée avec Rocky Linux 9.2. Aucune option spéciale n’a été utilisée pour l’installation de la distribution. Une deuxième VM, identique à la première, sera utilisée pour le chapitre sur la réplication. D’autres VM pourront aussi être utilisés pour les articles sur la sauvegarde et sur la supervision.
La VM (sous qemu
) comprend :
- 2 vCPU ;
- 2 Go de RAM ;
- un disque de 30 Go.
Ce dernier a été partitionnée. Le système LVM est utilisé pour se faciliter la vie. Voici la liste des partitions d’après la commande lsblk
:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sr0 11:0 1 1024M 0 rom
vda 252:0 0 30G 0 disk
├─vda1 252:1 0 1G 0 part /boot
└─vda2 252:2 0 29G 0 part
├─rl-root 253:0 0 5G 0 lvm /
├─rl-swap 253:1 0 1020M 0 lvm [SWAP]
├─rl-srv_wal 253:2 0 5G 0 lvm /srv/wal
├─rl-var 253:3 0 5G 0 lvm /var
├─rl-home 253:4 0 3G 0 lvm /home
└─rl-srv 253:5 0 10G 0 lvm /srv
La partition /srv
contient les fichiers de PostgreSQL. Le sous-répertoire /srv/data
contient le répertoire principal des données. La variable d’environnement PGDATA
devra pointer vers ce répertoire. La partition /srv/wal
contient uniquement les journaux de transactions de PostgreSQL. Il est généralement conseillé de séparer fichiers de données et journaux de transactions dans des partitions différentes, nous le faisons donc ici. Il est aussi généralement conseillé de déplacer les journaux applicatifs de PostgreSQL dans une partition séparée. Cela se fera dans le chapitre sur la configuration, /var/log/postgresql
étant le répertoire choisi, ce dernier dépendant de la partition /var
.
Au cas où vous voudriez installer une version antérieure à la 15, les statistiques d’activités sont stockées sur disque et il est généralement préférable de les placer sur un ramdisk pour gagner en performances. Ce n’est plus le cas en version 15 vu que les métriques sont conservées en mémoire pendant toute la durée d’exécution du serveur. Même si tous les exemples se basent sur Rocky Linux, les commandes doivent être utilisables sur toute distribution, quelque soit leur version.
Toutes les commandes de cet article seront à exécuter avec l’utilisateur root ou en utilisant la commande sudo
.
Configuration du système d’exploitation
Il existe plusieurs paramètres du noyau Linux qui sont importants pour PostgreSQL. Un seul concerne sa stabilité, les autres sont plutôt relatifs aux performances.
Linux dispose d’un système qui lui permet d’allouer aux applications plus de mémoire qu’il n’en a réellement. L’idée de base est simple : beaucoup d’applications demandent de la mémoire, sans vraiment l’utiliser. Les applications écrites en Java en sont un exemple typique : beaucoup de mémoire allouée, mais au final peu réellement utilisée. De ce fait, par défaut, Linux accepte de donner plus de mémoire qu’il n’en a. Cela fonctionne généralement bien. Mais dans certains cas, comme par exemple avec PostgreSQL, cela peut causer de gros problèmes. En effet, si les applications ont la mauvaise idée d’utiliser toute la mémoire qu’elles ont allouée, Linux risque de se retrouver à court de mémoire. Dans ce cas, il décide de tuer les applications les plus consommatrices. Et malheureusement, PostgreSQL a tendance à gagner facilement à ce jeu là. Ce système s’appelle l’Overcommit Memory et il convient de le désactiver sur un serveur dédié à PostgreSQL.
Pour cela, il convient de configurer le paramètre vm.overcommit_memory
à la valeur 2. Le mieux revient à créer un fichier nommé /etc/sysctl.d/S99-postgresql
avec ce contenu :
vm.overcommit_memory = 2
Ainsi, cette configuration s’appliquera à chaque démarrage du serveur.
Les autres paramètres étant relatifs aux performances de PostgreSQL et ne permettant pas de toute façon de gagner énormément, ils ne seront pas détaillés dans cet article mais en voici la liste pour les curieux et curieuses :
vm.dirty_background_bytes
et ses amisvm.dirty_background_ratio
,vm.dirty_bytes
etvm.dirty_ratio
;vm.nr_hugepages
;vm.nr_overcommit_hugepages
;vm.overcommit_ratio
;vm.swappiness
;vm.zone_reclaim_mode
.
Pensez néanmoins à désactiver les Transparent Huge Pages.
Concernant les systèmes de fichiers, faites bien attention à activer l’option noatime
sur les systèmes le supportant.
Installation du dépôt de la communauté
En effet, nous n’allons pas utiliser les paquets fournis par la distribution Rocky Linux, mais ceux fournis par la communauté PostgreSQL. Les mises à jour, majeures et mineures, sont souvent disponibles bien plus rapidement. C’est d’autant plus important pour les mises à jour mineures comprenant des failles de sécurité. Il est essentiel de les mettre à jour dès l’annonce de la sortie de versions mineures. De ce fait, la première étape est d’installer la définition du dépôt de la communauté. Pour un serveur x86_64 installé avec une distribution Red Hat / CentOS / Rocky Linux version 9, cela se fait avec cette commande unique :
dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm
Attention, uniquement si vous êtes sur une version 71 des mêmes distributions, il vous faut maintenant désactiver le module postgresql
. Cette commande s’en charge :
dnf -qy module disable postgresql
Pour les versions ultérieures, ce module n’existe plus, donc la commande de désactivation est inutile.
Ceci fait, nous avons accès aux paquets de la communauté.
Installation des paquets
Nous allons installer plusieurs paquets pour PostgreSQL :
postgresql15-server
contient les binaires nécessaires au serveur PostgreSQL ;postgresql15-libs
contient les bibliothèques partagées du serveur ;postgresql15
contient les applications clientes (commepsql
oupg_dump
par exemple) ;postgresql15-contrib
contient les modules contrib, sortes d’extensions ou d’addon permettant d’ajouter des fonctionnalités à PostgreSQL.
La ligne de commande ne précise que deux paquets mais les dépendances de ces deux paquets feront que les autres seront installés :
dnf install -y postgresql15-server postgresql15-contrib
Configuration du service
Comme nous allons placer le répertoire de données dans un répertoire autre que l’habituel /var/lib/pgsql/15/data
, il nous faut modifier la configuration du service. Pour cela, il faut créer un fichier override.conf
qui va permettre, comme son nom l’indique, de surcharger la configuration par défaut. Cela se fait avec les deux commandes suivantes :
mkdir -p /etc/systemd/system/postgresql-15.service.d
cat > /etc/systemd/system/postgresql-15.service.d/override.conf <<_EOF_
[Service]
Environment=PGDATA=/srv/data
_EOF_
Initialisation du répertoire des données
Maintenant, il nous faut préparer le répertoire des fichiers de données et celui des journaux de transactions :
install -d -o postgres -g postgres -m 700 /srv/data
rm -rf /srv/wal/lost+found/
chown -R postgres:postgres /srv/wal
Enfin, nous pouvons initialiser le répertoire des données :
PGSETUP_INITDB_OPTIONS="--data-checksums --waldir /srv/wal" /usr/pgsql-15/bin/postgresql-15-setup initdb
L’option --data-checksums
permet d’activer les sommes de contrôle sur les fichiers de données. Ces sommes de contrôle permettent d’être prévenu en cas de corruption dans les fichiers de données. L’option --waldir
permet d’indiquer un autre répertoire de stockage pour les journaux de transactions.
La commande initdb
va créer les répertoires et fichiers nécessaires pour pouvoir démarrer PostgreSQL. Ces fichiers étant créés, il ne nous reste plus qu’à activer le service et le démarrer.
Activation et démarrage du service
L’activation et le démarrage sont deux commandes séparées pour systemd
. Le service PostgreSQL pour ce dernier étant configuré, il ne reste plus qu’à les exécuter :
systemctl enable postgresql-15
systemctl start postgresql-15
Configuration de l’utilisateur système postgres
Ce rôle n’a pas de mot de passe par défaut. Ajoutez-en un si vous le souhaitez.
Ajoutez surtout dans le fichier d’initialisation de session (.profile
, .bash_profile
, ou autre) la configuration de la variable d’environnement PGDATA
. Celle-ci doit pointer vers le répertoire d’installation de PostgreSQL :
export PGDATA=/srv/data
Les paquets RPM le font, cependant le répertoire indiqué pointe vers le répertoire par défaut (/var/lib/pgsql/15/data
), pas le répertoire personnalisé que nous avons choisi.
Il est aussi intéressant de modifier la variable d’environnement PATH
pour pointer vers les binaires de PostgreSQL, soit :
export PATH=/usr/pgsql-15/bin:$PATH
Ajouter une deuxième instance
Nous n’allons pas utiliser de deuxième instance sur un même serveur. Cependant, cette demande revient si régulièrement qu’il est intéressant d’y répondre maintenant.
Si vous souhaitez ajouter une deuxième instance sur le même serveur, il faut ajouter un service systemd en copiant le fichier de base (ou plus intelligemment, en créant un lien symbolique) :
ln -s /usr/lib/systemd/system/postgresql-15.service /etc/systemd/system/pg2.service
Comme précédemment, nous allons surcharger la configuration du nouveau service :
mkdir -p /etc/systemd/system/pg2.service.d
cat > /etc/systemd/system/pg2.service.d/override.conf <<_EOF_
[Service]
Environment=PGDATA=/srv/data2
_EOF_
Comme un nouveau service est installé, il faut demander à systemd de recharger sa configuration :
systemctl daemon-reload
Avant de remplir le répertoire de données, il faut le créer et lui affecter le bon propriétaire :
install -d -o postgres -g postgres -m 700 /srv/data2
Enfin, nous pouvons initialiser le répertoire des données :
PGSETUP_INITDB_OPTIONS="--data-checksums" /usr/pgsql-15/bin/postgresql-15-setup initdb pg2
La différence avec la précédente exécution de ce script tient dans l’ajout d’un argument correspondant au nom du nouveau service. Ainsi le script peut trouver le bon répertoire des données.
Il ne reste plus qu’à activer et lancer ce service :
systemctl enable pg2
systemctl start pg2
Si vous avez créé plusieurs instances sur le même serveur, il est fortement conseillé de configurer le paramètre cluster_name
de PostgreSQL pour pouvoir différencier les processus de chaque instance.
Conclusion
Et voilà, PostgreSQL est installé. Il est même lancé. Cependant, avant de l’utiliser, il serait bien de le configurer un minimum. Ce sera le sujet du prochain article de cette série.
-
Une coquille s’était glissée dans l’article original. Il est nécessaire de désactiver le module
postgresql
que pour la version 8 de ces distributions, et non la 7. ↩