Automatiser le déploiement de nœuds patroni avec pglift

Atelier Industrialisation PostgreSQL

Dalibo & Contributors

Presentation

Introduction

Présentation de pglift

  • Permet de déployer et de gérer des instances PostgreSQL uniformisées
  • Instances prêtes pour la production dès leur déploiement
  • Capable de déployer des instances en réplication avec patroni
  • Prends en charge pgBackRest en mode local ou distant

Présentation de patroni

  • Gestionnaire de cluster PostgreSQL
  • Assure la haute disponibilité
  • Supervision et bascule automatique en cas d’incident
  • Configure et maintient la réplication physique entre les instances
  • Repose sur un DCS extérieur pour partager l’état des nœuds et leur configuration au sein du cluster

Présentation du DCS

  • Composant critique de tout cluster Patroni
  • Choix d’etcd pour sa simplicité, sa robustesse et sa popularité
  • Basé sur l’algorithme Raft (Replicated And Fault Tolerant)
  • Pour stocker :
    • l’état de chaque nœud PostgreSQL
    • La configuration des instances
  • Source de vérité du cluster patroni
  • Le DCS ne doit pas devenir un SPoF (single point of failure)

Architecture finale

Configuration

Pré-requis

  • Un cluster etcd
  • PostgreSQL, pgBackRest, pglift et patroni
  • Activer le watchdog (recommandé)

Configuration de pglift

  • Fichier de configuration pglift :
    • ~/.config/pglift/settings.yaml
  • Template de configuration PostgreSQL (postgresql.conf et pg_hba.conf)
  • Installer la configuration de site : pglift site-configure install

Déploiement d’instances en Haute Disponibilité avec pglift

  • Via le terminal avec pglift
  • Via un playbook Ansible et la collection dalibo.pglift

CLI

Serveur primaire

Depuis srv-pg1 :

[postgres@srv-pg1 ~]$ pglift instance create main --pgbackrest-stanza=main-app \
         --pgbackrest-password Passw0rd \
         --replrole-password PasswOrd \
         --surole-password PasswOrd \
         --patroni-cluster maincluster \
         --patroni-node $(hostname -s) \
         --patroni-restapi-connect-address "$(hostname -I | cut -f1 -d' '):8008" \
         --patroni-restapi-listen "$(hostname -I | cut -f1 -d' '):8008" \
         --patroni-postgresql-connect-host $(hostname -I | cut -f1 -d' ')

Serveur secondaire

Depuis srv-pg2 :

[postgres@srv-pg2 ~]$ pglift instance create main --pgbackrest-stanza=main-app \
         --pgbackrest-password Passw0rd \
         --replrole-password PasswOrd \
         --surole-password PasswOrd \
         --patroni-cluster maincluster \
         --patroni-node $(hostname -s) \
         --patroni-restapi-connect-address "$(hostname -I | cut -f1 -d' '):8008" \
         --patroni-restapi-listen "$(hostname -I | cut -f1 -d' '):8008" \
         --patroni-postgresql-connect-host $(hostname -I | cut -f1 -d' ')

Lister les instances

[postgres@srv-pg1 ~]$ pglift instance exec main -- patronictl list
+ Cluster: maincluster (7334815726709754190) ----------+----+-----------+
| Member  | Host            | Role         | State     | TL | Lag in MB |
+---------+-----------------+--------------+-----------+----+-----------+
| srv-pg1 | 192.168.121.172 | Leader       | running   |  1 |           |
| srv-pg2 | 192.168.121.89  | Sync Standby | streaming |  1 |         0 |
+---------+-----------------+--------------+-----------+----+-----------+

Manipuler ses nœuds patroni

  • pglift instance env
  • pglift instance shell

Lister les nœuds d’un cluster

  • patronictl list

Effectuer un switchover

  • patronictl switchover

Tester le failover (bascule automatique)

  • pkill -9 patroni
  • Redémarrage du noeud si le Watchdog est activé

Éditer la configuration PostgreSQL

  • patronictl show-config
  • pglift pgconf show max_connections
  • patronictl edit-config

Redémarrer les nœuds du cluster

  • patronictl restart CLUSTER-NAME

Supprimer les nœuds d’un cluster

  • pglift instance drop

Suppression du cluster

  • patronictl -c CONFIG-FILE remove CLUSTER-NAME

Utiliser la configuration dynamique de patroni

  • Par défaut, configuration locale
  • Configuration dynamique (stocké dans le DCS):
patroni: 
  configuration_mode:
    auth: dynamic
    parameters: dynamic

Déployer un cluster patroni

  • Adapter le fichier d’hôtes (~/ansible/hosts)
  • ansible-playbook -i hosts playbooks/instances.yaml

Déployer une adresse IP Virtuelle

  • keepalived: Solution d’adresse IP Virtuelle
  • ansible-playbook -i hosts playbooks/keepalived.yaml