Haute disponibilité avec Patroni

Formation HAPAT

Dalibo SCOP

24.12

18 décembre 2024

Sur ce document

Formation Formation HAPAT
Titre Haute disponibilité avec Patroni
Révision 24.12
ISBN N/A
PDF https://dali.bo/hapat_pdf
EPUB https://dali.bo/hapat_epub
HTML https://dali.bo/hapat_html
Slides https://dali.bo/hapat_slides

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.

Généralités sur la haute disponibilité

Introduction

  • Définition de « Haute Disponibilité »
  • Contraintes à définir
  • Contraintes techniques
  • Solutions existantes

Définitions

  • RTO / RPO
  • Haute Disponibilité de données / de service

RTO / RPO

Haute disponibilité de service

  • Continuité d’activité malgré incident
  • Redondance à tous les niveaux
    • réseaux, stockage, serveurs, administrateurs…
    • réplication des données
  • Automatisation des bascules

Haute disponibilité des données

  • Perte faible ou nulle de données après incident
    • redonder les données
    • garantir les écritures à plusieurs endroits
  • Contradictoire avec la haute disponibilité de service
    • arbitrage possible avec une complexité et un budget plus importants

Sauvegardes

  • Composant déjà présent
  • Travail d’optimisation à effectuer
  • RTO de quelques minutes possibles
  • RPO de quelques minutes (secondes ?) facilement
  • Et ne pas oublier de tester

Sauvegarde PITR

  • Sauvegarde incrémentale binaire
  • Optimiser la sauvegarde complète
  • Optimiser la restauration complète (RTO)
  • Ajuster l’archivage au RPO désiré

PITR et redondance par réplication physique

Outils PITR

  • Barman
  • pgBackRest

Bilan PITR

  • Utiliser un outil libre issu de l’écosystème PostgreSQL
  • Fiabilise l’architecture
  • Facilite la mise en œuvre et l’administration
  • Couvre déjà certains besoins de disponibilité
  • Nécessite une intervention humaine
  • Nécessite une supervision fiable

Réplication physique

  • Réplique les écritures via les journaux de transactions
  • Entretient une ou plusieurs instances clones
  • Intégrée à PostgreSQL
  • Facilité de mise en œuvre
  • Réduit RPO/RTO par rapport au PITR
  • Plus de matériel
  • Architecture et maintenance plus complexes
  • Haute disponibilité des données

Réplication et RPO

  • Réplication asynchrone ou synchrone
  • Nécessite un réseau très fiable et performant
  • Asynchrone : RPO dépendant du volume d’écriture
    • RPO < 1s hors maintenance et chargement en masse
  • Synchrone : RPO = 0
    • 2 secondaires minimum
    • impact sur les performances !

Réplication et RTO

  • Bascule manuelle
  • Promotion d’une instance en quelques secondes

Bilan sur la réplication

  • 0 ≤ RPO < PITR
  • RTO = prise en charge + 30s
  • Simple à mettre en œuvre
  • Investissement financier et humain plus important

Bascule automatisée

  • Détection d’anomalie et bascule automatique
  • HA de service :
    • réduit le temps de prise en charge
  • Plusieurs solutions en fonction du besoin
  • Beaucoup de contraintes !

Prise de décision

  • La détection d’anomalie est naïve !
  • L’architecture doit pouvoir éviter un split-brain
  • Solutions éprouvées :
    • fencing
    • quorum
    • watchdog
    • SBD
  • Solutions le plus souvent complémentaires.

Mécanique de fencing

  • Isole un serveur/ressource
    • électriquement
    • arrêt via IPMI, hyperviseur
    • coupe les réseaux
  • Utile :
    • pour un serveur muet ou fantôme (rogue node)
    • lorsque l’arrêt d’une ressource est perturbé
  • Déclenché depuis un des nœuds du cluster
  • Nécessite une gestion fine des droits
  • Supporté par Pacemaker, embryonnaire dans Patroni

Mécanique d’un Quorum

  • Chaque serveur possède un ou plusieurs votes
  • Utile en cas de partition réseau
  • La partition réseau qui a le plus de votes détient le quorum
  • La partition qui détient le quorum peut héberger les ressources
  • La partition sans quorum doit arrêter toute ressource
  • Attention au retour d’une instance dans le cluster
  • Supporté par Pacemaker et Patroni (via DCS)

