paint-brush
4 défis de performances Elasticsearch et comment les résoudrepar@rocksetcloud
4,113 lectures
4,113 lectures

4 défis de performances Elasticsearch et comment les résoudre

par Rockset5m2024/05/16
Read on Terminal Reader

Trop long; Pour lire

Dans ce blog, nous passons en revue les solutions aux problèmes courants de performances d'Elasticsearch à grande échelle, notamment l'indexation lente, la vitesse de recherche, le dimensionnement des partitions et des index et la multilocation.
featured image - 4 défis de performances Elasticsearch et comment les résoudre
Rockset HackerNoon profile picture


Faire évoluer Elasticsearch

Elasticsearch est un moteur de recherche et d'analyse NoSQL facile à utiliser pour l'analyse de journaux, la recherche de texte, l'analyse en temps réel et bien plus encore. Cela dit, Elasticsearch est un système distribué complexe avec de nombreux leviers à actionner pour obtenir des performances optimales.


Dans ce blog, nous passons en revue les solutions aux problèmes courants de performances d'Elasticsearch à grande échelle, notamment l'indexation lente, la vitesse de recherche, le dimensionnement des partitions et des index et la multilocation. De nombreuses solutions proviennent d'entretiens et de discussions avec des responsables de l'ingénierie et des architectes qui ont une expérience pratique de l'exploitation du système à grande échelle.

Comment puis-je améliorer les performances d'indexation dans Elasticsearch ?

Lorsque vous traitez des charges de travail ayant un débit d'écriture élevé, vous devrez peut-être régler Elasticsearch pour augmenter les performances d'indexation. Nous proposons plusieurs bonnes pratiques pour disposer de ressources adéquates pour l'indexation afin que l'opération n'ait pas d'impact sur les performances de recherche dans votre application :


  • Augmentez l' intervalle d'actualisation : Elasticsearch rend les nouvelles données disponibles pour la recherche en actualisant l'index. Les actualisations sont configurées pour se produire automatiquement toutes les secondes lorsqu'un index a reçu une requête au cours des 30 dernières secondes. Vous pouvez augmenter l'intervalle d'actualisation pour réserver davantage de ressources pour l'indexation.


  • Utiliser l' API Bulk : lors de l'ingestion de données à grande échelle, le temps d'indexation à l'aide de l'API Update peut prendre des semaines . Dans ces scénarios, vous pouvez accélérer l'indexation des données de manière plus efficace en termes de ressources à l'aide de l'API Bulk. Même avec l'API Bulk, vous souhaitez connaître le nombre de documents indexés et la taille globale de la requête groupée pour vous assurer qu'elle n'entrave pas les performances du cluster. Elastic recommande d'évaluer la taille du volume et, en règle générale, est de 5 à 15 Mo/requête groupée .


  • Augmenter la taille du tampon d'index : vous pouvez augmenter la limite de mémoire pour les demandes d'indexation en attente au-dessus de la valeur par défaut de 10 % du tas. Cela peut être conseillé pour les charges de travail d'indexation lourdes, mais peut avoir un impact sur d'autres opérations gourmandes en mémoire.


  • Désactiver la réplication : vous pouvez définir la réplication sur zéro pour accélérer l'indexation, mais cela n'est pas conseillé si Elasticsearch est le système d'enregistrement de votre charge de travail.


  • Limitez les insertions sur place et les mutations de données : les insertions, mises à jour et suppressions nécessitent la réindexation de documents entiers. Si vous diffusez des données CDC ou transactionnelles dans Elasticsearch, vous souhaiterez peut-être envisager de stocker moins de données, car il y a alors moins de données à réindexer.


  • Simplifiez la structure des données : gardez à l'esprit que l'utilisation de structures de données telles que des objets imbriqués augmentera les écritures et les index. En simplifiant le nombre de champs et la complexité du modèle de données, vous pouvez accélérer l'indexation.

Que dois-je faire pour augmenter ma vitesse de recherche dans Elasticsearch ?

