vitabaks.postgresql_cluster

Cluster de Haute Disponibilité PostgreSQL :éléphant: :cœur_étincelant:





Licence GitHub
Étoiles GitHub

Cluster de Haute Disponibilité PostgreSQL prêt pour la production (basé sur Patroni). Automatisation avec Ansible.

postgresql_cluster automatise le déploiement et la gestion de clusters PostgreSQL hautement disponibles dans des environnements de production. Cette solution est conçue pour une utilisation sur des serveurs physiques dédiés, des machines virtuelles, et dans des infrastructures à la fois sur site et basées sur le cloud.

Vous pouvez trouver une version de cette documentation qui est facilement navigable et consultable sur postgresql-cluster.org

:trophée: Utilisez le programme sponsoring pour obtenir un soutien personnalisé ou simplement pour contribuer à ce projet.


Configurations Supportées du Cluster Postgres

postgresql_cluster
postgresql_cluster

Trois schémas sont disponibles pour le déploiement :

1. Haute Disponibilité PostgreSQL uniquement

C'est un schéma simple sans équilibrage de charge.

Composants de haute disponibilité :
  • Patroni est un modèle pour créer votre propre solution de haute disponibilité personnalisée en utilisant Python et - pour une accessibilité maximale - un magasin de configuration distribué comme ZooKeeper, etcd, Consul ou Kubernetes. Utilisé pour automatiser la gestion des instances PostgreSQL et la commutation automatique.

  • etcd est un magasin de clé-valeur distribué et fiable pour les données critiques d'un système distribué. etcd est écrit en Go et utilise l'algorithme de consensus Raft pour gérer un journal répliqué hautement disponible. Il est utilisé par Patroni pour stocker des informations sur l'état du cluster et les paramètres de configuration de PostgreSQL. Qu'est-ce que le Consensus Distribué ?

  • vip-manager (optionnel, si la variable cluster_vip est spécifiée) est un service qui démarre sur tous les nœuds du cluster et se connecte au DCS. Si le nœud local possède la clé de leader, vip-manager démarre le VIP configuré. En cas de basculement, vip-manager retire le VIP du leader précédent et le service correspondant sur le nouveau leader le démarre là. Utilisé pour fournir un point d'entrée unique (VIP) pour l'accès à la base de données.

  • PgBouncer (optionnel, si la variable pgbouncer_install est true) est un pooler de connexions pour PostgreSQL.

2. Haute Disponibilité PostgreSQL avec Équilibrage de Charge

Ce schéma permet de distribuer la charge pour les opérations de lecture et permet également d'augmenter le cluster avec des répliques en lecture seule.

Lors du déploiement auprès de fournisseurs de cloud tels qu'AWS, GCP, Azure, DigitalOcean et Hetzner Cloud, un équilibreur de charge cloud est automatiquement créé par défaut pour fournir un point d'entrée unique à la base de données (contrôlé par la variable cloud_load_balancer).

Pour des environnements non-cloud, comme lors d'un déploiement sur vos propres machines, l'équilibreur de charge HAProxy est disponible. Pour l'activer, définissez with_haproxy_load_balancing: true dans le fichier vars/main.yml.

:heavy_exclamation_mark: Remarque : Votre application doit être capable d'envoyer des requêtes de lecture à un port personnalisé 5001, et des requêtes d'écriture au port 5000.

  • port 5000 (lecture / écriture) maître
  • port 5001 (lecture seule) toutes les répliques
si la variable "synchronous_mode" est 'true' (vars/main.yml) :
  • port 5002 (lecture seule) uniquement réplique synchrone
  • port 5003 (lecture seule) uniquement répliques asynchrones
