Comment configurer un cluster de production Elasticsearch sur Ubuntu 14.04

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 tutoriel vous montrera comment installer et configurer un cluster de production Elasticsearch sur Ubuntu 14.04, dans un environnement de serveur cloud.

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. Si vous souhaitez utiliser Ansible pour déployer un cluster Elasticsearch, suivez ce tutoriel: https://www.digitalocean.com/community/tutorials/how-to-use-ansible-to-set-up-a-production-elasticsearch- cluster [Comment utiliser Ansible pour configurer un cluster Elasticsearch de production].

Conditions préalables

Vous devez disposer d’au moins trois serveurs Ubuntu 14.04 pour pouvoir suivre ce didacticiel, 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.

Si vous préférez utiliser CentOS à la place, consultez ce tutoriel: https://www.digitalocean.com/community/tutorials/how-to-set-up-a-production-elasticsearch-clus-on-centos-7 [ Comment configurer un cluster de production Elasticsearch sur CentOS 7]

Hypothèses

Ce tutoriel suppose que vos serveurs utilisent un VPN semblable à celui décrit ci-dessous: https://www.digitalocean.com/community/tutorials/how-to-use-ansible-and-tinc-vpn-to-secure-your- server-infrastructure [Comment utiliser Ansible et Tinc VPN pour sécuriser votre infrastructure de serveur]. 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 être sur le 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 non fiables.

Nous nous référerons 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», comme décrit dans le tutoriel lié ci-dessus.

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:

sudo add-apt-repository -y ppa:webupd8team/java

Mettez à jour votre base de données de paquets apt:

sudo apt-get update

Installez la dernière version stable d’Oracle Java 8 avec cette commande (et acceptez le contrat de licence qui apparaît):

sudo apt-get -y install oracle-java8-installer

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:

wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -

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 votre base de données de paquets apt:

sudo apt-get update

Installez Elasticsearch avec cette commande:

sudo apt-get -y install elasticsearch

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. Terminez-vous ces étapes sur tous vos serveurs Elasticsearch.

Ouvrez le fichier de configuration Elasticsearch pour le modifier:

sudo vi /etc/elasticsearch/elasticsearch.yml

Les sections suivantes expliqueront comment la configuration doit être modifiée.

Lier à une adresse IP ou une interface VPN

Vous souhaiterez restreindre l’accès extérieur à votre instance Elasticsearch afin que les personnes extérieures 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 de 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 spécifiant + network.host +, décomprimez-la et remplacez sa valeur par l’adresse IP VPN du serveur respectif (par exemple, + 10.0.0.1 + pour node01) ou nom d’interface. Notre interface VPN étant nommée «tun0» sur tous nos serveurs, nous pouvons configurer tous nos serveurs avec la même ligne:

elasticsearch.yml - réseau.host

network.host: [__, _local_]

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.

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 spécifiant + cluster.name +, décommentez-la et remplacez-la par le nom de cluster souhaité. Dans ce tutoriel, nous nommerons notre cluster «production»:

elasticsearch.yml - cluster.name

cluster.name:

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 tutoriel, nous allons définir chaque nom de noeud sur le nom d’hôte du serveur en utilisant la variable d’environnement + $ {HOSTNAME} +:

elasticsearch.yml - node.name