Mécanique du watchdog

  • Équipement matériel intégré partout
    • au pire : softdog (moins fiable)
  • Compte à rebours avant redémarrage complet du serveur
  • À ré-armer par un composant applicatif du serveur, périodiquement
  • Permet de déclencher du self-fencing rapide et fiable
    • meilleure réactivité de l’agrégat
  • « Fencing du pauvre », complémentaire du quorum
  • Patroni et Pacemaker : oui

Storage Base Death

  • L’une des méthodes historique de fencing
  • Un ou plusieurs disques partagés
    • où les nœuds s’échangent des messages
  • Un watchdog par nœud
  • Message poison pill pour demander à un nœud distant de s’auto-fencer
  • Self-fencing en cas de perte d’accès aux disques…
    • …si Pacemaker confirme lui aussi une anomalie
  • Patroni : émulé

Bilan des solutions anti-split-brain

À minima, une architecture fiable peut se composer au choix :

  • fencing actif ou SBD
  • 1 watchdog par serveur + quorum
  • L’idéal : tous les configurer
  • Désactiver les services au démarrage

Implication et risques de la bascule automatique

  • Un collègue peu loquace de plus : un automate
    • et tout doit passer à présent par lui
  • Complexification de l’administration
    • Formation + Tests + Documentation + Communication
    • sinon : erreurs humaines plus fréquentes
    • au final : est-ce plus fiable ?
  • Opérations post-bascule toujours à faire

Reconstruction automatique des instances

  • mécanisme supporté par Patroni
  • risque des:
    • perte d’informations
    • sur-incident
  • préférer une reconstruction manuelle

Questions

N’hésitez pas, c’est le moment !

Patroni : Architecture

Au menu

  • Patroni
  • Réplication PostgreSQL
  • DCS

Patroni

  • Un démon patroni par instance PostgreSQL
  • Les démons patroni coopèrent entre eux
  • Chaque démon administre son instance PostgreSQL locale
    • et impose de passer par lui

Réplication PostgreSQL

Patroni configure la réplication physique entre les instances pour :

  • assurer la réplication des données
    • en mode synchrone et/ou asynchrone
    • aussi en cascade
  • maintenir la réplication après bascule

DCS

  • Stockage distribué par consensus
  • écritures distribuées et atomiques
  • source de vérité de l’agrégat
  • hautement disponible

Deux grappes de serveurs

Agrégats de serveurs pour Patroni

Questions

  • C’est le moment !

Réplication physique : rappels

PostgreSQL

Introduction

  • Patroni repose sur la réplication physique de PostgreSQL
  • la haute disponibilité implique les équipes techniques
  • les équipes techniques doivent comprendre la mécanique

Au menu

  • Mise en place de la réplication physique
  • Promotion
  • Retour à l’état stable

Réplication par streaming

Mise en place de la réplication par streaming

  • Réplication en flux
  • Un processus du serveur primaire discute avec un processus du serveur secondaire
    • d’où un lag moins important
  • Asynchrone ou synchrone
  • En cascade

Serveur primaire (1/2) - Configuration

Dans postgresql.conf :

  • wal_level = replica (ou logical)
  • max_wal_senders = X
    • 1 par client par streaming
    • défaut : 10
  • wal_sender_timeout = 60s

Serveur primaire (2/2) - Authentification

  • Le serveur secondaire doit pouvoir se connecter au serveur primaire
  • Pseudo-base replication
  • Utilisateur dédié conseillé avec attributs LOGIN et REPLICATION
  • Configurer pg_hba.conf :
host replication user_repli 10.2.3.4/32   scram-sha-256
  • Recharger la configuration

Serveur secondaire (1/4) - Copie des données

Copie des données du serveur primaire (à chaud !) :

  • Copie généralement à chaud donc incohérente !
  • Le plus simple : pg_basebackup
    • simple mais a des limites
  • Idéal : outil PITR
  • Possible : rsync, cp
    • ne pas oublier pg_backup_start()/pg_backup_stop() !
    • exclure certains répertoires et fichiers
    • garantir la disponibilité des journaux de transaction

