[Etcd](https://etcd.io/) est un système de stockage clé-valeur distribué fortement cohérent qui fournit un moyen fiable de stocker des données auxquelles un système distribué ou un cluster de machines doit accéder. Il gère les élections de primaire lors de problème réseau, et peux tolérer les pannes de machines, même sur le nœud primaire.
**ATTENTION : Documentation en cours d'écriture !**
# Installation
En Debian 11 on installe le client et / ou le serveur etcd comme ceci :
~~~
# apt install etcd-client etcd-server
~~~
Si on doit utilisé etcd via une API en python, comme pour Patroni par exemple, on peux installer ces paquets supplémentaires :
*`ETCD_DATA_DIR` : répertoire du datadir des WAL etcd
*`ETCD_LOG_OUTPUTS` : défini la sortie des logs, peux être défini sur `stdout` ou `stderr`, ça skippe la remonté des logs dans journald.
*`ETCD_LISTEN_PEER_URLS` : défini la liste des URLs sur laquelle écoute le trafic des pairs. Seule une adresse IP est valide, si on indique `0.0.0.0:PORT` cela écoute sur toutes les interfaces réseau de la machine.
*`ETCD_LISTEN_CLIENT_URLS` : défini la liste des URLs sur laquelle écoute le trafic des clients. Seule une adresse IP est valide, si on indique `0.0.0.0:PORT` cela écoute sur toutes les interfaces réseau de la machine.
*`ETCD_INITIAL_ADVERTISE_PEER_URLS` : liste des URLs homologue de ce nœud a annoncer au reste du cluster. Ces adresses sont utilisées pour communiquer les données etcd autour du cluster, et elle peuvent contenir des noms de domaine.
*`ETCD_INITIAL_CLUSTER` : configuration initiale du cluster pour l'amorçage.
*`ETCD_ADVERTISE_CLIENT_URLS` : liste des URL client de ce membre à annoncer au reste du cluster, peux contenir des noms de domaine.
*`ETCD_INITIAL_CLUSTER_TOKEN` : défini le token d'initialisation pour l'amorçage du cluster etcd.
*`ETCD_INITIAL_CLUSTER_STATE` : état initial du cluster, peut être défini sur `new` ou `existing`. Si cette option est définie sur `existing`, etcd tentera de rejoindre le cluster existant. Si la mauvaise valeur est définie, etcd tentera de démarrer mais échouera en toute sécurité.
On fait écouter etcd sur le port `2379` sur l'ip publique ou LAN de la machine, et également sur `localhost`.
On défini la variable `ETCD_INITIAL_CLUSTER` vers tous les nœud etcd du cluster, dans cet exemple il y a 3 nœuds sur 3 machines différentes.
On défini la variable `ETCD_NAME` sur chaque nœud avec un nom différent.
La variable `ETCD_INITIAL_CLUSTER_TOKEN` doit avoir un nom commun sur les nœuds du cluster.
On met en place cette configuration sur tous les nœuds, en modifiant les variables `ETCD_LISTEN_PEER_URLS` / `ETCD_LISTEN_CLIENT_URLS` et `ETCD_INITIAL_ADVERTISE_PEER_URLS` sur chaque nœud avec les valeurs spécifiques a ces machines.
On peux utilisé la commande `etcdctl` pour intéragir avec l'API de etcd, il faut bien exporté la variable `ETCDCTL_API` en fonction de la version de etcd qu'on utilise, soit v2 ou v3.
En Debian 11 on utilise la v3, donc on exporte la variable comme ceci :
~~~
# export ETCDCTL_API=3
~~~
Voici quelques exemples d'utilisation :
* Listé les membres du cluster et connaitre l'état de chaque nœud :
~~~
# etcdctl --endpoints=http://127.0.0.1:2379 member list