node.name: ${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 les commentaires + node.name + mis en commentaire, si cela ne vous dérange pas de nommer vos nœuds de manière aléatoire.

Définir les hôtes de découverte

Ensuite, vous devrez configurer une liste initiale de nœuds qui seront contactés pour découvrir 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 des adresses IP VPN respectives de + 10.0.0.1 +, + 10.0.0.2 + et `+10.0. 0.3 + `, vous pouvez utiliser cette ligne:

elasticsearch.yml - héberge par adresse IP

discovery.zen.ping.unicast.hosts: ["", "", ""]

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:

elasticsearch.yml - hôtes par nom

discovery.zen.ping.unicast.hosts: ["", "", ""]

Sauvegarder et quitter

Vos serveurs sont maintenant configurés pour former un cluster Elasticsearch de base. Vous voudrez mettre à jour d’autres paramètres, mais nous y arriverons une fois que nous aurons vérifié que le cluster fonctionne.

Enregistrez et quittez + elasticsearch.yml +.

Démarrer Elasticsearch

Maintenant démarrez Elasticsearch:

sudo service elasticsearch restart

Ensuite, exécutez cette commande pour démarrer Elasticsearch au démarrage:

sudo update-rc.d elasticsearch defaults 95 10

Assurez-vous de répéter ces étapes (https://www.digitalocean.com/community/tutorials/how-to-set-up-a-production-elasticsearch-clus-on-ubuntu-14-04#configure-elasticsearch-cluster [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 qu’il fonctionne correctement. Vous pouvez le faire en interrogeant Elasticsearch à n’importe quel nœud Elasticsearch.

À partir de l’un de vos serveurs Elasticsearch, exécutez cette commande pour imprimer l’état du cluster:

curl -XGET 'http://localhost:9200/_cluster/state?pretty'

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:

Cluster State:{
 "cluster_name" : "production",
 "version" : 36,
 "state_uuid" : "MIkS5sk7TQCl31beb45kfQ",
 "master_node" : "k6k2UObVQ0S-IFoRLmDcvA",
 "blocks" : { },
 "nodes" : {
   "Jx_YC2sTQY6ayACU43_i3Q" : {
     "name" : "node02",
     "transport_address" : "10.0.0.2:9300",
     "attributes" : { }
   },
   "k6k2UObVQ0S-IFoRLmDcvA" : {
     "name" : "node01",
     "transport_address" : "10.0.0.1:9300",
     "attributes" : { }
   },
   "kQgZZUXATkSpduZxNwHfYQ" : {
     "name" : "node03",
     "transport_address" : "10.0.0.3:9300",
     "attributes" : { }
   }
 },
...

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.

Nous examinerons ensuite 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:

sudo vi /etc/elasticsearch/elasticsearch.yml

Recherchez la ligne qui spécifie + bootstrap.mlockall + et décommentez-la:

elasticsearch.yml - bootstrap.mlockall

bootstrap.mlockall: true

Sauvegarder et quitter.

Ensuite, ouvrez le fichier + / etc / default / elasticsearch + pour le modifier:

sudo vi /etc/default/elasticsearch

Tout d’abord, recherchez + ES_HEAP_SIZE +, décommentez-le et configurez-le à environ 50% de votre mémoire disponible. Par exemple, si vous avez environ 4 Go gratuits, vous devez définir cette valeur sur 2 Go (+ 2g +):

/ etc / default / elasticsearch - ES_HEAP_SIZE

ES_HEAP_SIZE=

Ensuite, recherchez et décommentez + MAX_LOCKED_MEMORY = unlimited. Cela devrait ressembler à ça quand vous aurez fini:

/ etc / default / elasticsearch - MAX_LOCKED_MEMORY

MAX_LOCKED_MEMORY=unlimited

Sauvegarder et quitter.

Redémarrez maintenant Elasticsearch pour mettre en place les modifications:

sudo service elasticsearch restart

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 nœuds Elasticsearch, exécutez cette commande à partir de n’importe quel nœud:

curl http://localhost:9200/_nodes/process?pretty

Chaque noeud doit avoir une ligne qui dit +" mlockall ": true +, ce qui indique que le verrouillage de la mémoire est activé et fonctionne:

Nodes process output:...
 "nodes" : {
   "kQgZZUXATkSpduZxNwHfYQ" : {
     "name" : "es03",
     "transport_address" : "10.0.0.3:9300",
     "host" : "10.0.0.3",
     "ip" : "10.0.0.3",
     "version" : "2.2.0",
     "build" : "8ff36d1",
     "http_address" : "10.0.0.3:9200",
     "process" : {
       "refresh_interval_in_millis" : 1000,
       "id" : 1650,

     }
...

Si + mlockall + est défini sur 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. Pour cela, utilisez la commande + ps + pour répertorier tous les processus appartenant à l’utilisateur + elasticsearch +:

ps -u elasticsearch

Vous devriez voir une sortie qui ressemble à ceci. Le nombre dans la première colonne est le PID de votre processus Elasticsearch (java):

Output:  PID TTY          TIME CMD
?        00:00:10 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):

cat /proc//limits | grep 'Max open files'
OutputMax open files            65535                65535                files

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:

sudo vi /etc/default/elasticsearch

Trouvez + MAX_OPEN_FILES +, décommentez-le et fixez-le à la limite souhaitée. Par exemple, si vous souhaitez une limite de 128 000 descripteurs, modifiez-la en «+ 131070 +»:

/ etc / default / elasticsearch - MAX_OPEN_FILES

MAX_OPEN_FILES=

Sauvegarder et quitter.

Redémarrez maintenant Elasticsearch pour mettre en place les modifications:

sudo service elasticsearch restart

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 données dédiés (facultatif)

Il existe deux types courants de nœuds Elasticsearch: * master * et * data *. 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 «maître», ce qui signifie qu’ils stockent des données (et effectuent des opérations gourmandes en ressources) et ont le potentiel d’être élus en tant que nœud maître. Pour un petit groupe, c’est généralement bien. Cependant, 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 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é, modifiez la configuration Elasticsearch du noeud:

sudo vi /etc/elasticsearch/elasticsearch.yml

Ajoutez les deux lignes suivantes:

elasticsearch.yml - maître dédié

node.master: true
node.data: false

La première ligne, + node.master: true +, spécifie que le nœud est éligible pour le 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:

sudo service elasticsearch restart

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 à l’aide de cette commande: + curl -XGET 'http: // localhost: 9200 / _cluster / state? Pretty' +. Tout nœud 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 nœud de données dédié (un nœud de données non maître), modifiez la configuration Elasticsearch du nœud:

sudo vi /etc/elasticsearch/elasticsearch.yml

Ajoutez les deux lignes suivantes:

elasticsearch.yml - données dédiées

node.master: false
node.data: true

La première ligne, + node.master: false +, spécifie que le nœud n’est pas éligible au 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:

sudo service elasticsearch restart

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 liste + master: false + et * ne * liste pas + data: false + sont des nœuds de données dédiés.

Configurer les nœuds principaux minimum

Lorsque vous exécutez un cluster Elasticsearch, il est important de définir le nombre minimal de noeuds éligibles au maître devant être exécutés pour que le cluster fonctionne normalement, ce qui est parfois appelé * quorum *. Cela permet d’assurer 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 au plus proche. entier. Par exemple, pour un cluster à 3 nœuds, le quorum est 2.

Le paramètre minimum de nœuds principaux 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):

curl -XPUT localhost:9200/_cluster/settings?pretty -d '{
   "persistent" : {
       "discovery.zen.minimum_master_nodes" :
   }
}'
Output:{
 "acknowledged" : true,
 "persistent" : {
   "discovery" : {
     "zen" : {
       "minimum_master_nodes" : "2"
     }
   }
 },
 "transient" : { }
}

Si vous souhaitez vérifier ce paramètre ultérieurement, vous pouvez exécuter cette commande:

curl -XGET localhost:9200/_cluster/settings?pretty

Comment accéder à Elasticsearch

Vous pouvez accéder à l’API HTTP Elasticsearch en envoyant des demandes à l’adresse IP du VPN de l’un des nœuds ou, comme indiqué dans le tutoriel, en envoyant des demandes à + ​​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 propose de nombreuses autres options de configuration qui n’ont pas été abordées ici, telles que les paramètres d’index, de partition et de réplication. 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.

Related