All posts in Elasticsearch

Optimiser les performances d’ElasticSearch en production

Optimiser Elasticsearch en Production

Introduction

ElasticSearch est un moteur de recherche puissant, mais pour en tirer pleinement parti des optimisations sont nécessaires à plusieurs niveaux: mémoire, index, requêtes, cycle de vie des index, surveillance et suivi.
Dans cet article, nous allons étudier des exemples concrets de configuration pour optimiser les performances d’ElasticSearch en production.

Choisir les bons paramètres pour la mémoire

JVM

ElasticSearch est écrit en Java et se repose donc sur la JVM (Java Virtual Machine) pour son exécution. Une mauvaise gestion de la mémoire peut entraîner des ralentissements, voire des échecs. Voici un exemple de configuration recommandée pour allouer la mémoire à la JVM dans le fichier jvm.options :

# Taille de la mémoire JVM (maximale et minimale)
-Xms16g
-Xmx16g

Dans cet exemple, nous allouons 16 Go de mémoire à la JVM. Il est recommandé de ne pas dépasser la moitié de la RAM totale disponible, avec un maximum de 32 Go pour éviter des problèmes liés à l’optimisation de la JVM et de son ramasse-miettes (Garbage collector).

Désactiver la partition d’échange (swap)

La plupart des systèmes d’exploitation essaient d’utiliser autant de mémoire que possible pour les caches du système de fichiers. Le système transfère également la mémoire non utilisée vers les disques. Cela peut entraîner le transfert de la mémoire de la JVM d’ElasticSearch sur le disque et provoquer des ralentissements des passages du ramasse-miettes.

Dans un système distribué et résilient, il est préférable de laisser le système d’exploitation tuer le processus ElasticSearch.

sudo swapoff -a

Sur les systèmes Linux, il faudra rendre ce paramètre permanent en modifiant /etc/fstab.

Index buffer size

Lors d’un import en masse de données, il est recommandé d’augmenter la taille de la mémoire tampon allouée aux nouveaux documents indexés :

indices.memory.index_buffer_size: 50%

Une fois l’ingestion finie, ce paramètre doit être remis à sa valeur initiale (10%).

Optimiser la configuration des index

Nombre de shards

Le nombre de shards par défaut est 1, ce qui peut être trop peu selon le type et la volumétrie des données. Par exemple, si vous avez un index de grande taille (200GB), vous devez augmenter le nombre de shards pour améliorer l’efficacité et réduire la taille des shards.

Visez entre 10GB et 50GB par shard. Des shards trop gros sont longs à parcourir et à déplacer entre deux machines. Des shards trop petits vont considérablement augmenter le nombre de shards total (1000 par machine maximum).

En utilisant l’API ElasticSearch nous définissons le nombre de shards lors de la création de l’index :

PUT /mon_index
{
  "settings": {
    "number_of_shards": 6,
    "number_of_replicas": 1
  }
}

Dans cet exemple, nous définissons assez de shards et de réplicas pour assurer le stockage de nos 200GB et leur redondance, tout en respectant les recommandations.

Mapping des index

Définir un bon mapping des champs peut réduire l’empreinte mémoire d’un index et améliorer la performance des recherches. Par exemple, si vous avez un champ de type text que vous ne souhaitez pas indexer (comme un champ de description très long), vous devez le désactiver dans le mapping.

De manière générale, n’indexez pas une information ne servant pas à la recherche. Le champ sera quand même consultable lors de la lecture des documents, car il fait partie du `_source`.

Le « dynamic mapping » d’ElasticSearch est intéressant quand on débute, car il détecte les types des champs inconnus et leur assigne automatiquement un mapping. En revanche, c’est un problème si des nouveaux champs arrivent tous les jours dans le système, cela peut entraîner un phénomène appelé « mapping explosion ».

Création de l’index avec l’API ElasticSearch :

PUT /mon_index
{
  "mappings": {
    "dynamic": false,
    "properties": {
      "description": {
        "type": "text",
        "index": false
      }
    }
  }
}

Cela désactive les mappings automatiques et l’indexation du champ description, réduisant ainsi la consommation mémoire et améliorant les performances des requêtes.

Optimisation des segments

Les segments sont des morceaux d’un shard qui contiennent des documents. Trop de petits segments peuvent ralentir les requêtes. Voici un exemple de configuration de la politique de fusion (merge policy) pour réduire le nombre de segments en les fusionnant plus souvent :

