Configuration Patroni
Il existe 3 types de configuration Patroni :
Configuration dynamique globale pending_restart . Ces options sont stockées dans le magasin de configuration distribué (DCS) et appliquées sur tous les nœuds du cluster. La configuration dynamique peut être définie à tout moment à l’aide de l’outil patronictl_edit_config ou de l’API REST de Patroni REST API . Si les options modifiées ne font pas partie de la configuration au démarrage, elles sont appliquées de manière asynchrone (lors du prochain cycle de réveil) sur chaque nœud, qui est ensuite rechargé. Si le nœud nécessite un redémarrage pour appliquer la configuration (pour les paramètres PostgreSQL avec contexte postmaster, lorsque leurs valeurs ont changé), un indicateur spécial
pending_restartindiquant cela est défini dans le fichier JSON members.data. En outre, l’état du nœud indique cela en affichant"restart_pending": true.Fichier de configuration local patroni.yml (patroni.yml). Ces options sont définies dans le fichier de configuration et ont priorité sur la configuration dynamique.
patroni.ymlpeut être modifié et rechargé en cours d’exécution (sans redémarrage de Patroni) en envoyant le signal SIGHUP au processus Patroni, en effectuant une requêtePOST /reloadREST-API ou en exécutant patronictl_reload . La configuration locale peut être un fichier YAML unique ou un répertoire. Lorsqu’il s’agit d’un répertoire, tous les fichiers YAML qu’il contient sont chargés un par un dans l’ordre trié. En cas de définition d’une clé dans plusieurs fichiers, l’occurrence dans le dernier fichier a priorité.Configuration de l’environnement . Il est possible de définir/écraser certains paramètres de configuration « Local » à l’aide de variables d’environnement. La configuration par environnement est particulièrement utile lorsque vous exécutez l’application dans un environnement dynamique et que vous ne connaissez pas certains paramètres à l’avance (par exemple, il n’est pas possible de connaître votre adresse IP externe lorsque vous êtes exécuté à l’intérieur de
docker).
Règles importantes
Paramètres PostgreSQL contrôlés par Patroni
Certains paramètres PostgreSQL doivent avoir les mêmes valeurs sur le primaire et les répliques. Pour ces paramètres, les valeurs définies dans les fichiers de configuration localisés de Patroni ou via les variables d’environnement n’ont aucun effet. Pour modifier ou définir leurs valeurs, il faut modifier la configuration partagée dans le DCS. Voici la liste réelle de ces paramètres, accompagnée de leurs valeurs par défaut et minimales :
- max_connections : valeur par défaut 100, valeur minimale 25
- max_locks_per_transaction : valeur par défaut 64, valeur minimale 32
- max_worker_processes : valeur par défaut 8, valeur minimale 2
- max_prepared_transactions : valeur par défaut 0, valeur minimale 0
- wal_level : valeur par défaut hot_standby, valeurs acceptées : hot_standby, replica, logical
- track_commit_timestamp : valeur par défaut off
Pour les paramètres ci-dessous, PostgreSQL n’exige pas que les valeurs soient identiques entre le primaire et toutes les répliques. Toutefois, étant donné la possibilité qu’une réplique devienne le primaire à tout moment, il n’a guère de sens de les configurer différemment ; par conséquent, Patroni limite leur définition à la configuration dynamique .
- max_wal_senders : valeur par défaut 10, valeur minimale 3
- max_replication_slots : valeur par défaut 10, valeur minimale 4
- wal_keep_segments : valeur par défaut 8, valeur minimale 1
- wal_keep_size : valeur par défaut 128 Mo, valeur minimale 16 Mo
- wal_log_hints : activé
Ces paramètres sont vérifiés afin de s’assurer qu’ils sont valides ou qu’ils atteignent une valeur minimale.
Certains autres paramètres Postgres sont contrôlés par Patroni :
- listen_addresses - est défini soit à partir de la variable d’environnement
postgresql.listen, soit à partir de la variable d’environnementPATRONI_POSTGRESQL_LISTEN - port - est défini soit à partir de la variable d’environnement
postgresql.listen, soit à partir de la variable d’environnementPATRONI_POSTGRESQL_LISTEN - cluster_name - est défini soit à partir de la variable d’environnement
scope, soit à partir de la variable d’environnementPATRONI_SCOPE - hot_standby: on
Pour plus de sécurité, les paramètres provenant des listes ci-dessus sont écrits dans postgresql.conf, puis passés sous forme de liste d’arguments à postgres, qui leur accorde la plus haute priorité (sauf wal_keep_segments et wal_keep_size), même au-dessus de ALTER SYSTEM
Il existe également des paramètres tels que PostgreSQL.listen, PostgreSQL.data_dir qui peuvent être définis uniquement localement, c’est-à-dire dans le fichier de configuration Patroni config ou via la variable d’environnement configuration . Dans la plupart des cas, la configuration locale remplace la configuration dynamique.
Lors de l’application des options de configuration locales ou dynamiques, les actions suivantes sont effectuées :
- Le nœud vérifie d’abord s’il existe un fichier
postgresql.base.confou si le paramètrecustom_confest défini. - Si le paramètre
custom_confest défini, le fichier qu’il spécifie est utilisé comme configuration de base, en ignorantpostgresql.base.confetpostgresql.conf. - Si le paramètre
custom_confn’est pas défini et quepostgresql.base.confexiste, il contient la configuration « originale » renommée et est utilisé comme configuration de base. - Si aucun fichier
custom_confnipostgresql.base.confn’existe, le fichierpostgresql.confd’origine est renommé enpostgresql.base.confet utilisé comme configuration de base. - Les options dynamiques (à l’exception de celles mentionnées ci-dessus) sont exportées dans
postgresql.conf, et une directive d’inclusion est ajoutée danspostgresql.confvers la configuration de base (soitpostgresql.base.conf, soit le fichier situé àcustom_conf). Ainsi, il est possible d’appliquer de nouvelles options sans devoir relire le fichier de configuration pour vérifier la présence de l’inclusion. - Certains paramètres essentiels à la gestion du cluster par Patroni sont remplacés par la ligne de commande.
- Si une option nécessitant un redémarrage est modifiée (il faut examiner le contexte dans pg_settings et les valeurs réelles de ces options), un indicateur pending_restart est défini sur ce nœud. Cet indicateur est réinitialisé à chaque redémarrage.
Les paramètres seront appliqués dans l’ordre suivant (les paramètres en temps d’exécution ont la priorité la plus élevée) :
- charger les paramètres à partir du fichier
postgresql.base.conf(ou à partir d’un fichiercustom_conf, le cas échéant) - charger les paramètres à partir du fichier
postgresql.conf - charger les paramètres à partir du fichier
postgresql.auto.conf - paramètre en temps d’exécution utilisant
-o --name=value
Cela permet la configuration de tous les nœuds (2), la configuration d’un nœud spécifique à l’aide de ALTER SYSTEM (3) et garantit que les paramètres essentiels au fonctionnement de Patroni sont appliqués (4), tout en laissant de la place aux outils de configuration qui gèrent postgresql.conf directement sans impliquer Patroni (1).
Paramètres PostgreSQL affectant la mémoire partagée
PostgreSQL dispose de certains paramètres qui déterminent la taille de la mémoire partagée qu’ils utilisent :
- max_connections
- max_prepared_transactions
- max_locks_per_transaction
- max_wal_senders
- max_worker_processes
La modification de ces paramètres nécessite un redémarrage de PostgreSQL pour prendre effet, et leurs structures de mémoire partagée ne peuvent pas être plus petites sur les nœuds secondaires que sur le nœud primaire.
Comme expliqué précédemment, Patroni limite la modification de leurs valeurs à la configuration dynamique , qui comprend généralement :
- Application des modifications via patronictl_edit_config
(ou via l’API REST
/configpoint d’accès) - Redémarrage des nœuds via patronictl_restart
(ou via l’API REST
/restartpoint d’accès)
Note : veillez à redémarrer les nœuds PostgreSQL à l’aide de la commande patronictl_restart
, ou via l’endpoint REST /restart. Une tentative de redémarrage de PostgreSQL en redémarrant le démon Patroni, par exemple en exécutant systemctl restart patroni, peut provoquer un basculement dans le cluster, si vous redémarrez le nœud primaire.
Toutefois, comme ces paramètres gèrent la mémoire partagée, une attention particulière doit être portée lors du redémarrage des nœuds :
Si vous souhaitez augmenter la valeur de l’un de ces paramètres :
- Redémarrez tous les serveurs secondaires en premier
- Redémarrez le serveur primaire ensuite
Si vous souhaitez réduire la valeur de l’un de ces paramètres :
- Redémarrez le serveur primaire en premier
- Redémarrez ensuite tous les serveurs secondaires
Remarque : si vous tentez de redémarrer tous les nœuds en même temps après avoir diminué la valeur de l’un de ces paramètres, Patroni ignorera le changement et redémarrera le secondaire avec la valeur d’origine, ce qui nécessitera de redémarrer à nouveau les secondaires ultérieurement. Patroni agit ainsi pour empêcher le secondaire de tomber dans une boucle de redémarrages infinie, car PostgreSQL quitte avec un message FATAL si vous tentez de définir l’un de ces paramètres à une valeur inférieure à celle visible dans pg_controldata sur le nœud secondaire. Autrement dit, nous ne pouvons diminuer le paramètre sur le secondaire qu’une fois que son pg_controldata est à jour avec le primaire concernant ces modifications apportées au primaire.
Plus d’informations à ce sujet sont disponibles dans Aperçu administrateur PostgreSQL .
Paramètres de configuration Patroni
En outre, les options de configuration suivantes de Patroni peuvent être modifiées uniquement de manière dynamique :
- ttl : 30
- loop_wait : 10
- retry_timeout : 10
- maximum_lag_on_failover : 1048576
- max_timelines_history : 0
- check_timeline : false
- PostgreSQL.use_slots : true
Lorsque ces options sont modifiées, Patroni lit la section correspondante de la configuration stockée dans le DCS et met à jour ses valeurs en cours d’exécution.
Les nœuds Patroni enregistrent l’état des options du DCS sur le disque à chaque modification de configuration, dans le fichier patroni.dynamic.json situé dans le répertoire de données de Postgres. Seul le leader est autorisé à restaurer ces options à partir de la sauvegarde sur disque si elles sont totalement absentes du DCS ou si elles sont invalides.
Génération et validation de la configuration
Patroni fournit des interfaces en ligne de commande pour générer et valider une configuration locale
. Avec l’exécutable patroni, vous pouvez :
- Créez une configuration Patroni d’exemple locale ;
- Créez un fichier de configuration Patroni pour l’instance PostgreSQL en cours d’exécution localement (par exemple, comme étape de préparation pour l’intégration Patroni ) ;
- Validez un fichier de configuration Patroni donné.
Configuration exemple de Patroni
Description
Générez un fichier de configuration Patroni d’exemple au format yaml. Les valeurs des paramètres sont définies à l’aide de la configuration Environnement
, sinon, si non définies, les valeurs par défaut utilisées par Patroni ou la chaîne #FIXME sont utilisées pour les valeurs qui devront être définies ultérieurement par l’utilisateur.
Certains valeurs par défaut sont définies en fonction de la configuration locale :
- PostgreSQL.listen : l’adresse IP renvoyée par l’appel à
gethostnamepour le nom d’hôte de la machine actuelle et le port standard5432.- PostgreSQL.connect_address : l’adresse IP renvoyée par l’appel à
gethostnamepour le nom d’hôte de la machine actuelle et le port standard5432.- PostgreSQL.authentication.rewind : n’est défini que si la version de PostgreSQL peut être déterminée à partir du binaire et que la version est 11 ou ultérieure.
- restapi.listen : adresse IP renvoyée par l’appel à
gethostnamepour le nom d’hôte de la machine actuelle et le port standard8008.- restapi.connect_address : adresse IP renvoyée par l’appel à
gethostnamepour le nom d’hôte de la machine actuelle et le port standard8008.
Paramètres
configfile - chemin complet du fichier de configuration utilisé pour stocker le résultat. Si non fourni, le résultat est envoyé à stdout.
Configuration Patroni pour une instance en cours d’exécution
Description
Générez une configuration Patroni au format yaml pour l’instance PostgreSQL exécutée localement. Le DSN fourni, qui est prioritaire, ou les variables d’environnement
de PostgreSQL serviront à la connexion. Si aucun mot de passe n’est fourni, vous devrez le saisir à l’invite.
Toutes les options GUC non internes définies dans l’instance Postgres source, qu’elles aient été configurées via un fichier de configuration, via la ligne de commande du postmaster ou via des variables d’environnement, serviront de source pour les paramètres de configuration Patroni suivants :
- scope : valeur GUC
cluster_name;- PostgreSQL.listen : valeurs GUC
listen_addressesetport;- PostgreSQL.datadir : valeur GUC
data_directory;- PostgreSQL.parameters : valeurs GUC
archive_command,restore_command,archive_cleanup_command,recovery_end_command,ssl_passphrase_command,hba_file,ident_file,config_file;- bootstrap.dcs : toutes les autres valeurs GUC PostgreSQL collectées.
Si scope, postgresql.listen ou postgresql.datadir n’est pas défini à partir des paramètres GUC de Postgres, la valeur respective de la configuration Environment
est utilisée.
Autres règles applicables à la définition des valeurs :
- name : valeur de la variable d’environnement
PATRONI_NAMEsi définie, sinon le nom d’hôte de la machine actuelle.- PostgreSQL.bin_dir : chemin vers les binaires Postgres extraits de l’instance en cours d’exécution.
- PostgreSQL.connect_address : adresse IP renvoyée par l’appel à
gethostnamepour le nom d’hôte de la machine actuelle et le port utilisé pour la connexion à l’instance, ou la valeur du paramètre GUCport.- PostgreSQL.authentication.superuser : configuration utilisée pour la connexion à l’instance ;
- PostgreSQL.pg_hba : lignes extraites depuis le fichier
hba_filede l’instance source.- PostgreSQL.pg_ident : lignes extraites depuis le fichier
ident_filede l’instance source.- restapi.listen : adresse IP renvoyée par l’appel à
gethostnamepour le nom d’hôte de la machine actuelle et le port standard8008.- restapi.connect_address : adresse IP renvoyée par l’appel à
gethostnamepour le nom d’hôte de la machine actuelle et le port standard8008.
Les autres paramètres définis à l’aide de la configuration Environnement sont également inclus dans la configuration.
Paramètres
configfile
Chemin complet du fichier de configuration utilisé pour stocker le résultat. Si ce chemin n’est pas fourni, le résultat est envoyé à stdout.
dsn
Chaîne DSN facultative pour l’instance PostgreSQL locale afin d’obtenir les valeurs GUC.
Valider la configuration Patroni
Description
Validez la configuration Patroni fournie et affichez les informations relatives aux vérifications échouées.
Paramètres
configfile
Chemin complet du fichier de configuration à vérifier. Si non fourni ou si le fichier n’existe pas, tentera de lire à partir de la variable d’environnement PATRONI_CONFIG_VARIABLE, ou, si elle n’est pas définie, à partir des variables d’environnement Patroni Patroni
.
--ignore-listen-port | -i
Indicateur facultatif pour ignorer les échecs de liaison des ports listen déjà en cours d’utilisation lors de la validation de configfile.
--print | -p
Indicateur facultatif pour afficher la configuration locale (y compris les substitutions de configuration d’environnement) après sa validation réussie.
Paramètres de configuration dynamique stockés dans le DCS et appliqués au cluster entier.
Référence complète des options et sections de configuration YAML pour Patroni
Variables d’environnement pour remplacer les paramètres de configuration de Patroni.