Serveur secondaire (2/4) - Fichiers de configuration

  • postgresql.conf & postgresql.auto.conf
    • paramètres
  • standby.signal (dans PGDATA)
    • vide

Serveur secondaire (2/4) - Paramètres

  • primary_conninfo (streaming) :
primary_conninfo = 'user=user_repli host=prod port=5434
 application_name=standby '
  • Optionnel :
    • primary_slot_name
    • restore_command
    • wal_receiver_timeout

Serveur secondaire (3/4) - Démarrage

  • Démarrer PostgreSQL
  • Suivre dans les traces que tout va bien

Processus

Sur le primaire :

  • walsender ... streaming 0/3BD48728

Sur le secondaire :

  • walreceiver streaming 0/3BD48728

Promotion

Au menu

  • Attention au split-brain !
  • Vérification avant promotion
  • Promotion : méthode et déroulement
  • Retour à l’état stable

Attention au split-brain !

  • Si un serveur secondaire devient le nouveau primaire
    • s’assurer que l’ancien primaire ne reçoit plus d’écriture
  • Éviter que les deux instances soient ouvertes aux écritures
    • confusion et perte de données !

Vérification avant promotion

  • Primaire :
# systemctl stop postgresql-14
$ pg_controldata -D /var/lib/pgsql/14/data/ \
| grep -E '(Database cluster state)|(REDO location)'
Database cluster state:               shut down
Latest checkpoint's REDO location:    0/3BD487D0
  • Secondaire :
$ psql -c 'CHECKPOINT;'
$ pg_controldata -D /var/lib/pgsql/14/data/ \
| grep -E '(Database cluster state)|(REDO location)'
Database cluster state:               in archive recovery
Latest checkpoint's REDO location:    0/3BD487D0

Promotion du standby : méthode

  • Shell :
    • pg_ctl promote
  • SQL :
    • fonction pg_promote()

Promotion du standby : déroulement

Une promotion déclenche :

  • déconnexion de la streaming replication (bascule programmée)
  • rejeu des dernières transactions en attente d’application
  • récupération et rejeu de toutes les archives disponibles
  • choix d’une nouvelle timeline du journal de transaction
  • suppression du fichier standby.signal
  • nouvelle timeline et fichier .history
  • ouverture aux écritures

Opérations après promotion du standby

  • VACUUM ANALYZE conseillé
    • calcul d’informations nécessaires pour autovacuum

Retour à l’état stable

  • Si un standby a été momentanément indisponible, reconnexion directe possible si :
    • journaux nécessaires encore présents sur primaire (slot, wal_keep_size/wal_keep_segments)
    • journaux nécessaires présents en archives (restore_command)
  • Sinon
    • « décrochage »
    • reconstruction nécessaire

Retour à l’état stable, suite

  • Synchronisation automatique une fois la connexion rétablie
  • Mais reconstruction obligatoire :
    • si le serveur secondaire était plus avancé que le serveur promu (« divergence »)
  • Reconstruire les serveurs secondaires à partir du nouveau principal :
    • rsync, restauration PITR, plutôt que pg_basebackup
    • pg_rewind
  • Reconstruction : manuelle !
  • Tablespaces !

Conclusion

  • La réplication physique native est très robuste
  • Patroni peut automatiser :
    • la mise en réplication
    • la promotion
    • le raccrochage d’un ancien primaire

Installation de PostgreSQL depuis les paquets communautaires

Travaux pratiques

Sur Rocky Linux 8 ou 9

Réplication asynchrone en flux avec un seul secondaire

Promotion de l’instance secondaire

Retour à la normale

Sur Debian 12

Réplication asynchrone en flux avec un seul secondaire

Promotion de l’instance secondaire

Retour à la normale

Travaux pratiques (solutions)

Sur Rocky Linux 8 ou 9

Sur Debian 12

etcd : Architecture et fonctionnement

Au menu

  • L’algorithme Raft
  • Implémentation Raft dans etcd
  • Installation etcd
  • Fonctionnalités d’etcd
  • Tâches d’administrations d’un cluster etcd

