Introduction
Elasticsearch est un serveur de recherche open source populaire utilisé pour la recherche distribuée en temps réel et l’analyse de données. Lorsqu’il est utilisé pour autre chose que le développement, Elasticsearch doit être déployé sur plusieurs serveurs en tant que cluster, pour des performances, une stabilité et une évolutivité optimales.
Ce guide vous montrera comment installer et configurer un cluster de production Elasticsearch sur Ubuntu 14.04, dans un environnement UNIX.
Bien que la configuration manuelle d’un cluster Elasticsearch soit utile pour l’apprentissage, l’utilisation d’un outil de gestion de la configuration est fortement recommandée pour toute configuration de cluster. Je mettrai bientôt à disposition un guide d’installation d’un cluster Elasticsearch sur Ansible.
Prérequis
Vous devez disposer d’au moins trois serveurs Ubuntu 14.04 pour pouvoir suivre ce guide, car un cluster Elasticsearch doit comporter au moins trois nœuds éligibles pour le maître. Si vous souhaitez disposer de nœuds maîtres et de données dédiés, vous aurez besoin d’au moins 3 serveurs pour vos nœuds maîtres, ainsi que de serveurs supplémentaires pour vos nœuds de données.
Pour ceux qui travaille sur CentOS, je ferai une démo video de l’installation sur la plateforme.
Hypothèses
Ce tutoriel suppose que vos serveurs utilisent un VPN. Cela fournira une fonctionnalité de réseau privé quel que soit le réseau physique utilisé par vos serveurs.
Si vous utilisez un réseau privé partagé, vous devez utiliser un VPN pour protéger Elasticsearch des accès non autorisés. Chaque serveur doit appartenir au même réseau privé, car Elasticsearch n’a pas de sécurité intégrée dans son interface HTTP. Le réseau privé ne doit pas être partagé avec des ordinateurs auxquels vous ne faites pas confiance.
Nous ferons référence aux adresses IP VPN de vos serveurs en tant que vpn_ip. Nous supposerons également qu’ils ont tous une interface VPN nommée « tun0« .
Pour ceux qui n’utilise pas de VPN, la configuration d’un outil tel que UFW fera aussi bien l’affaire. Une video de présentation de l’outil est disponible ici: https://www.youtube.com/watch?v=BxkQk3eF-pM&list=PL9_ko1BejYs53uHC9-Yfj0jfYyJIGP58A&index=12
Installer Java 8
Elasticsearch nécessite Java, nous allons donc l’installer maintenant. Nous allons installer une version récente d’Oracle Java 8 car c’est ce que recommande Elasticsearch. Cela devrait cependant fonctionner correctement avec OpenJDK, si vous décidez de suivre cette voie.
Effectuez cette étape sur tous vos serveurs Elasticsearch.
Ajoutez le Oracle Java PPA à apt:
Mettez à jour vos paquets apt:
Installez la dernière version stable d’Oracle Java 8 avec cette commande (et acceptez le contrat de licence qui apparaît):
Veillez à répéter cette étape sur tous vos serveurs Elasticsearch.
Maintenant que Java 8 est installé, installons ElasticSearch.
Installer Elasticsearch
Elasticsearch peut être installé avec un gestionnaire de paquets en ajoutant la liste des sources de paquets d’Elastic. Effectuez cette étape sur tous vos serveurs Elasticsearch.
Exécutez la commande suivante pour importer la clé GPG publique Elasticsearch dans apt:
Si votre invite est juste en attente, il attend probablement le mot de passe de votre utilisateur (pour autoriser la commande sudo). Si c’est le cas, entrez votre mot de passe.
Créez la liste de sources Elasticsearch:
echo « deb http://packages.elastic.co/elasticsearch/2.x/debian stable main » | sudo tee -a /etc/apt/sources.list.d/elasticsearch-2.x.list
Mettez à jour de nouveaux vos paquets apt:
Installez Elasticsearch avec cette commande:
Veillez à répéter ces étapes sur tous vos serveurs Elasticsearch.
Elasticsearch est maintenant installé, mais vous devez le configurer avant de pouvoir l’utiliser.
Configurer le cluster Elasticsearch
Il est maintenant temps de modifier la configuration Elasticsearch. Assurez d’effectuer également ces modification sur tous vos serveurs Elasticsearch.
Ouvrez le fichier de configuration Elasticsearch pour le modifier:
Lier votre système aux adresses IP VPN ou une interface
Vous souhaiterez restreindre l’accès externe à votre instance Elasticsearch afin que des personnes tiers ne puissent pas accéder à vos données ni arrêter votre cluster Elasticsearch via l’API HTTP. En d’autres termes, vous devez configurer Elasticsearch pour qu’il autorise uniquement l’accès aux serveurs que via votre réseau privé (VPN). Pour ce faire, nous devons configurer chaque nœud pour qu’il se connecte à l’adresse IP du VPN, à vpn_ip ou à l’interface « tun0« .
Recherchez la ligne qui spécifie network.host, supprimez le commentaire et remplacez sa valeur par l’adresse IP VPN du serveur respectif (par exemple, 10.0.0.1 pour node01) ou le nom de l’interface. Notre interface VPN étant nommée « tun0 » sur tous nos serveurs, nous pouvons configurer tous nos serveurs avec la même ligne:
Notez l’ajout de « _local_« , qui configure Elasticsearch pour qu’il écoute également sur tous les périphériques de bouclage. Cela vous permettra d’utiliser l’API HTTP Elasticsearch localement, à partir de chaque serveur, en envoyant des demandes à localhost. Si vous n’incluez pas cela, Elasticsearch ne répondra qu’aux demandes adressées à l’adresse IP du VPN.
Avertissement: Elasticsearch ne disposant pas de sécurité intégrée, il est très important de ne pas définir cette adresse sur une adresse IP accessible à des serveurs que vous ne contrôlez pas ou ne faites pas confiance. Ne liez pas Elasticsearch à une adresse IP de réseau publique ou privée partagée!
Définir le nom du cluster
Ensuite, définissez le nom de votre cluster, ce qui permettra à vos nœuds Elasticsearch de se joindre et de former le cluster. Vous voudrez utiliser un nom descriptif unique (au sein de votre réseau).
Recherchez la ligne qui spécifie cluster.name, décommentez-la et remplacez-la par le nom de cluster souhaité. Dans ce tutoriel, nous nommerons notre cluster « production« :
Définir le nom du nœud
Ensuite, nous allons définir le nom de chaque noeud. Cela doit être un nom descriptif unique dans le cluster.
Recherchez la ligne qui spécifie node.name, décommentez-la et remplacez-la par le nom de nœud souhaité. Dans ce guide, nous allons définir chaque nom de noeud sur le nom d’hôte du serveur en utilisant la variable d’environnement $ {HOSTNAME}:
Si vous préférez, vous pouvez nommer vos nœuds manuellement, mais en veillant à spécifier des noms uniques. Vous pouvez également laisser node.name commenté, si vous voulez que vos nœuds soient nommés de manière aléatoire.
Définir la strategie de découverte des noeuds
Ensuite, vous devrez configurer une liste initiale de nœuds qui seront contactés, découvert( dans le jargon Elasticsearch) et former un cluster. Cela est nécessaire dans un réseau de monodiffusion.
Recherchez la ligne qui spécifie discovery.zen.ping.unicast.hosts et décommentez-la. Remplacez sa valeur par un tableau de chaînes d’adresses IP ou de noms d’hôte VPN (résolus en adresses IP VPN) de tous les autres nœuds.
Par exemple, si vous avez trois serveurs node01, node02 et node03 avec les adresses IP VPN respectives 10.0.0.1, 10.0.0.2 et 10.0.0.3, vous pouvez utiliser cette ligne:
Sinon, si tous vos serveurs sont configurés avec une résolution basée sur le nom de leurs adresses IP VPN (via DNS ou /etc/hosts), vous pouvez utiliser cette ligne:
Sauvegarder et quitter
Vos serveurs sont maintenant configurés pour former un cluster Elasticsearch basic. Il y a d’autres paramètres à configurer, mais nous y reviendrons une fois que nous aurons vérifié que le cluster fonctionne.
Enregistrez et quittez elasticsearch.yml.
Démarrer Elasticsearch
Maintenant démarrez Elasticsearch:
Ensuite, exécutez cette commande pour démarrer Elasticsearch au démarrage:
Veillez à répéter ces étapes (Configurer Elasticsearch Cluster) sur tous vos serveurs Elasticsearch.
Vérifier l’état du cluster
Si tout a été configuré correctement, votre cluster Elasticsearch devrait être opérationnel. Avant de continuer, vérifions que cela fonctionne correctement. Vous pouvez le faire en interrogeant Elasticsearch à travers n’importe quel nœud Elasticsearch.
À partir de l’un de vos serveurs Elasticsearch, exécutez cette commande pour récupérer l’état du cluster:
Vous devriez voir une sortie indiquant qu’un cluster nommé « production » est en cours d’exécution. Il devrait également indiquer que tous les nœuds que vous avez configurés sont des membres:
Si vous voyez une sortie semblable à celle-ci, votre cluster Elasticsearch est en cours d’exécution! Si l’un de vos nœuds manque, passez en revue la configuration du ou des nœuds en question avant de poursuivre.
Ensuite, nous passerons en revue certains paramètres de configuration à prendre en compte pour votre cluster Elasticsearch.
Activer le verrouillage de la mémoire
Elastic recommande d’éviter à tout prix de permuter le processus Elasticsearch en raison de ses effets négatifs sur les performances et la stabilité. Une façon d’éviter un échange excessif consiste à configurer Elasticsearch pour verrouiller la mémoire dont il a besoin.
Effectuez cette étape sur tous vos serveurs Elasticsearch.
Editez la configuration Elasticsearch:
Recherchez la ligne qui spécifie bootstrap.mlockall et décommentez-la:
Sauvegarder et quitter.
Ensuite, ouvrez le fichier /etc/default/elasticsearch pour le modifier:
Commencez par rechercher ES_HEAP_SIZE, supprimez le commentaire et définissez-le sur environ 50% de votre mémoire disponible. Par exemple, si vous avez environ 4 Go de disponible CPU, vous devez la définir sur 2 Go (2g):
Ensuite, recherchez et décommentez MAX_LOCKED_MEMORY = unlimited. Cela devrait ressembler à ceci quand vous avez fini:
Sauvegarder et quitter.
Redémarrez maintenant Elasticsearch pour mettre en place les modifications:
Veillez à répéter cette étape sur tous vos serveurs Elasticsearch.
Vérifier le statut de Mlockall
Pour vérifier que mlockall fonctionne sur tous vos noeuds Elasticsearch, exécutez cette commande à partir de n’importe quel noeud:
Chaque nœud doit comporter une ligne indiquant « mlockall »: true, indiquant que le verrouillage de la mémoire est activé et fonctionne:
Si mlockall a la valeur false pour l’un de vos nœuds, passez en revue les paramètres du nœud et redémarrez Elasticsearch. Une raison fréquente d’échec du démarrage d’Elasticsearch est que ES_HEAP_SIZE est défini sur une valeur trop élevée.
Configurer la limite de descripteur de fichier ouvert (facultatif)
Par défaut, votre nœud Elasticsearch doit avoir une « limite de descripteur de fichier ouvert » de 64 Ko. Cette section vous montrera comment vérifier cela et, si vous le souhaitez, l’augmenter.
Comment vérifier le nombre maximal de fichiers ouverts
Tout d’abord, recherchez l’ID de processus (PID) de votre processus Elasticsearch. Une méthode simple consiste à utiliser la commande ps pour répertorier tous les processus appartenant à l’utilisateur elasticsearch:
Vous devriez voir une sortie qui ressemble à ceci. Le nombre dans la première colonne est le PID de votre processus Elasticsearch (java):
Exécutez ensuite cette commande pour afficher les limites de fichiers ouverts pour le processus Elasticsearch (remplacez le nombre en surbrillance par votre propre PID de l’étape précédente):
Les chiffres dans les deuxième et troisième colonnes indiquent les limites respectives et strictes, respectivement, 64k (65535). Cela convient pour de nombreuses configurations, mais vous souhaiterez peut-être augmenter ce paramètre.
Comment augmenter les limites maximales de descripteur de fichier
Pour augmenter le nombre maximal de descripteurs de fichier ouverts dans Elasticsearch, il vous suffit de modifier un paramètre unique.
Ouvrez le fichier /etc/default/elasticsearch pour le modifier:
Recherchez MAX_OPEN_FILES, décommentez-le et définissez-le à la limite de votre choix. Par exemple, si vous souhaitez une limite de 128 000 descripteurs, remplacez-la par 131070:
Sauvegarder et quitter.
Redémarrez maintenant Elasticsearch pour charger les modifications:
Suivez ensuite la sous-section précédente pour vérifier que les limites ont été augmentées.
Veillez à répéter cette étape sur l’un de vos serveurs Elasticsearch qui nécessitent des limites de descripteur de fichier plus élevées.
Configurer les nœuds maîtres et ceux de données dédiés (facultatif)
Il existe deux types courants de nœuds Elasticsearch: maître et données. Les nœuds maîtres effectuent des actions à l’échelle du cluster, telles que la gestion des index et la détermination des nœuds de données devant stocker des fragments de données particuliers. Les nœuds de données contiennent des fragments de vos documents indexés et gèrent les opérations CRUD, de recherche et d’agrégation. En règle générale, les nœuds de données consomment une quantité importante de CPU, de mémoire et d’E / S.
Par défaut, chaque nœud Elasticsearch est configuré pour être un nœud de données et eligible en tant que « maitre », ce qui signifie qu’il stocke des données (et effectue des opérations gourmandes en ressources) et peut être choisi en tant que nœud maître. Pour un petit groupe, c’est généralement bien. Toutefois, un grand cluster Elasticsearch doit être configuré avec des nœuds maîtres dédiés afin que la stabilité du nœud maître ne puisse pas être compromise par un travail intensif des nœuds de données.
Comment configurer des nœuds maîtres dédiés
Avant de configurer des nœuds maîtres dédiés, assurez-vous que votre cluster aura au moins 3 nœuds éligibles au statut de maître. Ceci est important pour éviter une situation de scission du cerveau, ce qui peut entraîner des incohérences dans vos données en cas de défaillance du réseau.
Pour configurer un noeud maître dédié, éditez la configuration Elasticsearch du noeud:
Ajoutez les deux lignes suivantes:
La première ligne, node.master: true, spécifie que le nœud est éligible au statut de maître et qu’il s’agit en fait du paramètre par défaut. La deuxième ligne, node.data: false, empêche le nœud de devenir un nœud de données.
Sauvegarder et quitter.
Maintenant, redémarrez le nœud Elasticsearch pour appliquer les modifications:
Veillez à répéter cette étape sur vos autres nœuds maîtres dédiés.
Vous pouvez interroger le cluster pour savoir quels nœuds sont configurés en tant que nœuds maîtres dédiés avec cette commande: curl -XGET ‘http://localhost:9200/_cluster/state?Pretty‘. Tous les nœuds avec data: false et master: true sont des nœuds maîtres dédiés.
Comment configurer des nœuds de données dédiés
Pour configurer un noeud de données dédié (un noeud de données qui n’est pas éligible au niveau maître), éditez la configuration Elasticsearch du noeud:
Ajoutez les deux lignes suivantes:
La première ligne, node.master: false, spécifie que le nœud n’est pas éligible au statut de maître. La deuxième ligne, node.data: true, est le paramètre par défaut qui permet au nœud d’être un nœud de données.
Sauvegarder et quitter.
Maintenant, redémarrez le nœud Elasticsearch pour appliquer les modifications:
Veillez à répéter cette étape sur vos autres nœuds de données dédiés.
Vous pouvez interroger le cluster pour savoir quels nœuds sont configurés en tant que nœuds de données dédiés avec cette commande: curl -XGET ‘http://localhost:9200/_cluster/state?Pretty’. Tout nœud qui répertorie master: false et ne répertorie pas data: false sont des nœuds de données dédiés.
Configurer les nœuds master minimum
Lors de l’exécution d’un cluster Elasticsearch, il est important de définir le nombre minimal de noeuds éligibles au statut de maître devant être en cours d’exécution pour que le cluster fonctionne normalement, ce que l’on appelle parfois quorum. Cela permet de garantir la cohérence des données dans l’éventualité où un ou plusieurs nœuds perdent la connectivité avec le reste du cluster, évitant ainsi une situation dite de « cerveau divisé« .
Pour calculer le nombre minimum de nœuds principaux que votre cluster devrait avoir, calculez n / 2 + 1, où n est le nombre total de nœuds « éligibles au maître » de votre cluster sain, puis arrondissez le résultat à l’entier le plus proche. Par exemple, pour un cluster à 3 nœuds, le quorum est 2.
Remarque: veillez à inclure tous les nœuds éligibles au maître dans votre calcul de quorum, y compris tous les nœuds de données éligibles au maître (paramètre par défaut).
Le paramètre de nœuds principaux minimum peut être défini de manière dynamique, via l’API HTTP Elasticsearch. Pour ce faire, exécutez cette commande sur n’importe quel nœud (remplacez le nombre en surbrillance par votre quorum):
Remarque: Cette commande est un paramètre « persistant« , ce qui signifie que le paramètre du nombre de nœuds master minimum survivra au redémarrage complet du cluster et écrasera la valeur présente dans le fichier de configuration Elasticsearch. Ce paramètre peut également être spécifié en tant que discovery.zen.minimum_master_nodes: 2 dans /etc/elasticsearch.yml si vous ne l’avez pas encore défini de manière dynamique.
Si vous souhaitez vérifier ce paramètre ultérieurement, vous pouvez exécuter cette commande:
Comment accéder à Elasticsearch
Vous pouvez accéder à l’API HTTP Elasticsearch en envoyant des requête à l’adresse IP du VPN de l’un des nœuds ou, comme indiqué dans le tutoriel, en envoyant des requête en localhost à partir de l’un des nœuds.
Votre cluster Elasticsearch est accessible aux serveurs clients via l’adresse IP VPN de l’un des nœuds, ce qui signifie que les serveurs clients doivent également faire partie du VPN.
Si vous avez d’autres logiciels à connecter à votre cluster, tels que Kibana ou Logstash, vous pouvez généralement configurer la connexion en fournissant à votre application les adresses IP VPN d’un ou de plusieurs nœuds Elasticsearch.
Conclusion
Votre cluster Elasticsearch doit fonctionner dans un état sain et configuré avec quelques optimisations de base!
Elasticsearch comporte de nombreuses autres options de configuration non décrites ici, telles que les paramètres d’index, de fragment et de réplicas. Il est recommandé de revoir votre configuration ultérieurement, ainsi que la documentation officielle, pour vous assurer que votre cluster est configuré pour répondre à vos besoins.