Patroni : Mise en œuvre

Module R58

Dalibo SCOP

24.12

18 décembre 2024

Sur ce document

Formation Module R58
Titre Patroni : Mise en œuvre
Révision 24.12
PDF https://dali.bo/r58_pdf
EPUB https://dali.bo/r58_epub
HTML https://dali.bo/r58_html
Slides https://dali.bo/r58_slides
TP https://dali.bo/r58_tp

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.

Patroni : Mise en œuvre

PostgreSQL

Au menu

  • Architecture générale
  • Patroni
  • Proxy, VIP et poolers de connexions

Architecture générale

  • Haute disponibilité de service
  • Instances gérées uniquement par Patroni
  • Nécessite deux agrégats de serveurs :
    • DCS (etcd)
    • Patroni
  • Synchronisation des horloges
    • attention aux snapshots !

Définitions

Patroni permet de :

  • créer / mettre en réplication
  • maintenir
  • superviser

des serveurs PostgreSQL en haute disponibilité.

Mécanismes mis en œuvre

  • Réplication physique et outils standards (pg_rewind, pg_basebackup)
  • Sauvegarde PITR (barman, pgBackRest…)
  • Gestionnaire de service : Patroni
  • DCS : Serveur de configurations distribuées (etcd ou autres)

Bascule automatique

  • split-brain
  • leader lock
  • heart beat
  • Promotion automatique

Définition : split-brain

  • 2 primaires sollicités en écriture
  • Arbitrage très difficile
  • Perte de données
  • Indisponibilité du service

Leader lock de Patroni

  • Verrou attribué au primaire de manière unique
  • Communication entre les nœuds Patroni
    • comparaison des LSN
  • Nouveau primaire :
    • nouvelle timeline
    • nouvelle chaîne de connexions
    • les secondaires se raccrochent au primaire

Heartbeat

  • Tous les nœuds Patroni s’annoncent à etcd
    • primaire ou follower
  • si perte de contact avec le leader :
    • timeout sur les followers et bascule

Bootstrap de nœud

  • Création du premier nœud
    • initdb
    • pgBackRest depuis sauvegarde PITR
  • Création / Reconstruction de réplica
    • pg_basebackup depuis primaire
    • pgBackRest depuis sauvegarde PITR (delta !)

Répartition sur deux sites

  • Prévoir la perte d’un des 2 sites
  • Quorum impossible
    • au pire, passage en read only !

Répartition sur trois sites

  • 3 sites pour un quorum
  • Tolérance de panne accrue
  • Changement de site lors d’une bascule
  • 3ᵉ site en standby en cas de perte de 2 sites

Installation

  • Paquets disponibles pour les distributions EL
  • Paquets disponibles pour les distributions Debian
  • Installez PostgreSQL avec Patroni !

Sur Entreprise Linux

  • Utilisation des dépôts communautaires PGDG
  • Nécessite d’activer le dépôt EPEL

Sur Debian et dérivés

  • Paquet patroni disponible
  • Versions plus à jour dans les dépôts PGDG communautaires
    • gérées par les mainteneurs Debian officiels

Installation manuelle

  • Utilisation du gestionnaire de paquets Python pip
  • Installe Patroni mais aussi ses dépendances

Configurations

  • Configuration statique
    • stockée dans le fichier de configuration YAML de chaque nœud
    • recharge par patronictl reload
  • Configuration dynamique
    • stockée dans le DCS
    • initialisée depuis la section bootstrap.dcs du fichier de configuration YAML
    • modifiable ensuite par patronictl edit-config
    • prise en compte immédiatement si possible
    • copiée dans $PGDATA/patroni.dynamic.json à intervalle régulier
  • Variables d’environnement

Paramètres globaux du cluster

Patroni définit trois paramètres globaux au cluster :

  • name
  • namespace
  • scope

Configuration du DCS

  • DCS supportés : etcd, Consul, ZooKeeper, Exhibitor, Kubernetes
  • avec etcd ou etcd3 :
    • host
    • protocol
    • username, password
    • cacert, cert, key

Configuration de Patroni

Le paramétrage de Patroni est :

  • initialisé depuis la section bootstrap.dcs
  • conservé à la racine du YAML dynamique

Création des instances

Il est possible d’indiquer à Patroni comment construire les instances primaires et secondaires d’un agrégat. Les sections concernées sont :

  • bootstrap.method et bootstrap.initdb
  • postgresql.create_replica_methods
  • scripts bootstrap.post_bootstrap et bootstrap.post_init

