Recherche élastique

Meilleures pratiques Elasticsearch et augmentation des performances

Meilleures pratiques Elasticsearch et augmentation des performances
Dans cet article, nous essaierons de collecter les meilleures pratiques et également les choses à éviter lorsque vous travaillez avec Elasticsearch et que vous y alimentez des données. De cette façon, nous saurons de quoi nous devons nous occuper avant même de commencer à travailler avec cet excellent moteur de recherche.

Bonnes pratiques Elasticsearch

Nous commencerons à travailler avec les meilleures pratiques à suivre avec Elasticsearch et les problèmes que cela peut créer lorsque nous évitons ces points. Commençons.

Toujours définir les mappages ES

Une chose que ES peut sûrement faire est de travailler sans mappages. Ainsi, lorsque vous commencez à fournir des données JSON à votre index ES, il parcourt les champs de données et crée un mappage approprié. Cela semble direct et facile car ES sélectionne le type de données lui-même. En fonction de vos données, vous pourriez avoir besoin qu'un champ soit d'un type de données spécifique.

Par exemple, supposons que vous indexiez le document suivant :


"identifiant" : 1,
"title" : "Installer ElasticSearch sur Ubuntu",
"lien" : "https://linuxhint.com/install-elasticsearch-ubuntu/",
"date" : "2018-03-25"

De cette façon, Elasticsearch marquera le champ "date" comme type "date". Mais lorsque vous indexez le document suivant :


"identifiant" : 1,
"title" : "Bonnes pratiques et performances ES",
"date" : "En attente"

Cette fois, le type du champ de date a été modifié et ES renverra une erreur et ne permettra pas l'indexation de votre document. Pour faciliter les choses, vous pouvez indexer quelques documents, voir quels champs sont indexés par ES et récupérer le mappage à partir de cette URL :

GET /nom_index/type_doc/_mapping

De cette façon, vous n'aurez pas non plus à construire le mappage complet.

Drapeaux de production

Le nom de cluster par défaut démarré par ES est appelé recherche élastique. Lorsque vous avez beaucoup de nœuds dans votre cluster, c'est une bonne idée de garder les indicateurs de nommage aussi cohérents que possible, comme :

groupe.nom : app_es_production
nœud.nom : app_es_node_001

En dehors de cela, les paramètres de récupération des nœuds sont également très importants. Supposons que certains nœuds d'un cluster redémarrent en raison d'une défaillance et que certains nœuds redémarrent un peu après d'autres nœuds. Pour garder les données cohérentes entre tous ces nœuds, nous devrons exécuter un programme de cohérence qui maintiendra tous les clusters dans un état cohérent.

passerelle.récupérer_après_nodes : 10

Il est également utile d'indiquer au cluster à l'avance combien de nœuds seront présents dans le cluster et de combien de temps de récupération ils auront besoin :

passerelle.attendu_nœuds : 20
passerelle.recovery_after_time : 7 m

Avec la bonne configuration, une récupération qui aurait pris des heures peut prendre aussi peu qu'une minute et peut faire économiser beaucoup d'argent à n'importe quelle entreprise.

Provisionnement de capacité

Il est important de savoir combien d'espace vos données prendront et la vitesse à laquelle elles entrent dans Elasticsearch, car cela décidera de la quantité de RAM dont vous aurez besoin sur chacun des nœuds du cluster et du nœud maître.

Bien sûr, il n'y a pas de directives spécifiques pour atteindre les chiffres nécessaires, mais nous pouvons prendre certaines mesures qui nous donnent une bonne idée. L'une des étapes consistera à simuler le cas d'utilisation. Créez un cluster ES et alimentez-le avec presque le même débit de données que celui auquel vous vous attendriez avec votre configuration de production. La notion de commencer grand et réduire peut également vous aider à être cohérent quant à l'espace nécessaire.

Grands modèles

