Guide de configuration d'un cluster Elasticsearch à haute disponibilité

Assurez un fonctionnement continu et une tolérance aux pannes grâce à ce guide complet sur la configuration d'un cluster Elasticsearch à haute disponibilité. Apprenez à configurer plusieurs nœuds Elasticsearch, comprenez des concepts essentiels tels que les rôles des nœuds et la réplication des shards, et mettez en œuvre les paramètres de découverte pour un environnement de production robuste. Cet article fournit des instructions étape par étape, des exemples pratiques et les meilleures pratiques essentielles pour garantir que votre moteur de recherche et d'analyse distribué est résilient, sécurisé et toujours disponible. Évitez la perte de données et les temps d'arrêt en maîtrisant les configurations Elasticsearch à haute disponibilité.

53 vues

Guide de configuration d'un cluster Elasticsearch à haute disponibilité

Elasticsearch est un moteur de recherche et d'analyse puissant et distribué, conçu pour l'évolutivité et la résilience. Dans les environnements de production, garantir un fonctionnement continu et une tolérance aux pannes est primordial. Ce guide vous expliquera les étapes essentielles pour configurer plusieurs nœuds Elasticsearch afin de créer un cluster robuste à haute disponibilité (HA). En suivant ces instructions, vous apprendrez à configurer votre cluster pour qu'il résiste aux pannes de nœuds et maintienne l'accessibilité des données, garantissant ainsi que vos applications restent réactives et que vos données restent sécurisées.

La configuration d'un cluster Elasticsearch à haute disponibilité implique une planification minutieuse des rôles des nœuds, de la configuration réseau et des stratégies de réplication des données. L'objectif est de distribuer la charge de travail et les données de manière redondante sur plusieurs machines, éliminant ainsi les points de défaillance uniques. Cet article couvrira les concepts fondamentaux, les étapes de configuration pratiques et les meilleures pratiques pour vous aider à bâtir une infrastructure Elasticsearch résiliente, adaptée aux cas d'utilisation de production exigeants.

Comprendre la haute disponibilité dans Elasticsearch

La haute disponibilité dans Elasticsearch est obtenue grâce à plusieurs mécanismes clés :

  • Architecture distribuée : Elasticsearch distribue intrinsèquement les données et les opérations sur plusieurs nœuds.
  • Rôles des nœuds : Différents nœuds peuvent servir à des fins différentes, permettant une allocation des ressources spécialisée et l'isolement des pannes.
  • Réplication des Shards (Fragments) : Chaque index est divisé en fragments (shards), et chaque fragment primaire peut avoir un ou plusieurs fragments répliques, stockés sur différents nœuds.
  • Élection du Nœud Maître : Un processus d'élection robuste garantit qu'un nœud maître est toujours disponible pour gérer l'état du cluster.
  • Zen Discovery (Zen2) : Ce module gère la découverte des nœuds et l'élection du maître, garantissant que les nœuds peuvent se trouver et former un cluster de manière fiable.

Rôles essentiels des nœuds

Dans une configuration HA, la compréhension des rôles des nœuds est cruciale. Les rôles primaires pour la HA sont :

  • Nœuds éligibles au rôle de maître (Master-eligible nodes) : Ces nœuds sont responsables de la gestion de l'état du cluster, y compris la création/suppression d'index, le suivi des nœuds et l'allocation des fragments. Ils ne stockent pas de données ni ne gèrent directement les requêtes de recherche/d'indexation, sauf s'ils possèdent également le rôle data. Pour la HA, vous devriez disposer d'un nombre impair (généralement 3) de nœuds dédiés éligibles au rôle de maître pour former un quorum.
  • Nœuds de données (Data nodes) : Ces nœuds stockent vos données indexées dans des fragments et effectuent des opérations liées aux données comme la recherche, l'agrégation et l'indexation. Ce sont les bêtes de somme de votre cluster.
  • Nœuds de coordination uniquement (Coordinating-only nodes) : (Facultatif) Ces nœuds peuvent être utilisés pour acheminer les requêtes, gérer les phases de réduction de la recherche et gérer l'indexation en masse. Ils ne détiennent ni données ni état de cluster, mais peuvent décharger le travail des nœuds de données et des nœuds maîtres.

Fragments (Shards) et Répliques

Elasticsearch stocke vos données dans des fragments (shards). Chaque index se compose d'un ou plusieurs fragments primaires. Pour atteindre une haute disponibilité, vous devez configurer un ou plusieurs fragments répliques pour chaque fragment primaire. Les fragments répliques sont des copies des fragments primaires. Si un nœud hébergeant un fragment primaire tombe en panne, un fragment réplique sur un autre nœud peut être promu pour devenir le nouveau primaire, garantissant l'absence de perte de données et la poursuite des opérations.

