Comment configurer un cluster de production Elasticsearch sur CentOS 7

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 CentOS 7, 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 CentOS 7 pour 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 Ubuntu à la place, consultez ce didacticiel: https://www.digitalocean.com/community/tutorials/how-to-set-up-a-production-elasticsearch-clus-ubuntu-14- 04 [Comment configurer un cluster Elasticsearch de production sur Ubuntu 14.04]

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é, tel que DigitalOcean Private Networking, vous devez utiliser un VPN pour protéger Elasticsearch contre les 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. Suivre les étapes décrites dans cette section signifie que vous acceptez le contrat de licence binaire Oracle pour Java SE.

Effectuez cette étape sur tous vos serveurs Elasticsearch.

Accédez à votre répertoire personnel et téléchargez le fichier JPM RPM JDK Oracle Java 8 (mise à jour 73, la plus récente au moment de la rédaction de cet article) avec ces commandes:

cd ~
wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/8u73-b02/jdk-8u73-linux-x64.rpm"

Puis installez le RPM avec cette commande yum (si vous avez téléchargé une version différente, remplacez le nom du fichier ici):

sudo yum -y localinstall jdk-8u73-linux-x64.rpm

Maintenant, Java doit être installé dans + / usr / java / jdk1.8.0_73 / jre / bin / java +, et lié à partir de + / usr / bin / java +.

Vous pouvez supprimer le fichier archive que vous avez téléchargé précédemment:

rm ~/jdk-8u73-linux-x64.rpm

Maintenant que Java 8 est installé, installons ElasticSearch.

Installer Elasticsearch

Elasticsearch peut être installé avec un gestionnaire de packages en ajoutant le référentiel de packages Elastic.

Exécutez la commande suivante pour importer la clé GPG publique Elasticsearch dans rpm:

sudo rpm --import http://packages.elastic.co/GPG-KEY-elasticsearch

Créez un nouveau fichier de référentiel yum pour Elasticsearch. Notez qu’il s’agit d’une seule commande:

echo '[elasticsearch-2.x]
name=Elasticsearch repository for 2.x packages
baseurl=http://packages.elastic.co/elasticsearch/2.x/centos
gpgcheck=1
gpgkey=http://packages.elastic.co/GPG-KEY-elasticsearch
enabled=1
' | sudo tee /etc/yum.repos.d/elasticsearch.repo

Installez Elasticsearch avec cette commande:

sudo yum -y install elasticsearch

Veillez à répéter cette étape 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 systemctl start elasticsearch

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

sudo systemctl enable elasticsearch

Veillez à répéter ces étapes (Configure 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 / sysconfig / elasticsearch + pour le modifier:

sudo vi /etc/sysconfig/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.

Le dernier fichier à éditer est le fichier unité Elasticsearch systemd. Ouvrez-le pour l’édition:

sudo vi /usr/lib/systemd/system/elasticsearch.service

Trouver et décommenter + LimitMEMLOCK = infinity +. Cela devrait ressembler à ça quand vous aurez fini:

/usr/lib/systemd/system/elasticsearch.service - LimitMEMLOCK

LimitMEMLOCK=infinity

Sauvegarder et quitter.

Maintenant, rechargez le démon systemctl et redémarrez Elasticsearch pour mettre en place les modifications:

sudo systemctl daemon-reload
sudo systemctl restart elasticsearch

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 + / usr / lib / systemd / system / elasticsearch.service +:

sudo vi /usr/lib/systemd/system/elasticsearch.service

Recherchez + LimitNOFILE + et réglez-le sur la limite souhaitée. Par exemple, si vous souhaitez une limite de 128 000 descripteurs, modifiez-la en «+ 131070 +»:

/usr/lib/systemd/system/elasticsearch.service - LimitNOFILE

LimitNOFILE=

Sauvegarder et quitter.

Maintenant, rechargez le démon systemctl et redémarrez Elasticsearch pour mettre en place les modifications:

sudo systemctl daemon-reload
sudo systemctl restart elasticsearch

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 systemctl restart elasticsearch

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 systemctl restart elasticsearch

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

Lors de l’exécution d’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 un autre logiciel à connecter à votre cluster, tel 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.