fr:rapports:2021:03-04
Différences
Ci-dessous, les différences entre deux révisions de la page.
Prochaine révision | Révision précédente | ||
fr:rapports:2021:03-04 [2021/06/18 10:33] – créée tierce | fr:rapports:2021:03-04 [2021/12/28 16:42] (Version actuelle) – supprimée tharyrok | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
- | # 2021/04/03 (Neutriton) : PostgreSQL HA | ||
- | * [Réunion précédente](https:// | ||
- | * [Pad de la réunion](https:// | ||
- | * [Liste des sujets Neutriton](https:// | ||
- | |||
- | Présences : | ||
- | - Liberfix | ||
- | - Celo | ||
- | - Hgo | ||
- | - Tharyrok | ||
- | |||
- | Jitsi : https:// | ||
- | Caldarium : https:// | ||
- | |||
- | ## Météo | ||
- | |||
- | *Moment informel durant lequel on exprime **en peu de mots** comment on se sent et si on a une attente forte pour la réunion.* | ||
- | |||
- | *Ce n'est pas un moment de discussion mais d' | ||
- | |||
- | ### Attente(s) forte(s) | ||
- | |||
- | *Si l'une ou l' | ||
- | |||
- | * Pouvoir decider de la solution du ha de psql | ||
- | |||
- | ## Ordre du jour | ||
- | |||
- | ### Resources | ||
- | |||
- | * https:// | ||
- | * https:// | ||
- | * https:// | ||
- | |||
- | Résumé des différents modes de HA: https:// | ||
- | |||
- | ### Présentation de Patroni | ||
- | |||
- | Il faut vraiment voir Patroni comme un framework. Il va utiliser plusieurs pièces. | ||
- | |||
- | Etcd : permet à patroni de mettre dans la configuration et faire le quorum. Comme une db clé-valeur mais avec une notion de quorum. C'est simple à utiliser. Patroni supporte d' | ||
- | |||
- | Debian fournit une commande magique qui boostrap tout pour nous : | ||
- | ```shell | ||
- | pg_createconfig_patroni 11 neutrinet | ||
- | ``` | ||
- | |||
- | Patroni va communiquer avec la db qu'il gère et etcd. Il communique aussi avec les autres Patroni pour leur dire de synchroniser leurs données. | ||
- | |||
- | HAProxy va contacter Patroni pour lui demander qui est le primary et qui sont les replicas. Un des patroni va répondre, et HAProxy va rediriger les requêtes SQL vers la DB en primary. | ||
- | |||
- | Si la DB primary est déficiente, | ||
- | |||
- | #### Installation de etcd | ||
- | |||
- | |||
- | On commence par etcd, qui est dans les repos debian :) Bien entendu, on le fait pour les trois serveurs: | ||
- | ```shell | ||
- | apt install etcd | ||
- | ``` | ||
- | |||
- | On crée un réseau privé pour etcd et patroni. | ||
- | psql-01 -> 10.0.0.4 | ||
- | psql-02 -> 10.0.0.3 | ||
- | psql-03 -> 10.0.0.2 | ||
- | |||
- | Dans `/ | ||
- | On donne un nom au cluster (ex : `ǹeutrinet`) | ||
- | |||
- | ```conf | ||
- | # nom du serveur | ||
- | ETCD_NAME=" | ||
- | # port d' | ||
- | # on doit définir tout ça pour lui dire d' | ||
- | ETCD_LISTEN_PEER_URLS=" | ||
- | ETCD_LISTEN_CLIENT_URLS=" | ||
- | ETCD_INITIAL_ADVERTISE_PEER_URLS=" | ||
- | # on définit tous les membres du cluster | ||
- | ETCD_INITIAL_CLUSTER=" | ||
- | # si pas de configuration, | ||
- | ETCD_INITIAL_CLUSTER_STATE=" | ||
- | # token utilisé pour initialiser le cluster | ||
- | ETCD_INITIAL_CLUSTER_TOKEN=" | ||
- | # clients peuvent savoir combien de clients dans le cluster existent, comme ça le client est capable d' | ||
- | ETCD_ADVERTISE_CLIENT_URLS=" | ||
- | ``` | ||
- | |||
- | Quand on parle de client, ce sont les patroni (ce sont eux qui vont parler à etcd). | ||
- | |||
- | On supprime la config par défaut de etcd: | ||
- | ```shell | ||
- | rm / | ||
- | ``` | ||
- | |||
- | On redémarre les etcd : | ||
- | ```shell | ||
- | systemctl restart etcd | ||
- | ``` | ||
- | |||
- | Dans cette config, on n'a pas configuré la communication TLS, mais bon c'est qu'une démo ;) | ||
- | |||
- | Commandes pour vérifier le statut du cluster: | ||
- | - cluster-health -> doit renvoyer `cluster is healthy` :sunflower: | ||
- | - member list -> doit renvoyer la liste des serveurs | ||
- | |||
- | Dans les logs on va voir quel serveur devient leader. Chaque serveur possède un id unique (on voit à qui correspond l'id avec la commande `member list`) | ||
- | |||
- | |||
- | #### Installation de patroni | ||
- | |||
- | ```shell | ||
- | apt install patroni postgresql-contrib postgresql-client postgresql haproxy | ||
- | ``` | ||
- | |||
- | Il faut détruire le cluster db postgresql par défaut. Par défaut, Debian créé un cluster main et le démarre. Donc : | ||
- | |||
- | ``` | ||
- | pg_ctlcluster 11 main stop | ||
- | pg_lsclusters | ||
- | pg_dropcluster 11 main | ||
- | ``` | ||
- | |||
- | Pour manipuler le cluster, Debian fournit une commande patroni : | ||
- | ``` | ||
- | pg_createconfig_patroni 11 neutrinet | ||
- | ``` | ||
- | |||
- | Patroni a déjà des valeurs par défaut. Par contre, il faut lui dire comment se connecter à etcd. | ||
- | |||
- | Patroni peut utiliser soit zookeeper, consul ou etcd pour gérer le quorum du cluster. Patroni peut juste se connecter à son etcd local et apprendre où se trouvent les autres Patroni. | ||
- | |||
- | Par défaut, Patroni crée deux utilisateurs : | ||
- | - postgres | ||
- | - replica | ||
- | |||
- | Dans `/ | ||
- | |||
- | pg_hba : définit comment les clients psql peuvent se connecter à la db. En mode tcp, il faut définir un mot de passe. En mode socket, on utilise le système de permissions Unix. Colonne 1: tcp vs socket (host vs local), et puis j'ai plus suivi :p | ||
- | |||
- | On active le cluster puis on redémarre le patroni: | ||
- | ``` | ||
- | systemctl enable patroni@11-neutrinet | ||
- | systemctl restart patroni@11-neutrinet | ||
- | ``` | ||
- | |||
- | Dans les logs, Patroni va fanfaronner que c'est lui le chef en agitant un cadenas: `i am the leader with the lock` | ||
- | |||
- | Et les autres vont dire qu'ils sont secondaires et qu'ils suivent leur chef... | ||
- | |||
- | Patroni possède une API REST avec laquelle on va un peu jouer. Notamment, des healtcheck pour savoir qui est le primary ou qui sont les replicas. On peut aussi forcer un primary à devenir replicas, etc. | ||
- | |||
- | On doit viser l'url sur l'IP privée (sur localhost ça ne va pas marcher) : | ||
- | ```shell | ||
- | curl http:// | ||
- | ``` | ||
- | |||
- | Pour avoir les infos du cluster: | ||
- | ```shell | ||
- | curl http:// | ||
- | ``` | ||
- | |||
- | #### Installation de HAProxy | ||
- | |||
- | On accélère, de toute façon la config va tenir sur quelques lignes. | ||
- | |||
- | On active les metrics prometheus fournies par HAProxy… Enfin si la version est suffisamment récente : | ||
- | |||
- | Puis on va faire un reverse proxy du port par défaut de psql (5432) vers le port défini dans patroni (ici on met 5442). HAProxy va regarder le endpoint `/master` pour savoir qui est le master parmi les trois serveurs. Si le serveur ne répond pas 200 OK, alors HAProxy va considérer que ce serveur n'est pas primary. | ||
- | |||
- | On fait pareil pour les replicas, sauf qu'on écoute sur le port 5433 et on regarde le endpoint `/replica`. | ||
- | |||
- | Dans les logs de HAProxy, on va bien que psql-02 et psql-03 sont considérés DOWN sur /master (code http 503 Service unavailable), | ||
- | |||
- | - Il est plus important d' | ||
- | - Quel genre de problème peut-il y avoir quand il n'y a qu'un serveur physique ? (3 psql sur le même serveur) Qu' | ||
- | - Patroni a l'air simple d' | ||
- | - Est-ce que Patroni va simplifier les choses ou rajouter de la complexité ? Notamment au niveau de la maintenance… | ||
- | - Patroni a beaucoup d' | ||
- | |||
- | ![](https:// | ||
- | |||
- | Raison de la HA : ne pas courir en cas d' | ||
- | |||
- | En résumé : On a une VIP gérée par keepalived qui va se coller à une VM encore UP, et le HAProxy va détecter qui est le primary et qui sont les secondary. Mais, si on n' | ||
- | ```shell | ||
- | curl -X OPTIONS -I http:// | ||
- | ``` | ||
- | |||
- | Patroni simplifie les backups : on peut prendre un replica et le sortir du cluster mais il est tout de même mis à jour. C'est sur celui-là qu'on envoit les backups. | ||
- | |||
- | ### Comparaison avec d' | ||
- | |||
- | Alternatives sont | ||
- | - PAF (Postgresql Automatic Failover) | ||
- | - repmgr -> pas vraiment HA | ||
- | |||
- | Patroni est sous licence MIT. PAF a pas vraiment de licence claire… | ||
- | |||
- | Personne n'a de connaissance sur PAF, donc on irait plutôt vers Patroni. | ||
- | |||
- | On décide d' | ||
- | |||
- | ## Prochaine réunion | ||
- | |||
- | Prochain Neutriton (pfsense NAT) : 25/04 à 14h | ||
- | |||
- | Lieu : Jitsi et/ou Caldarium | ||
- | |||
- | Après ça, on aimerait faire un atelier dans la serre pour installer les VMs. On commencerait avec les sites statics (mediawiki, wikijs). | ||
- | |||
- | ## Météo de fin | ||
- | |||
- | *Moment informel durant lequel on exprime **en peu de mots** comment, à titre personnel, la réunion a été vécue que ce soit positif ou négatif.* | ||
- | *Si une ou plusieurs **tension est née** durant la réunion, il est peut-être nécessaire d' |
fr/rapports/2021/03-04.1624005198.txt.gz · Dernière modification : 2021/06/18 10:33 de tierce