PUT /mon_index/_settings
{
  "settings": {
    "index.merge.policy.max_merged_segment": "5gb",
    "index.merge.scheduler.max_thread_count": 1
  }
}

Ici, nous spécifions que les segments ne doivent pas dépasser 5 Go et nous limitons le nombre de threads utilisés pour leur fusion.

Attention cependant, ne cherchez pas à optimiser les index en cours d’écriture. Cette optimisation doit être réalisée sur les index en lecture seule.

Optimiser les requêtes et les recherches

Utilisation des filtres

Lorsque vous exécutez des recherches filtrées, utilisez des filtres plutôt que des requêtes pour améliorer la performance. Les filtres sont plus rapides car ils ne calculent pas de scores et génèrent du cache.

Exemple d’utilisation d’un filtre dans une requête ‘bool’ :

POST /mon_index/_search
{
  "query": {
    "bool": {
      "filter": [
        { "term": { "status": "actif" } },
        { "range": { "date": { "gte": "2023-01-01" } } }
      ]
    }
  }
}

Ici, nous appliquons un filtre sur le champ status et une plage de dates, ce qui rend la recherche plus rapide qu’une requête classique.

Caching des requêtes gourmandes

Lors d’une requête sur un ou plusieurs index, chaque shard exécute sa recherche localement. Ils retournent ensuite le résultat au nœud qui coordonne la requête. Le cache des requêtes permet de garder en mémoire les résultats des requêtes fréquentes au niveau de chaque shard.

Même si les paramètres de base sont bien définis, il peut s’avérer nécessaire de les modifier si la taille du cache par défaut n’est pas assez grande (par défaut 1% de la heap size).

indices.requests.cache.size: 2%

Le cache est invalidé lors d’un refresh de l’index, c’est à dire lors d’une écriture sur le disque de la mémoire tampon de l’index. Un index en lecture seule aura donc son cache permanent. Les index en écriture fréquente verront leur cache expirer souvent, ce qui est tout à fait normal.

Suivi et surveillance en production

Surveillance de la santé du cluster

Quelques commandes sont à connaître pour avoir une vue globale de la santé du cluster et de la répartition de la charge.

GET _cluster/health

C’est la première commande à tester. Elle retourne un état global de la santé du cluster avec des métriques de haut niveau. Avec un peu d’expérience les résultats de cette commande guideront votre intuition lors d’une recherche de causes de pannes.

L’allocation des shards :

GET _cat/allocation?v

Cette commande donne une vision globale de la répartition des données, et en un coup d’oeil nous pouvons déterminer si notre cluster est à l’équilibre.

Quelques options d’affichage rendent cette commande encore plus lisible :

GET _cat/allocation?v&h=node,shards,disk.used,disk.percent

Pour vérifier les tailles des shards, et s’assurer que les recommandations sont respectées, nous pouvons lister les shards triés en fonction de leur taille (décroissante).

GET _cat/shards?h=index,shard,prirep,node,store&s=store:desc

Si des shards sont trop gros (plus de 50GB), alors il faudra prendre une action (suppression, réindexation, …).

Métriques

Les métriques de vos machines ElasticSearch sont consultables dans les écrans de supervision de Kibana. Cependant, il est recommandé de ne pas stocker ces informations dans le cluster lui-même. Stockez ces données dans un autre cluster ElasticSearch dédié aux informations de monitoring.

Le déploiement d’agents ElasticSearch, ou directement de MetricBeat sur toutes les machines à monitorer est à réaliser pour que ces informations remontent.

Alertes

Configurez des alertes pour suivre des métriques critiques. Vous devez surveiller l’utilisation de la mémoire, la latence des requêtes ou la disponibilité des nœuds. Cela vous permet de réagir rapidement en cas de problème. Attention cependant à la licence ElasticSearch utilisée. Les sorties d’alertes ne sont pas les mêmes selon la licence choisie. Par exemple, il n’est pas possible d’envoyer un e-mail en license basic open-source.

Conclusion

Il est essentiel d’optimiser ElasticSearch pour garantir des performances élevées et une mise à l’échelle. En suivant ces bonnes pratiques et en appliquant les configurations recommandées, vous pouvez maximiser l’efficacité de votre cluster ElasticSearch. La surveillance continue est également un élément clé pour maintenir un système performant à long terme.