Prérequis pour la configuration d'un cluster HA

Avant de vous plonger dans la configuration, assurez-vous que votre environnement respecte ces exigences de base :

  • Kit de développement Java (JDK) : Elasticsearch nécessite un JDK compatible (généralement OpenJDK). Assurez-vous qu'il est installé sur tous les nœuds.
  • Ressources système : Allouez suffisamment de RAM (par exemple, 8 à 32 Go), de cœurs de CPU et d'espace disque à E/S rapide (SSD recommandé) pour chaque nœud, en particulier les nœuds de données.
  • Configuration réseau : Tous les nœuds doivent pouvoir communiquer entre eux via des ports spécifiques (9300 par défaut pour la communication inter-nœuds, 9200 pour l'API HTTP). Assurez-vous que les pare-feu sont configurés de manière appropriée.
  • Système d'exploitation : Une distribution Linux stable (par exemple, Ubuntu, CentOS, RHEL) est généralement préférée pour les déploiements de production.

Guide étape par étape de la configuration du cluster HA

Cette section décrit le processus d'installation et de configuration d'un cluster Elasticsearch multi-nœuds.

Étape 1 : Installer Elasticsearch sur tous les nœuds

Installez Elasticsearch sur chaque serveur qui fera partie de votre cluster. Vous pouvez utiliser des gestionnaires de paquets (APT pour Debian/Ubuntu, YUM pour RHEL/CentOS) ou télécharger l'archive directement.

Exemple (Debian/Ubuntu via APT) :

wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elasticsearch-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/elasticsearch-keyring.gpg] https://artifacts.elastic.co/packages/8.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-8.x.list
sudo apt update
sudo apt install elasticsearch

Après l'installation, activez et démarrez le service (bien que nous le configurerons d'abord).

sudo systemctl daemon-reload
sudo systemctl enable elasticsearch

Étape 2 : Configurer elasticsearch.yml sur chaque nœud

Le fichier elasticsearch.yml, généralement situé dans /etc/elasticsearch/, est l'endroit où vous définissez les paramètres de votre cluster. Modifiez ce fichier sur chaque nœud avec les configurations appropriées.

Configuration commune à tous les nœuds

  1. cluster.name : Ce nom doit être identique pour tous les nœuds que vous souhaitez joindre au même cluster.
    yaml cluster.name: my-ha-cluster

  2. node.name : Un nom unique pour chaque nœud, utile pour l'identification.
    yaml node.name: node-1

  3. network.host : Lie Elasticsearch à une interface réseau spécifique. Utilisez 0.0.0.0 pour se lier à toutes les interfaces disponibles, ou une adresse IP spécifique.
    yaml network.host: 0.0.0.0 # ou une adresse IP spécifique pour la sécurité/configurations multi-cartes réseau (multi-NIC) # network.host: 192.168.1.101

  4. http.port : Le port pour la communication client HTTP (9200 par défaut).
    yaml http.port: 9200

  5. transport.port : Le port pour la communication inter-nœuds (9300 par défaut). Doit être cohérent.
    yaml transport.port: 9300

Paramètres de découverte (Cruciaux pour la HA)

Ces paramètres indiquent aux nœuds comment se trouver les uns les autres et former un cluster.

  1. discovery.seed_hosts : Une liste d'adresses des nœuds éligibles au rôle de maître dans votre cluster. C'est ainsi que les nœuds découvrent les nœuds maîtres éligibles initiaux. Fournissez les adresses IP ou les noms d'hôte de tous vos nœuds éligibles au rôle de maître.
    yaml discovery.seed_hosts: ["192.168.1.101", "192.168.1.102", "192.168.1.103"]

  2. cluster.initial_master_nodes : Utilisé uniquement lors de l'amorçage (bootstrapping) d'un tout nouveau cluster pour la première fois. Cette liste doit contenir le node.name des nœuds éligibles au rôle de maître qui participeront à la première élection du maître. Une fois le cluster formé, ce paramètre est ignoré.
    yaml cluster.initial_master_nodes: ["node-1", "node-2", "node-3"]

    • Conseil important : Supprimez ou commentez cluster.initial_master_nodes après que le cluster se soit formé avec succès pour éviter un comportement involontaire si un nœud redémarre et tente de former un nouveau cluster.

Configuration des rôles des nœuds