Composants de l'équilibrage de charge HAProxy :
  • HAProxy est une solution gratuite, très rapide et fiable offrant haute disponibilité, équilibrage de charge et proxy pour des applications TCP et HTTP.

  • confd gère les fichiers de configuration d'application locaux en utilisant des modèles et des données provenant d'etcd ou de consul. Utilisé pour automatiser la gestion des fichiers de configuration d'HAProxy.

  • Keepalived (optionnel, si la variable cluster_vip est spécifiée) fournit une adresse IP virtuelle haute disponibilité (VIP) et un point d'entrée unique pour l'accès aux bases de données. Implémentation du VRRP (Virtual Router Redundancy Protocol) pour Linux. Dans notre configuration, keepalived vérifie l'état du service HAProxy et en cas de défaillance, délègue le VIP à un autre serveur dans le cluster.

3. Haute Disponibilité PostgreSQL avec découverte de service Consul

Pour utiliser ce schéma, spécifiez dcs_type: consul dans le fichier de variables vars/main.yml.

Ce schéma convient à un accès uniquement maître et à l'équilibrage de charge (en utilisant DNS) pour la lecture à travers les répliques. La découverte de service Consul avec résolution DNS est utilisée comme point d'accès client à la base de données.

Point d'accès client (exemple) :

  • master.postgres-cluster.service.consul
  • replica.postgres-cluster.service.consul

En outre, cela peut être utile pour un cluster distribué à travers différents centres de données. Nous pouvons spécifier à l'avance dans quel centre de données le serveur de base de données est situé et ensuite l'utiliser pour des applications fonctionnant dans le même centre de données.

Exemple : replica.postgres-cluster.service.dc1.consul, replica.postgres-cluster.service.dc2.consul

Cela nécessite l'installation d'un client Consul en mode client sur chaque serveur d'application pour la résolution DNS de service (ou utilisez DNS de transfert vers le serveur Consul distant au lieu d'installer un client Consul local).

Compatibilité

Distributions basées sur RedHat et Debian (x86_64)

Distributions Linux Supportées :
  • Debian : 11, 12
  • Ubuntu : 22.04, 24.04
  • CentOS Stream : 9
  • Oracle Linux : 8, 9
  • Rocky Linux : 8, 9
  • AlmaLinux : 8, 9
Versions de PostgreSQL :

toutes les versions PostgreSQL supportées

:white_check_mark: testé, fonctionne bien : PostgreSQL 10, 11, 12, 13, 14, 15, 16

Tableau des résultats des tests automatiques quotidiens de déploiement de cluster :

Distribution Résultat du test
Debian 11 Statut de Workflow GitHub
Debian 12 Statut de Workflow GitHub
Ubuntu 22.04 Statut de Workflow GitHub
Ubuntu 24.04 Statut de Workflow GitHub
CentOS Stream 9 Statut de Workflow GitHub
Oracle Linux 8 Statut de Workflow GitHub
Oracle Linux 9 Statut de Workflow GitHub
Rocky Linux 8 Statut de Workflow GitHub
Rocky Linux 9 Statut de Workflow GitHub
AlmaLinux 8 Statut de Workflow GitHub
AlmaLinux 9 Statut de Workflow GitHub
Version d'Ansible

Version minimale d'Ansible supportée : 8.0.0 (ansible-core 2.15.0)

Exigences

Cliquez ici pour développer...

Ce playbook nécessite des privilèges root ou sudo.

Ansible (Qu'est-ce qu'Ansible ?)

si dcs_type : "consul", veuillez installer les exigences de rôle de consul sur le nœud de contrôle :

ansible-galaxy install -r roles/consul/requirements.yml

Exigences de port

Liste des ports TCP requis qui doivent être ouverts pour le cluster de base de données :

  • 5432 (postgresql)
  • 6432 (pgbouncer)
  • 8008 (API REST patroni)
  • 2379, 2380 (etcd)

pour le schéma "[Type A] Haute Disponibilité PostgreSQL avec Équilibrage de Charge" :

  • 5000 (haproxy - (lecture/écriture) maître)
  • 5001 (haproxy - (lecture seule) toutes les répliques)
  • 5002 (haproxy - (lecture seule) uniquement réplique synchrone)
  • 5003 (haproxy - (lecture seule) uniquement répliques asynchrones)
  • 7000 (optionnel, stats haproxy)

