Reviers, 7 juin 2024

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 amis vm.dirty_background_ratio, vm.dirty_bytes et vm.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 7 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 (comme psql ou pg_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.


DALIBO

DALIBO est le spécialiste français de PostgreSQL®. Nous proposons du support, de la formation et du conseil depuis 2005.