Lorsque l'exécution de vos requêtes prend trop de temps, cela peut signifier que vous devez simplifier votre modèle de données ou supprimer la complexité des requêtes. Voici quelques domaines à considérer :


  • Créer unindex composite : fusionnez les valeurs de deux champs de faible cardinalité pour créer un champ de cardinalité élevée qui peut être facilement recherché et récupéré. Par exemple, vous pouvez fusionner un champ avec le code postal et le mois, s'il s'agit de deux champs sur lesquels vous filtrez généralement pour votre requête.


  • Activer le routage personnalisé des documents : Elasticsearch diffuse une requête à toutes les partitions pour renvoyer un résultat. Avec le routage personnalisé, vous pouvez déterminer sur quelle partition résident vos données pour accélérer l'exécution des requêtes. Cela dit, vous devez être à l'affût des points chauds lorsque vous adoptez un routage personnalisé.


  • Utilisez le type de champ de mot-clé pour les recherches structurées : lorsque vous souhaitez filtrer en fonction du contenu, tel qu'un identifiant ou un code postal, il est recommandé d'utiliser le type de champ de mot-clé plutôt que le type entier ou d'autres types de champ numérique pour une récupération plus rapide.


  • Éloignez-vous des objets parent-enfant et imbriqués : les relations parent-enfant constituent une bonne solution de contournement au manque de prise en charge des jointures dans Elasticsearch et ont contribué à accélérer l'ingestion et à limiter la réindexation. Finalement, les organisations atteignent des limites de mémoire avec cette approche. Lorsque cela se produit, vous pourrez accélérer les performances des requêtes en effectuant une dénormalisation des données.

Comment dimensionner les partitions et les index Elasticsearch pour les adapter à l'échelle ?

De nombreux défis de mise à l'échelle avec Elasticsearch se résument à la stratégie de partitionnement et d'indexation. Il n’existe pas de stratégie universelle quant au nombre de fragments que vous devez avoir ou à la taille de vos fragments. La meilleure façon de déterminer la stratégie consiste à exécuter des tests et des analyses comparatives sur des charges de travail de production uniformes. Voici quelques conseils supplémentaires à prendre en compte :


  • Utiliser l' API Force Merge : utilisez l'API de fusion forcée pour réduire le nombre de segments dans chaque partition. Les fusions de segments s'effectuent automatiquement en arrière-plan et suppriment tous les documents supprimés. L’utilisation d’une fusion forcée peut supprimer manuellement les anciens documents et accélérer les performances. Cela peut nécessiter beaucoup de ressources et ne devrait donc pas se produire lors des pics d’utilisation.


  • Méfiez-vous du déséquilibre de charge : Elasticsearch ne dispose pas d'un bon moyen de comprendre l'utilisation des ressources par fragment et d'en tenir compte lors de la détermination de l'emplacement des fragments. En conséquence, il est possible d'avoir des fragments chauds. Pour éviter cette situation, vous souhaiterez peut-être envisager d'avoir plus de partitions que de notes de données et des partitions plus petites que de nœuds de données.


  • Utilisez des index basés sur le temps : les index basés sur le temps peuvent réduire le nombre d'index et de partitions dans votre cluster en fonction de la rétention. Elasticsearch propose également une API d'index de basculement afin que vous puissiez basculer vers un nouvel index en fonction de l'âge ou de la taille du document afin de libérer des ressources.

Comment dois-je concevoir pour la multilocation ?

Les stratégies les plus courantes en matière de multilocation consistent à disposer d'un index par client ou locataire ou à utiliser un routage personnalisé. Voici comment vous pouvez évaluer les stratégies adaptées à votre charge de travail :


  • Index par client ou locataire : la configuration d'index distincts par client fonctionne bien pour les entreprises qui disposent d'une base d'utilisateurs plus petite, de plusieurs centaines à quelques milliers de clients, et lorsque les clients ne partagent pas de données. Il est également utile d'avoir un index par client si chaque client a son propre schéma et a besoin d'une plus grande flexibilité.


  • Routage personnalisé : le routage personnalisé vous permet de spécifier la partition sur laquelle réside un document, par exemple l'ID client ou l'ID locataire, pour spécifier le routage lors de l'indexation d'un document. Lors d'une requête basée sur un client spécifique, la requête sera directement envoyée à la partition contenant les données client pour des temps de réponse plus rapides. Le routage personnalisé est une bonne approche lorsque vous disposez d'un schéma cohérent pour vos clients et que vous avez de nombreux clients, ce qui est courant lorsque vous proposez un modèle freemium.

Faire évoluer ou ne pas faire évoluer Elasticsearch !

Elasticsearch est conçu pour les cas d'utilisation de l'analyse de journaux et de la recherche de texte. De nombreuses organisations qui utilisent Elasticsearch pour des analyses en temps réel à grande échelle devront faire des compromis pour maintenir les performances ou la rentabilité, notamment en limitant la complexité des requêtes et la latence d'ingestion des données. Lorsque vous commencez à limiter les modèles d'utilisation, que votre intervalle d'actualisation dépasse votre SLA ou que vous ajoutez d'autres ensembles de données qui doivent être réunis, il peut être judicieux de rechercher des alternatives à Elasticsearch.


Rockset est l'une des alternatives et est spécialement conçu pour l'ingestion de données en streaming en temps réel et les requêtes à faible latence à grande échelle. Découvrez comment migrer hors d'Elasticsearch et explorez les différences architecturales entre les deux systèmes.