pour le schéma "[Type C] Haute Disponibilité PostgreSQL avec Découverte de Service Consul (DNS)" :

  • 8300 (RPC Serveur Consul)
  • 8301 (Consul Serf LAN)
  • 8302 (Consul Serf WAN)
  • 8500 (API HTTP Consul)
  • 8600 (Serveur DNS Consul)

Recommandations

Cliquez ici pour développer...

  • Linux (système d'exploitation) :

Mettez à jour votre système d'exploitation sur vos serveurs cibles avant le déploiement ;

Assurez-vous que la synchronisation temporelle est configurée (NTP).
Spécifiez ntp_enabled:'true' et ntp_servers si vous souhaitez installer et configurer le service NTP.

  • DCS (magasin de consensus distribué) :

Des disques rapides et un réseau fiable sont les facteurs les plus importants pour la performance et la stabilité d'un cluster etcd (ou consul).

Évitez de stocker les données etcd (ou consul) sur le même disque que d'autres processus (comme la base de données) qui utilisent intensément les ressources du sous-système de disque !
Stockez les données etcd et postgresql sur différents disques (voir les variables etcd_data_dir, consul_data_path), utilisez des disques SSD si possible.
Voir les recommandations matérielles et les guides de réglage.

Il est recommandé de déployer le cluster DCS sur des serveurs dédiés, séparés des serveurs de bases de données.

  • Placement des membres du cluster dans différents centres de données :

Si vous préférez une configuration inter-centres de données, où les bases de données répliquées sont situées dans différents centres de données, le placement des membres etcd devient critique.

Il y a beaucoup de choses à considérer si vous voulez créer un cluster etcd vraiment robuste, mais une règle à suivre : ne placez pas tous les membres etcd dans votre centre de données principal. Voir quelques exemples.

  • Comment prévenir la perte de données en cas de basculement automatique (synchronous_modes) :

Pour des raisons de performance, la réplication synchrone est désactivée par défaut.

Pour minimiser le risque de perte de données lors d'un basculement automatique, vous pouvez configurer les paramètres de la manière suivante :

  • synchronous_mode: 'true'
  • synchronous_mode_strict: 'true'
  • synchronous_commit: 'on' (ou 'remote_apply')

Prise en Main

Pour exécuter la Console de Cluster PostgreSQL, exécutez la commande suivante :

docker run -d --name pg-console \
  --publish 80:80 \
  --publish 8080:8080 \
  --env PG_CONSOLE_API_URL=http://localhost:8080/api/v1 \
  --env PG_CONSOLE_AUTHORIZATION_TOKEN=secret_token \
  --volume console_postgres:/var/lib/postgresql \
  --volume /var/run/docker.sock:/var/run/docker.sock \
  --volume /tmp/ansible:/tmp/ansible \
  --restart=unless-stopped \
  vitabaks/postgresql_cluster_console:2.0.0

Remarque : Il est recommandé d'exécuter la console dans le même réseau que vos serveurs de base de données pour permettre la surveillance de l'état du cluster. Dans ce cas, remplacez localhost par l'adresse IP de votre serveur dans la variable PG_CONSOLE_API_URL.

Ouvrez l'interface de la console

Allez sur http://localhost/ et utilisez secret_token pour l'autorisation.

Remarque : Si vous avez configuré la console sur un autre serveur, remplacez 'localhost' par l'adresse du serveur. Utilisez la valeur de votre token si vous l'avez redéfini dans la variable PG_CONSOLE_AUTHORIZATION_TOKEN.

Cliquez ici pour développer... si vous préférez la ligne de commande.

Ligne de commande

  1. Installez Ansible sur un nœud de contrôle (qui peut facilement être un ordinateur portable)
sudo apt update && sudo apt install -y python3-pip sshpass git
pip3 install ansible
  1. Téléchargez ou clonez ce dépôt
git clone https://github.com/vitabaks/postgresql_cluster.git
  1. Allez dans le répertoire du playbook
cd postgresql_cluster/automation
  1. Modifiez le fichier d'inventaire
Spécifiez les adresses IP (non publiques) et les paramètres de connexion (ansible_user, ansible_ssh_pass ou ansible_ssh_private_key_file) pour votre environnement
nano inventory
  1. Modifiez le fichier de variables vars/main.yml
nano vars/main.yml
Ensemble minimum de variables :
  • proxy_env # si nécessaire (pour télécharger des paquets)
  • cluster_vip # pour l'accès client aux bases de données dans le cluster (optionnel)
  • patroni_cluster_name
  • postgresql_version
  • postgresql_data_dir
  • with_haproxy_load_balancing 'true' (Type A) ou 'false'/par défaut (Type B)
  • dcs_type # "etcd" (par défaut) ou "consul" (Type C)

Voir les fichiers vars/main.yml, system.yml et (Debian.yml ou RedHat.yml) pour plus de détails.

Si dcs_type : "consul", veuillez installer les exigences de rôle de consul sur le nœud de contrôle :

ansible-galaxy install -r roles/consul/requirements.yml
  1. Essayez de vous connecter aux hôtes
ansible all -m ping
  1. Exécutez le playbook :
ansible-playbook deploy_pgcluster.yml

Déployer le Cluster avec TimescaleDB

Pour déployer un Cluster de Haute Disponibilité PostgreSQL avec l'extension TimescaleDB, il vous suffit d'ajouter la variable enable_timescale.

Exemple :

ansible-playbook deploy_pgcluster.yml -e "enable_timescale=true"

asciicast

Comment commencer depuis le début

Si vous devez repartir de zéro, vous pouvez utiliser le playbook remove_cluster.yml.

Variables disponibles :

  • remove_postgres : arrêter le service PostgreSQL et supprimer les données.
  • remove_etcd : arrêter le service ETCD et supprimer les données.
  • remove_consul : arrêter le service Consul et supprimer les données.

Exécutez la commande suivante pour supprimer des composants spécifiques :

ansible-playbook remove_cluster.yml -e "remove_postgres=true remove_etcd=true"

Cette commande supprimera les composants spécifiés, vous permettant de recommencer une nouvelle installation.

:warning: Avertissement : faites attention lors de l'exécution de cette commande dans un environnement de production.

Évaluez-nous

Si vous trouvez notre projet utile, envisagez de lui donner une étoile sur GitHub ! Votre soutien nous aide à grandir et nous motive à continuer à nous améliorer. Évaluer le projet est une manière simple mais efficace de montrer votre appréciation et d'aider les autres à le découvrir.

Graphique d'historique des étoiles

Sponsoriser ce projet

En sponsorisant notre projet, vous contribuez directement à son amélioration continue et à son innovation. En tant que sponsor, vous bénéficierez d'avantages exclusifs, y compris un support personnalisé, un accès anticipé aux nouvelles fonctionnalités et la possibilité d'influencer l'orientation du projet. Votre parrainage est inestimable pour nous et contribue à assurer la durabilité et le progrès du projet.

Devenez sponsor dès aujourd'hui et aidez-nous à faire passer ce projet au niveau supérieur !

Soutenez notre travail via GitHub Sponsors

GitHub Sponsors

Soutenez notre travail via Patreon

Soutenez-moi sur Patreon

Soutenez notre travail via un portefeuille crypto :

USDT (TRC20) : TSTSXZzqDCUDHDjZwCpuBkdukjuDZspwjj

Licence

Sous licence MIT. Voir le fichier LICENSE pour plus de détails.

Auteur

Vitaliy Kukharik (DBA PostgreSQL)
vitabaks@gmail.com

Retours, rapports de bogues, demandes, ...

Sont les bienvenus !

À propos du projet

PostgreSQL High-Availability Cluster (based on Patroni)

Installer
ansible-galaxy install vitabaks.postgresql_cluster
Licence
mit
Téléchargements
735
Propriétaire