Configuration de PostgreSQL

  • Configuration de l’agrégat et des instances
  • Configuration dynamique initialisée depuis la section bootstrap.dcs.postgresql (parameters, pg_hba, pg_ident)
  • Configuration statique conservée dans la section postgresql du YAML dynamique
    • postgresql.authentication
    • postgresql.parameters
    • postgresql.pg_hba
    • postgresql.pg_ident
    • postgresql.callbacks

Agrégat de secours

  • Initialisé depuis la section bootstrap.dcs.standby_cluster
  • Lie deux agrégats Patroni distincts :
    • un agrégat contenant une instance primaire
    • un agrégat ne contenant que des instances secondaires
  • Réplication en cascade vers l’agrégat standby

Slots de réplication

Initialisés depuis les sections suivantes :

  • bootstrap.dcs.slots
  • bootstrap.dcs.ignore_slots

Réplication synchrone et asynchrone

  • Objectif : ne pas perdre de données en cas de bascule
  • Patroni :
    • synchronous_mode: "{on|off|quorum}"
    • synchronous_node_count
    • synchronous_mode_strict: "{on|off}"
  • PostgreSQL :
    • synchronous_commit = "on"
    • synchronous_standby_name

Journaux applicatifs

  • Par défaut dans le fichier de trace système
  • Quelques paramètres de la section log :
    • type : format des traces (pain ou json)
    • level : niveau de log
    • format : format des lignes
    • dir : répertoire où placer les journaux
    • file_num : nombre de journaux à conserver
    • file_size : taille maximale d’un journal avant rotation

API REST de Patroni

Patroni expose une API REST :

  • utile à son administration, par ex. via le CLI patronictl
  • utilisée pour la communication inter-démons
  • section restapi :
    • connect_address
    • listen
    • authentication (username, password)
    • SSL (certfile, keyfile, keyfile_password, cafile, verify_client)

API REST pour le CLI patronictl

Une configuration spécifique est réservée au CLI patronictl :

  • section : ctl
    • insecure
    • certfile
    • keyfile
    • keyfile_password
    • cacert

Configuration du watchdog

  • méthode de protection anti split-brain
  • section watchdog :
    • mode : off, automatic ou required
    • device
    • safety_margin

Marqueurs d’instance

Patroni supporte différents marqueurs dans la section tags :

  • nofailover
  • clonefrom
  • noloadbalance
  • replicatefrom
  • nosync
  • failover_priority

Agrégat multinœud Citus

  • Permet de simplifier le déploiement d’un cluster Citus
  • Paramètres :
    • group
    • database

Variables d’environnement

  • Tous les paramètres existent en tant que variables d’environnement
  • Deux sont utiles au quotidien :
    • PATRONICTL_CONFIG_FILE
    • PATRONI_SCOPE

CLI patronictl

  • Interagit avec l’agrégat
  • Depuis n’importe quelle machine

Consultation d’état

  • list : liste les membres d’un agrégat par ordre alphabétique
  • topology : affiche la topologie d’un agrégat

Consulter la configuration du cluster

  • show-config : affiche la configuration dynamique

Modifier la configuration du cluster

  • edit-config : édite la configuration dynamique de l’agrégat
    • ni fichier de conf, ni ALTER SYSTEM !
  • Si redémarrage : à demander explicitement

Commandes de bascule

  • switchover : promotion d’un secondaire
  • failover : bascule par défaillance du primaire

Contrôle de la bascule automatique

  • pause, resume
  • history
  • reinit

Changements de configuration

  • reload
    • attention aux pending restart
  • restart

endpoints de l’API REST

L’API REST permet de :

  • Contrôler du rôle du serveur
  • S’informer sur l’état d’un nœud ou du cluster
  • Manipuler le cluster

Proxy, VIP et Poolers de connexions

  • Connexions aux réplicas
  • Chaîne de connexion
  • HAProxy
  • Keepalived

Connexions aux réplicas

  • Réplication asynchrone, synchrone et remote apply.
  • API REST de Patroni

Chaîne de connexion

  • Chaînes de connexion multihôtes
  • 2 formats différents : URL ou clé=valeur
  • Sélection du type de nœuds grâce à target_session_attrs

HAProxy

  • Répartiteur de charge (round-robin)
  • Check HTTP sur l’API REST de Patroni
    • \primary
    • \replica
  • Page Web pour les statistiques
  • Attention à sa disponibilité !

Keepalived

  • Monte la VIP sur le serveur de l’instance primaire
  • Utilisation de l’API REST de Patroni

Questions

  • C’est le moment !

Quiz

Travaux pratiques

Patroni : installation

Patroni : utilisation

Travaux pratiques Debian 12 (solutions)


  1. Network Time Protocole↩︎

  2. Le quorum se calcule ainsi : (3 sites × 3 nœuds / 2) +1↩︎