LOXODATA

Contrôle de la création d'instance sous Debian

2018-09-05   885 mots, 5 minutes de lecture   Sébastien Lardière

Le packaging de PostgreSQL dans le système d’exploitation Debian GNU/Linux est couramment utilisé par les administrateurs, grâce à ses qualités intrinsèques, aux outils spécifiques l’enrichissant (pg_lsclusters, pg_ctlcluster, …) tout comme au fait que les distributions Debian GNU/Linux et Ubuntu l’utilisant sont elles-mêmes très répandues.

Autre avantage, et non des moindres, dès l’installation des paquets terminés, une instance PostgreSQL fonctionne et est immédiatement utilisable. Dans les faits, quelques minutes suffisent pour utiliser PostgreSQL.

De plus, si les paquets sont disponibles directement dans les distributions citées, il est aussi possible d’utiliser le dépôt créé et maintenu par la communauté PostgreSQL pour choisir la version souhaitée : ce sont les mêmes paquets et la même équipe de mainteneurs. Même la version 11, en bêta au moment de l'écriture de ces lignes, est disponible ! Pour cela, se référer à la page suivante : https://wiki.postgresql.org/wiki/Apt

Dans cet article, nous allons nous intéresser aux possibilités offertes par ces paquets au moment de l’installation en ce qui concerne la création d’une instance PostgreSQL : comment personnaliser la création du cluster !

Paquets

Le packaging sous Debian sépare les différentes versions de PostgreSQL, les clients et la partie serveur, et aussi tout ce qui consiste à intégrer PostgreSQL dans le système d’exploitation.

On trouve donc d’une part les paquets postgresql-10 et postgresql-client-10 pour la version 10 de PostgreSQL, et d’autre part les paquets postgresql-common et postgresql-client-common pour l’intégration dans le système.

Le paquet postgresql-common permet de contrôler la création d’une instance PostgreSQL, c’est donc celui-ci que nous allons étudier dans cet article.

Ce qui va nous permettre de contrôler finement la création d’un cluster est le fichier de configuration /etc/postgresql-common/createcluster.conf qui décrit en fait le comportement de la commande pg_createcluster.

Cette commande va ensuite être utilisée à l’installation du paquet postgresql-10 (et de toutes les autres versions).

Configuration de pg_createcluster

La première étape est d’installer les paquets « common » :

apt install postgresql-common postgresql-client-common

Le fichier /etc/postgresql-common/createcluster.conf contient différentes parties qu’il faut distinguer :

  • Contrôle de l’instance : démarrage automatique ou non
  • Chemin des données
  • Initialisation des données
  • Configuration de l’instance

Contrôle de l’instance

La directive create_main_cluster autorise la création d’une instance lors de l’installation d’une version particulière de PostgreSQL, par exemple le paquet postgresql-10.

Le simple fait de désactiver cette création permet d’appeler la commande « manuellement » une fois le paquet postgresql-10 installé, créant ainsi une instance personnalisée avec la commande pg_createcluster. Mais ça n’est pas cette option que nous allons retenir dans cet article.

La seconde option, start_conf, permet d’indiquer si on souhaite que l’instance soit automatiquement lancée au démarrage du système, ce qui est souvent le cas.

Cette valeur est reportée dans le fichier start.conf de chaque instance, et permet donc un contrôle par instance.

Chemin des données

Le choix du matériel de stockage étant toujours important quand on évoque des bases de données, il est fréquent de devoir préciser le point de montage correspondant, afin d’y stocker le répertoire des données de PostgreSQL.

Par défaut, le chemin utilisé est /var/lib/postgresql, qui pourrait être le point de montage du tableau RAID ou de l’attachement SAN. Mais si le point de montage est, par exemple, /pgdata pour les données, et /pgwal pour les journaux de transactions, alors, on modifie les directives data_directory et waldir du fichier de configuration, comme dans l’exemple suivant :

data_directory = '/pgdata/postgresql/%v/%c'
waldir = '/pgwal/postgresql/wal/%v/%c/pg_wal'

Ceci permet de stocker les données dans les bons systèmes de stockages dès la création de l’instance.

Initialisation des données

L’initialisation des données, c’est-à-dire la création de l’arborescence des répertoires et des fichiers nécessaire à une instance, est confiée à la commande initdb. Les options passées permettent de modifier cette initialisation, par exemple pour activer les sommes de contrôle ou modifier la politique d’authentification par défaut.

La directive initdb_options permet de mettre en place les options qui sont passées à la commande initdb par le script pg_createcluster. L’exemple suivant met en place les options préalablement citées :

initdb_options = '--data-checksums'

Configuration de l’instance

Enfin, la fin du fichier permet d’indiquer les directives de configuration que l’on souhaite utiliser pour alimenter le fichier postgresql.conf de l’instance, qui est situé dans l’arborescence /etc/postgresql/, par exemple.

Quelques directives sont présentes par défaut, comme ssl ou cluster_name auxquels on peut ajouter les exemples suivants :

listen_adresses = '*'

checkpoint_completion_target = 0.9

default_statistics_target = 250

archive_mode = on
archive_command = 'pgbackrest --stanza=%c archive-push %%p '

log_checkpoints = on
log_lock_waits = on

La directive archive_command utilise ici l’outil pgbackrest et le nom de l’instance est utilisé comme nom de la stanza de PgBackRest.

Création de l’instance

Dernière étape, l’installation proprement dite va créer l’instance

apt install postgresql-10 postgresql-client-10

L’instance est alors crée, les données à l’emplacement choisi, et le fichier de configuration correctement ajusté :

$ pg_lsclusters
Ver Cluster Port Status Owner    Data directory              Log file
10  main    5432 online postgres /pgdata/postgresql/10/main /var/log/postgresql/postgresql-10-main.log

L’instance dispose alors de ses propres fichiers postgresql.conf et pg_hba.conf, que l’on peut modifier à souhait, sans impact sur createcluster.conf.

Toutes les instances créées ultérieurement par la commande pg_createcluster tiendront compte de ce fichier de configuration.

Conclusion

Cette gestion des instances PostgreSQL basée sur le fichier de configuration createcluster.conf est tout à fait compatible avec les outils d’industrialisation comme Ansible, et permet donc une intégration propre et efficace de PostgreSQL, tout en permettant le tuning habituel dans les fichiers propres à l’instance.