ElasticSearch ILM et répartition des données

Description

La gestion d’une centaine de milliards de documents (données issues de logs applicatifs, équipements réseau, middlewares, etc.) s’avère coûteuse (machines, disques, espace de sauvegarde, etc.).
Pour alléger ce coût d’infrastructure nous devons distinguer les données brûlantes des données tièdes et froides (voir gelées). C’est ce que propose ElasticSearch avec l’ILM (Index Lifecycle Management). Nous vous proposons ainsi d’analyser sa mise en œuvre sur un cluster de production d’un de nos clients.
Les données considérées brûlantes doivent être exploitables dans des temps de réponse très courts, nous devons donc les placer sur des machines dimensionnées correctement. Les requêtes sur les données tièdes et froides n’ont pas besoin d’être aussi performantes, ces données peuvent donc automatiquement être déplacées vers des machines plus modestes grâce aux règles de rétention offertes par ILM.

Limitations des écrans dans Kibana et Cerebro

Kibana, l’interface graphique de la suite Elastic ne propose pas une vue synthétique de cette répartition. Nous pouvons obtenir cette information de répartition grâce à plusieurs requêtes, mais nous devons alors croiser les résultats, ce qui est fastidieux.
Cerebro, une interface graphique issue de la communauté open source, est excellent dans la visualisation de la répartition de la charge, mais ne propose pas cette visualisation au niveau du cycle de vie.
Même constat pour Elasticvue, qu’il s’agisse de sa version desktop, extension Chrome ou webapp.
Un moyen d’obtenir les informations souhaitées est donc de passer par l’API d’ElasticSearch.
Avec une première API nous pouvons obtenir les rôles des machines :

GET _nodes/settings?filter_path=nodes.*.roles,nodes.*.name

{
  "nodes": {
    "ECNRRDP2SUKmcu3s9qJgnA": {
      "name": "es3",
      "roles": [
        "data_cold",
        "ingest",
        "master"
      ]
    },
    "NXZNCa_BQ_SE613oSnDf-g": {
      "name": "es6",
      "roles": [
        "data_cold",
        "ingest",
        "master"
      ]
    },
    "jqmdwzdeQHG84601oQjpGw": {
      "name": "es1",
      "roles": [
        "data",
        "data_hot",
        "ingest",
        "master"
      ]
    },
    "4z2k13n8SZS4t2JmLielaQ": {
      "name": "es4",
      "roles": [
        "data",
        "data_hot",
        "ingest",
        "master"
      ]
    },
    "AFRMIIagRWK4Cu-ZhbLH2A": {
      "name": "es5",
      "roles": [
        "data_warm",
        "ingest",
        "master"
      ]
    },
    "sxljzKF-Q1app0VSkVgTxg": {
      "name": "es2",
      "roles": [
        "data_warm",
        "ingest",
        "master"
      ]
    }
  }
}

Puis avec une deuxième API nous pouvons récupérer le cycle de vie des indices (index au pluriel).