Lorsque vous définissez de grands modèles indexés, vous rencontrerez toujours des problèmes liés à la synchronisation du modèle sur vos différents nœuds du cluster. Notez toujours que le modèle devra être redéfini chaque fois qu'un changement de modèle de données se produit. C'est une bien meilleure idée de garder les modèles aussi dynamiques. Les modèles dynamiques mettent automatiquement à jour les mappages de champs en fonction des mappages que nous avons définis précédemment et des nouveaux champs. Notez que rien ne remplace le fait de garder les modèles aussi petits que possible.

2Utiliser mlockall sur les serveurs Ubuntu

Linux utilise le processus d'échange lorsqu'il a besoin de mémoire pour de nouvelles pages. L'échange ralentit les choses car les disques sont plus lents que la mémoire. le mlockall La propriété dans la configuration ES dit à ES de ne pas échanger ses pages hors de la mémoire même si elles ne sont pas nécessaires pour le moment. Cette propriété peut être définie dans le fichier YAML :

amorcer.mlockall : vrai

Dans l'ES v5.x+ versions, cette propriété est devenue :

amorcer.memory_lock : vrai

Si vous utilisez cette propriété, assurez-vous simplement que vous fournissez à ES une mémoire de tas suffisamment grande en utilisant le -DXmx option ou ES_HEAP_SIZE.

Minimiser les mises à jour de mappage

Les performances d'un cluster sont légèrement affectées chaque fois que vous effectuez des demandes de mise à jour de mappage sur votre cluster ES. Si vous ne pouvez pas contrôler cela et que vous souhaitez toujours mettre à jour les mappages, vous pouvez utiliser une propriété dans le fichier de configuration ES YAML :

indices.groupe.send_refresh_mapping : faux

Lorsque la demande de mise à jour du modèle est en file d'attente pour le nœud maître et qu'elle envoie des données avec l'ancien mappage aux nœuds, elle doit également envoyer une demande de mise à jour ultérieurement à tous les nœuds. Cela peut ralentir les choses. Lorsque nous définissons la propriété ci-dessus sur false, cela signifie qu'une mise à jour a été effectuée sur le mappage et qu'il n'enverra pas la demande de mise à jour aux nœuds. Notez que cela n'est utile que si vous apportez régulièrement de nombreuses modifications à vos mappages.

Pool de threads optimisé

Les nœuds ES ont de nombreux pools de threads afin d'améliorer la gestion des threads au sein d'un nœud. Mais il y a des limites sur la quantité de données que chaque thread peut prendre en charge. Pour garder une trace de cette valeur, nous pouvons utiliser une propriété ES :

pool de threads.masse.queue_size : 2000

Cela informe ES du nombre de requêtes dans une partition qui peuvent être mises en file d'attente pour exécution dans le nœud lorsqu'il n'y a pas de thread disponible pour traiter la requête. Si le nombre de tâches dépasse cette valeur, vous obtiendrez un Exception de transport à distance. Plus cette valeur est élevée, plus la quantité d'espace de tas sera nécessaire sur votre machine de nœud et le tas JVM sera également consommé. De plus, vous devez garder votre code prêt au cas où cette exception serait levée.

Conclusion

Dans cette leçon, nous avons examiné comment améliorer les performances d'Elasticsearch en évitant les erreurs courantes et moins courantes que les gens commettent. Lire plus d'articles Elasticsearch sur LinuxHint.

Meilleurs émulateurs de console de jeu pour Linux
Cet article répertorie les logiciels d'émulation de console de jeu populaires disponibles pour Linux. L'émulation est une couche de compatibilité logi...
Meilleures distributions Linux pour les jeux en 2021
Le système d'exploitation Linux a parcouru un long chemin depuis son apparence originale, simple et basée sur le serveur. Ce système d'exploitation s'...
Comment capturer et diffuser votre session de jeu sur Linux
Dans le passé, jouer à des jeux n'était considéré qu'un passe-temps, mais avec le temps, l'industrie du jeu a connu une croissance énorme en termes de...