L’algorithme Raft

  • Algorithme de consensus
  • Replicated And Fault Tolerant
  • Leader-based requests

Raft : Journal et machine à états

  • Machine à états : leader, follower ou candidate
  • Journal des événements :
    • répliqué depuis le leader
    • même résultat sur tous les nœuds
  • Mandats :
    • commence par une élection du leader (unique)
    • numérotés, croissants

Élection d’un leader

  • Heart beats depuis le leader vers les followers
  • Si pas de nouvelles du leader :
    • démarrage de l’élection d’un nouveau leader
  • Promotion par consensus entre les membres
  • Si échec de l’élection, attente aléatoire
  • Tolérance de panne à partir de 3 nœuds

Réplication du journal

  • Mécanisme de réplication
  • Structure des journaux
  • Protection contre les incohérences
    • n° de mandat + index

Sécurité & cohérence

Lors d’une élection:

  • les votants refusent tout candidat en retard par rapport à eux

Majorité et tolérance de panne

  • Nombre impair de nœuds total recommandé
  • Majorité : quorum = (nombre de nœuds / 2) + 1
  • Tolérance de panne : nombre de nœuds - quorum
  • Pas de quorum : pas de réponse au client

Tolérance de panne : Tableau récapitulatif

Nombre de nœuds Majorité Tolérance de panne
2 2 0
3 2 1
4 3 1
5 3 2
6 4 2
7 4 3
8 5 3

Interaction avec les clients

  • Toutes les communications passent par le leader
  • Protection contre l’exécution en double des requêtes
  • Le leader valide les entrées non commitées après son élection
  • Le leader vérifie qu’il est bien leader avant de répondre à une demande de lecture

Raft en action

Démo interactive :

Mécanique d’etcd

  • Serveur de stockage distribué par consensus
    • clé/valeur
  • Multiples nœuds
  • Nécessite 3 nœuds minimum pour avoir une tolérance de panne
  • Haute disponibilité et tolérance de panne
  • Élection par un quorum

etcd V2 et V3

  • Abandon de l’API REST au profit de gRPC
  • endpoints différents pour la supervision
  • Commandes différentes dans etcdctl (ETCDCTL_API)
  • Nouvelles fonctionnalités (ou implémentations différentes):
    • transactions
    • leases
    • quorum & lecture linéarisées / sérialisées
  • Possibilité d’activer le protocole v2 :
    • deux bases de données séparées, une par version de l’API
  • Utilisez l’API v3
    • supportée par Patroni depuis la version 2.0.0 (septembre 2020)

etcd et Raft

  • Implémente l’algorithme Raft
    • hautement disponible: élections et réplication par consensus
    • tolérance de panne possible qu’à partir de 3 nœuds
    • différence : requêtes sur un followers
  • Nombre de membres impair, recommandé entre 3 et 7
  • Mutualisation du cluster etcd pour plusieurs clusters Patroni

Modes de défaillance d’etcd

  • Indisponibilité :
    • du leader
    • d’un nombre de membres inférieur ou égal à la tolérance de panne
    • d’un nombre de membres supérieur à la tolérance de panne
  • Partition réseau
  • Échec lors de l’initialisation du cluster (bootstrap)

Mise en œuvre d’etcd

Contraintes matérielles et logicielles

  • VMs dédiées !
  • Dimensionner la mémoire pour les données + l’OS
    • quota par défaut : 2 Go (largement supérieur à ce que Patroni utilise)
    • préconisation : 2 à 8 Go
    • attention à l’overcommit / OOM killer
  • Des disques rapides pour ne pas ralentir le cluster lors des COMMIT
    • utiliser du SSD
    • tester le stockage avec fio
  • Un réseau fiable (beaucoup d’échanges entre nœuds etcd)
  • Exemple chez CoreOS : proc dual core, 2 Go de RAM, 80 Go de SSD.

Installation des binaires

  • RedHat/EL depuis le dépôt PGDG :
    • dnf install etcd
    • firewalld
  • Debian/Ubuntu :
    • apt-get install etcd (Debian 11)
    • apt-get install etcd-server etcd-client (Debian 12)
  • Installation depuis les sources (Github)