GET /*/_settings?filter_path=*.settings.index.routing.allocation.include,*.settings.index.uuid,*.settings.index.provided_name

{
  ".ds-my-index-1-2024.09.17-003772": {
    "settings": {
      "index": {
        "routing": {
          "allocation": {
            "include": {
              "_tier_preference": "data_hot"
            }
          }
        },
        "provided_name": ".ds-my-index-1-2024.09.17-003772",
        "uuid": "HyELPU6oTpC_EfskAxP5BQ"
      }
    }
  },
  ".ds-my-index-1-2024.09.17-003748": {
    "settings": {
      "index": {
        "routing": {
          "allocation": {
            "include": {
              "_tier_preference": "data_warm,data_hot"
            }
          }
        },
        "provided_name": ".ds-my-index-1-2024.09.17-003748",
        "uuid": "QNC-Z2loT4SCKFb2-LJKAw"
      }
    }
  },
  ".ds-my-index-1-2024.09.17-003714": {
    "settings": {
      "index": {
        "routing": {
          "allocation": {
            "include": {
              "_tier_preference": "data_cold,data_warm,data_hot"
            }
          }
        },
        "provided_name": ".ds-my-index-1-2024.09.17-003714",
        "uuid": "zIP72E-qTBSfKbZdAYmFEQ"
      }
    }
  },
  [...]
}

Et avec une troisième API nous pouvons restituer le détails des blocs de données correspondant aux indices :

GET /_cat/shards?format=json&h=index,node,state,prirep,docs

[
  {
    "index": ".ds-my-index-1-2024.09.17-003848",
    "node": "es1",
    "state": "STARTED",
    "prirep": "p",
    "docs": "120"
  },
  {
    "index": ".ds-my-index-1-2024.09.17-003848",
    "node": "es4",
    "state": "STARTED",
    "prirep": "r",
    "docs": "47"
  },
  {
    "index": ".ds-my-index-1-2024.09.17-003828",
    "node": "es5",
    "state": "STARTED",
    "prirep": "p",
    "docs": "29"
  },
  {
    "index": ".ds-my-index-1-2024.09.17-003828",
    "node": "es2",
    "state": "STARTED",
    "prirep": "r",
    "docs": "147"
  },
  [...]
]

En croisant les résultats de ces trois requêtes, nous pouvons donc savoir si un bloc de données d’un index « brûlant » est bien placé sur un noeud « brûlant ». Mais pour des milliers d’index, cela devient beaucoup plus laborieux.

Développement d’une solution de visualisation

Quelques lignes de JavaScript (64), d’HTML (80) et de CSS (118) plus tard et voici un aperçu d’un rapport réalisé sur un cluster ElasticSearch en local.

ElasticSearch ILM test

Résultat de l’analyse du cluster local

L’outil génère un fichier de rapport en format HTML, consultable depuis n’importe quel navigateur. Alors, en un coup d’œil on peut savoir si un bloc est à la bonne place.
Le code source est disponible sur Github.
Pour résumer ce que fait techniquement ce code source :

  • Lancement des 3 requêtes précédemment étudiées
  • Injection de ces données dans un moteur de template HTML
  • Sauvegarde du résultat dans un fichier HTML

Premier rapport réalisé sur une infrastructure de production et analyse

Ensuite, nous avons intégré l’outil dans une chaîne d’intégration continue de Gitlab pour automatiser la génération des rapports. Nous pouvons ainsi désormais nous interfacer avec le cluster à analyser et donc générer un premier rapport.
Quelques données sur la taille du cluster :

  • 10 machines ElasticSearch
  • 110 milliards de documents
  • 125 To de données stockées
  • 25 000 événements par seconde

Le premier rapport montre une répartition de la charge logique comme ci-dessous :

ElasticSearch ILM

Résultat de l’analyse du cluster de production

Les nœuds ayant le rôle data_warm reçoivent bien les blocs data_warm. Les nœuds ayant le rôle data (tout les rôles) reçoivent tout type de blocs.
Cependant ce n’est pas encore optimisé pour réduire les coûts car :

  • Il reste des blocs data_warm non alloués à des nœuds data_warm car ElasticSearch cherche l’équilibre en termes de nombre de blocs par machine.
  • Aucun bloc de données froides n’apparaît car les règles de rétention ne définissent pas de phase « cold ». Des nœuds data_cold doivent être ajoutés au cluster.
  • Il y a légèrement trop de données brûlantes en proportion, la durée de rétention en phase « hot » doit être revue à la baisse.

Evolution du cluster

Ainsi, après réflexions avec les équipes en charge de la maintenance du cluster, nous avons définit la cible à atteindre :

  • 3 nœuds cold (à venir)
  • 5 nœuds warm (node-3 node-9 node-10 node-1 node-2)
  • 2 nœuds hot warm master (node-4 node-5)
  • 3 nœuds hot ingest master content (node-6 node-7 node-8)

Les raisons de ces choix dépendent des caractéristiques des machines à disposition (CPU, disques, RAM).
Les mouvements de blocs vont être nombreux, et nous réfléchissons déjà à la procédure de migration afin de perturber au minimum le service. Il faut bien prendre en compte que l’espace disque pris par chaque bloc est de 50Go, et que chaque déplacement prend entre 30 minutes et 1 heure sur cette infrastructure réseau.
Nous avons ensuite planifié l’exécution de l’outil pour fournir un rapport tous les jours afin de suivre l’évolution de la répartition. Nous aurons donc un joli jeu de couleurs d’ici quelques semaines 😉

Découvrez la FAQ du Data Management

A l’issue de sa première participation, toute la team DocDoku remercie les visiteurs du salon Big Data Paris pour leur interêt et nos nombreux échanges.

Pour contribuer à relayer ce dialogue avec nos visiteurs mais également nos lecteurs, nous avons compilé un extrait de vos « Frequently Asked Questions ». Un éclairage complémentaire sur notre solution DocDokuPLM qui viendra, nous l’espérons, enrichir votre réflexion sur le Data Management.

Quel est l’interêt de convertir mes fichiers de Conception Assistée par Ordinateur (CAO) sur DocDokuPLM ?

Ils sont nombreux :

  • Ouvrir l’accès aux données pour des populations au delà des équipes techniques et qui  contribuent pleinement à la chaîne de valeur de vos offres : Qualité, Marketing, Communication…
  • Encourager une démarche d’Entreprise Lean
  • S’affranchir des contraintes d’infrastructure requises par un système de CAO, qui excluent souvent les populations non techniques
  • Accroître l’accessibilité de vos données via notre solution full web.

Nos données sont-elles poussées en temps réel dans votre solution ou bien votre système va les chercher ?

DocDokuPLM dispose d’API Web Services REST (Java, JavaScript) pour une parfaite interopérabilité avec d’autres systèmes.
Ainsi vos données existantes peuvent également être reprises par l’intermédiaire de ces API au travers de notre outil de scripting (Command Line Interface).
En ce qui concerne le « push » et le « pull » de vos données, les deux sont possibes : cela dépend des cas d’usage ainsi que du degré d’ouverture des systèmes avec lesquels nous devons nous intégrer. 

DocDokuPLM utilise le format STEP. Quel est l’interêt ?

Il s’agit d’un standard pour intégrer et indexer des informations provenant de sources hétérogènes ou de métiers très divers. Le respect de ce format et de la norme qui lui est associée (ISO 10303) vous garantit une traitement dans les règles de l’art de vos données : pas de perte de données, assurance de la cohérence des données indexées.

Quel peut être l’usage de DocDokuPLM pour mon service R&D ?

L’usage de notre solution permet de favoriser la communication en amont de la production : accéder aux maquettes 3D depuis un navigateur, effectuer vos revues de conception partagée. L’objectif étant de fluidifier les échanges et de partager en amont et en temps réel les modifications ou évolutions de vos produits.
On parle alors d’ingénierie collaborative.

Quelles bases de données utilisez-vous et quelles sont vos garanties quant à la robustesse du système ?

DocDokuPLM peut être utilisé avec la plupart des bases de données du marché telles que PostgreSQL, MySQL / MariaDB, Oracle, SQL Server.
Elle intègre également le moteur de recherche et d’indexation Elasticsearch.

Est- ce que DocDokuPLM est une solution BI ou décisionnelle ?

La BI ou l’analyse décisionnelle a pour objectif  d’analyser l’information pour améliorer et optimiser les décisions et les performances d’une entreprise.
DocDokuPLM a pour objectif d’optimiser l’accès, la visualisation et le partage des données. En fonction des besoins, des tableaux de bord peuvent être construits pour orienter votre stratégie de Data Management.
La solution participe donc à votre stratégie de BI mais ne constitue pas une solution d’analyse décisionnelle des données en tant que telle.

Votre brique Workflow permet-elle de lancer des actions complexes (par exemple : pré-remplissage, édition et envoi de document en automatique) ?

Oui, tout à fait. Le back-office du moteur de workflow permet à tout utilisateur autorisé de paramétrer l’ensemble des étapes d’un workflow :  cela recouvre la mise en place de circuits de validation par exemple ou encore l’envoi de données sur un template de documents pré-établis et sa transmission vers vos systèmes existants, par exemple pour l’édition et l’envoi de documents.

Accéder à la page produit DocDokuPLM

Réserver une démonstration

DevFest Toulouse 2017 : passion et innovation

Merci aux 450 participants du DevFest et bravo à nos équipes pour avoir suscité l’interêt de nos visiteurs lors de cette journée dédiée aux développeurs !

Une occasion pour l’écosystème toulousain de se retrouver et d’assister à des conférences de pointe sur l’évolution du métier de développeur, le développement mobile ou encore l’IoT.

Chez DocDoku, nous encourageons nos collaborateurs à prendre part à cette journée.
Plusieurs membres de nos équipes ont ainsi participé aux conférences : un réel atout pour renforcer leur veille technologique, réseauter et trouver de l’inspiration sur les méthodologies et outils de demain.

Rendez-vous l’année prochaine !