Les meilleures pratiques de recherche Elasticsearch et les performances croissantes

Les meilleures pratiques de recherche Elasticsearch et les performances croissantes
Dans cet article, nous essaierons de collecter les meilleures pratiques et aussi ce que les choses à éviter lorsque vous travaillez avec Elasticsearch et l'alimentation des données. De cette façon, nous saurons ce que nous devons faire attention avant même de commencer à travailler avec cet excellent moteur de recherche.

Meilleures pratiques de recherche élastique

Nous allons commencer à travailler avec les meilleures pratiques à suivre avec Elasticsearch et quels problèmes il peut créer lorsque nous éviterons ces points. Commençons.

Définissez toujours les mappages ES

Une chose que les es peuvent sûrement faire est de travailler sans mappages. Ainsi, lorsque vous commencez à nourrir les données JSON à votre index ES, il iratera sur les champs des données et créera une cartographie appropriée. Cela semble directement et facile à mesure que ES sélectionne le type de données lui-même. En fonction de vos données, vous pourriez avoir besoin d'un champ pour être de type de données spécifique.

Par exemple, supposons que vous indexez le document suivant:


"id": 1,
"Titre": "Installer Elasticsearch sur Ubuntu",
"lien": "https: // linuxhint.com / install-elasticsearch-ubuntu / ",
"Date": "2018-03-25"

De cette façon, Elasticsearch marquera le champ «Date» en tant que type «date». Mais lorsque vous indexez le document suivant:


"id": 1,
"Titre": "ES Best Practices and Performance",
"Date": "en attente"

Cette fois, le type de champ de date a été modifié et ES lancera une erreur et ne permettra pas d'indexer votre document. Pour faciliter les choses, vous pouvez indexer quelques documents, voir quels champs sont indexés par ES et saisir le mappage de cette URL:

Get / index_name / doc_type / _mapping

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

Drapeaux de production

Le nom de cluster par défaut que commence est appelé Elasticsearch. Lorsque vous avez beaucoup de nœuds dans votre cluster, c'est une bonne idée de garder les drapeaux de dénomination aussi cohérents que possible, comme:

grappe.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 comptent également beaucoup. Supposons que certains des nœuds dans un redémarrage en grappe 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 gardera tous les grappes dans un état cohérent.

passerelle.Recover_after_nodes: 10

Il est également utile lorsque vous dites au cluster à l'avance le nombre de nœuds sera présent dans le cluster et combien il en aura le temps de récupération:

passerelle.attendu_nodes: 20
passerelle.Recover_after_time: 7m

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

Provisioning des capacités

Il est important de savoir combien d'espace prendra vos données et le taux auquel il se déroule 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 également.

Bien sûr, il n'y a pas de directives spécifiques pour atteindre les chiffres nécessaires, mais nous pouvons prendre quelques mesures qui nous fournissent une bonne idée. L'une des étapes sera de simuler le cas d'utilisation. Faites un cluster ES et nourrissez-le avec presque le même taux de données que vous vous attendez avec votre configuration de production. Le concept de Démarrez grand et échelle peut également vous aider à être cohérent sur la quantité d'espace nécessaire.

Grands modèles

Lorsque vous définissez de grands modèles indexés, vous aurez toujours face à des problèmes liés à la synchronisation du modèle à travers 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 Gardez les modèles comme dynamiques. Les modèles dynamiques mettent automatiquement à jour les mappages de champs en fonction des mappages que nous avons définis plus tôt et des nouveaux champs. Notez qu'il n'y a pas de substitut pour garder les modèles aussi petits que possible.

2using mlockall sur les serveurs Ubuntu

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

amorcer.MLOCKALL: Vrai

Dans l'ES V5.Versions x +, cette propriété a changé pour:

amorcer.Memory_lock: true

Si vous utilisez cette propriété, assurez-vous simplement que vous fournissez ES avec une mémoire tas assez grande en utilisant le -Dxmx option ou Es_heap_size.

Minimiser les mises à jour de la cartographie

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

indices.grappe.send_refresh_mapping: false

Lorsque la demande de mise à jour du modèle est en attente en attente pour le nœud maître et qu'il envoie des données avec l'ancien mappage aux nœuds, il doit également envoyer une demande de mise à jour plus tard à tous les nœuds. Cela peut rendre les choses lentement. Lorsque nous définissons la propriété ci-dessus sur FALS. Notez que cela n'est utile que si vous apportez beaucoup de modifications à vos mappages régulièrement.

Pool de threads optimisé

Les nœuds ES ont de nombreux pools de threads afin d'améliorer la façon dont les threads sont gérés dans un nœud. Mais il y a des limites à 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:

filiale.en gros.queue_size: 2000

Cela informe le nombre de demandes dans un fragment qui peut être mis en file d'attente pour exécution dans le nœud lorsqu'il n'y a pas de thread disponible pour traiter la demande. Si le nombre de tâches va plus haut que cette valeur, vous obtiendrez un RemoteTransportException. 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 lancée.

Conclusion

Dans cette leçon, nous avons examiné comment nous pouvons améliorer les performances de la recherche sur Elastics en évitant les erreurs communes et pas si courantes que les gens font. Lire plus d'articles Elasticsearch sur Linuxhint.