Configuration etcd

Trois méthodes de configuration différentes:

  • En arguments à l’exécutable etcd
  • En variables d’environnement lues par l’exécutable etcd
  • Dans un fichier YAML pointé --config-file

Services etcd

Configurations employées par les principaux services etcd:

  • Service etcd.service
  • Variables d’environnements…
  • … chargées depuis un fichier :
    • /etc/etcd/etcd.conf (paquet PGDG Red Hat & dérivées)
    • /etc/default/etcd (Debian et dérivées)
  • Installation manuelle
    • créer le fichier de service
    • adapter la configuration

Démarrage du cluster

  • systemctl start etcd
    • attente du quorum dès démarrage
  • Premier contact avec etcdctl
  • Création automatique du data-dir

Utilisation d’etcd

Stockage distribué

  • Manipulation des clés avec : get, put, del (ou l’API)
  • Anciennes versions des clés accessibles… jusqu’au passage d’une purge
  • Lectures linéarisées et sérialisées
  • Patroni utilise etcd comme serveur de configurations distribuées pour :
    • stocker des informations sur l’état du cluster
    • stocker la configuration dynamique de Patroni

Notion de bail

  • Notion de lease dans etcd
    • associe une durée de validité (TTL) à une clé
    • le client peut renouveler le bail
    • etcd détruit la clé à l’expiration du bail
  • Utilisation par Patroni
    • permet d’identifier le leader Patroni et de garantir que la leader key expire une fois le TTL expiré

Unicité des clés

  • Création d’une transaction (etcdctl txn)
  • Création conditionnelle d’une clé
    • action si la clé n’existe pas
    • action si la clé existe
  • Permet à Patroni de garantir qu’il n’y a qu’un seul leader

Maintenances

Authentification

  • Activation de l’authentification requise
    • etcdctl auth enable
  • user : pour l’authentification
    • etcdctl user [add|del|get|list]
    • etcdctl user [grant-role|revoke-role]
  • role : conteneur pour les droits, assigné aux utilisateurs
    • etcdctl role [add|del|get|list]
    • etcdctl role [grant-permission|revoke-permission]

Chiffrement des communications

  • Communications avec les clients :
    • --cert-file
    • --key-file
    • --client-cert-auth
    • --trusted-ca-file
  • Communications au sein du cluster etcd :
    • --peer-cert-file
    • --peer-key-file
    • --peer-client-cert-auth
    • --peer-trusted-ca-file

Sauvegarde et restauration

  • Nécessité de recréer le cluster
  • Sauvegarde des données
    • etcdctl … snapshot save …
    • copie de la base de données ($ETCD_DATA_DIRECTORY/member/snap/db)
  • Restauration
    • nouveau cluster
    • etcdctl snapshot restore …
  • Démarrer le nouveau cluster

Remplacement de membre

Pour remplacer un membre sans risquer de perdre le quorum :

  • d’abord retirer l’ancien membre
  • puis ajouter le nouveau membre
  • et jamais l’inverse !

Autres tâches de maintenance

  • Journal Raft et espace de stockage :
    • rétention
    • quota
    • compactage manuelle et automatique

Supervision et métrologie

  • endpoint /debug
  • endpoint /metrics
    • destiné à prometheus
    • Grafana dispose d’une source de données Prometheus
    • surveiller
      • présence d’un leader, nombre d’élections
      • statistiques sur les consensus, performances du stockage et du réseau
      • l’utilisation du quota
  • endpoint /health

Questions

  • C’est le moment !

Quiz

Travaux pratiques

Raft

Installation d’etcd sous Debian

Installation d’etcd sous Rocky Linux 9

etcd : manipulation (optionnel)

Travaux pratiques (solutions)

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. Distributed Control System↩︎

  2. ou parfois Distributed Configuration Store↩︎

  3. La probabilité d’avoir au moins (tolérance de panne + 1) nœuds en panne, qui est égale à pour un cluster à trois nœuds, et p² - p³(1-p) pour un cluster à quatre nœuds, où p est la probabilité de panne d’un nœud (le calcul de cette probabilité est laissée en exercice au lecteur).↩︎

  4. Network Time Protocole↩︎

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