Spécifiez le ou les rôles pour chaque nœud. Une configuration HA courante implique 3 nœuds maîtres dédiés et plusieurs nœuds de données.

  • Nœuds éligibles au rôle de maître (Master-eligible Nodes) (par exemple, node-1, node-2, node-3) :
    yaml node.roles: [master]
  • Nœuds de données (Data Nodes) (par exemple, node-4, node-5, node-6) :
    yaml node.roles: [data]
  • Nœuds à rôles mixtes (déconseillé pour la HA de production à grande échelle) :
    yaml node.roles: [master, data]
    • Meilleure pratique : Pour une véritable haute disponibilité et une stabilité en production, dédiez des nœuds séparés aux rôles de maître et de données. Cela isole les processus maîtres critiques des opérations de données gourmandes en ressources.

Étape 3 : Configurer la taille du tas JVM (Heap Size)

Modifiez /etc/elasticsearch/jvm.options pour définir la taille du tas (heap) JVM. Une bonne règle de base est d'allouer 50 % de la RAM disponible, sans jamais dépasser 30-32 Go. Par exemple, si un serveur dispose de 16 Go de RAM, allouez 8 Go :

-Xms8g
-Xmx8g

Étape 4 : Paramètres système

Pour la production, augmentez la valeur de vm.max_map_count et ulimit pour les fichiers ouverts sur tous les nœuds. Ajoutez ces lignes à /etc/sysctl.conf et appliquez-les (sudo sysctl -p).

vm.max_map_count=262144

Et dans /etc/security/limits.conf (ou /etc/security/limits.d/99-elasticsearch.conf) :

elasticsearch - nofile 65536
elasticsearch - memlock unlimited

Étape 5 : Démarrer les services Elasticsearch

Démarrez le service Elasticsearch sur tous les nœuds configurés. Il est souvent recommandé de démarrer d'abord les nœuds éligibles au rôle de maître, mais avec la découverte moderne, l'ordre est moins critique tant que discovery.seed_hosts est correctement configuré.

sudo systemctl start elasticsearch

Vérifiez l'état du service et les journaux pour détecter toute erreur :

sudo systemctl status elasticsearch
sudo journalctl -f -u elasticsearch

Étape 6 : Vérifier la santé du cluster

Une fois que tous les nœuds sont en cours d'exécution, vérifiez la santé du cluster à l'aide de l'API Elasticsearch. Vous pouvez interroger n'importe quel nœud du cluster.

curl -X GET "localhost:9200/_cat/health?v&pretty"

Sortie attendue :

epoch      timestamp cluster        status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
1678886400 12:00:00  my-ha-cluster  green      6          3       0    0    0    0        0             0                  -                 100.0%
  • status : Doit être green (tous les fragments primaires et répliques sont alloués) ou yellow (tous les fragments primaires sont alloués, mais certains fragments répliques ne le sont pas encore). red indique un problème grave.
  • node.total : Doit correspondre au nombre total de nœuds que vous avez démarrés.
  • node.data : Doit correspondre au nombre de nœuds de données.

Vérifiez les nœuds pour vous assurer qu'ils ont tous rejoint le cluster :

curl -X GET "localhost:9200/_cat/nodes?v&pretty"

Sortie attendue (exemple pour 3 maîtres, 3 nœuds de données) :

ip         heap.percent ram.percent cpu load_1m load_5m load_15m node.role   master name
192.168.1.101          21          87   0    0.00    0.01     0.05 m           *      node-1
192.168.1.102          20          88   0    0.00    0.01     0.05 m           -      node-2
192.168.1.103          22          86   0    0.00    0.01     0.05 m           -      node-3
192.168.1.104          35          90   1    0.10    0.12     0.11 d           -      node-4
192.168.1.105          32          89   1    0.11    0.13     0.10 d           -      node-5
192.168.1.106          30          91   1    0.12    0.10     0.09 d           -      node-6

Ceci montre que node-1 est le maître élu (* sous la colonne master) et que les autres nœuds font partie du cluster.

Étape 7 : Configurer le partitionnement (Sharding) et la réplication de l'index

Pour les nouveaux index créés, Elasticsearch utilise par défaut un fragment primaire et une réplique (index.number_of_shards: 1, index.number_of_replicas: 1). Pour la HA, vous souhaitez généralement au moins une réplique, ce qui signifie que vos données existent sur au moins deux nœuds différents. Cela garantit que si un nœud tombe en panne, une réplique est disponible ailleurs.

Lors de la création d'un index, spécifiez ces paramètres :

```bash
curl -X PUT "localhost:9200/my_ha_index?pretty" -H 'Content-Type: application/json' -d'
{
"settings": {
"index": {
"number_of_shards": 3