Un tutoriel Elasticsearch: Pour bien commencer

Un tutoriel Elasticsearch: Pour bien commencer

Elastic a récemment annoncé qu’il mettrait en place une licence propriétaire pour les nouvelles versions d’Elasticsearch et de Kibana au-delà de la version 7.9. Pour plus de détails, consultez les commentaires de notre PDG, Tomer Levy, sur le sujet : Véritable engagement envers l’open source.

Elasticsearch est le cœur vivant de la plateforme d’analyse de journaux la plus populaire d’aujourd’hui : la pile ELK (Elasticsearch, Logstash et Kibana). Elasticsearch joue un rôle si central qu’il est devenu synonyme du nom de la pile elle-même. Principalement conçu pour la recherche et l’analyse des journaux, Elasticsearch est l’un des systèmes de base de données les plus populaires disponibles aujourd’hui. Ce tutoriel Elasticsearch offre aux nouveaux utilisateurs les connaissances et les outils préalables pour commencer à utiliser Elasticsearch. Il comprend des instructions d’installation ainsi que des instructions de création d’index et de manipulation des données.

Il est important de noter qu’Elasticsearch n’est plus un composant open source, comme il l’était autrefois. En janvier 2021, Elastic a annoncé qu’Elasticsearch et Kibana (à partir de la version 7.11) passeraient à une licence double propriétaire (sous licence SSPL) et abandonneraient la licence open source Apache-2.0.

Cela a incité AWS à créer une version dérivée d’Elasticsearch et de Kibana appelée OpenSearch et OpenSearch Dashboards, qui répond aux mêmes cas d’utilisation de la pile ELK sous la licence open source Apache 2.0.

Elasticsearch : une brève introduction

Sorti pour la première fois en 2010, Elasticsearch (parfois surnommé ES) est un moteur de recherche et d’analyse moderne basé sur Apache Lucene. Construit avec Java, Elasticsearch est une base de données NoSQL. Cela signifie qu’il stocke les données de manière non structurée et que vous ne pouvez pas utiliser SQL pour les interroger.

Ce tutoriel Elasticsearch peut également être considéré comme un tutoriel NoSQL. Cependant, contrairement à la plupart des bases de données NoSQL, Elasticsearch met l’accent sur les capacités et les fonctionnalités de recherche, au point que la meilleure façon d’extraire des données d’ES est de les rechercher à l’aide de l’API Elasticsearch étendue.

Dans le contexte de l’analyse des données, Elasticsearch est utilisé avec les autres composants de la pile ELK, Logstash et Kibana, et joue le rôle d’indexation et de stockage des données. De nos jours, Logstash est généralement remplacé par des composants plus petits et plus légers tels que Fluentd ou FluentBit, qui peuvent réaliser la plupart de ce que Logstash peut faire sans l’empreinte de calcul lourde et les défis courants.

Comme vous le verrez dans ce tutoriel, commencer avec Elasticsearch n’est pas sorcier. Surtout lorsque vous configurez un petit cluster, la mise en place d’un pipeline de journalisation ELK est simple.

Cependant, lorsque vous commencez à envoyer plus de données, la gestion de ELK nécessite plus de travail. Vous devrez gérer et mettre à l’échelle des clusters plus importants, implémenter plus de traitements de données, installer et gérer des files d’attente de données telles que Kafka pour tamponner vos journaux, peut-être mettre à niveau vos composants ELK, et surveiller et optimiser votre pile pour les problèmes de performance.

Pour ceux qui ne veulent pas gérer eux-mêmes ces tâches et ont besoin de fonctionnalités supplémentaires telles que RBAC, Logz.io a développé un outil de gestion des journaux qui offre ELK en tant que service (qui est maintenant OpenSearch en tant que service !), vous permettant ainsi d’adopter la plateforme de journalisation leader mondiale sans avoir à la faire fonctionner vous-même. Logz.io prend également en charge les analyses de métriques et de traces – découvrez comment Logz.io unifie et améliore les principales technologies open source d’observabilité ici.

Cela étant dit, avec de petits clusters, exécuter Elasticsearch vous-même est un excellent choix. Voyons maintenant comment commencer.

Installation d’Elasticsearch

Les exigences pour Elasticsearch sont simples : Java 8 (version spécifique recommandée : Oracle JDK version 1.8.0_131). Jetez un œil à ce tutoriel Logstash pour vous assurer que vous êtes prêt. Vous devez également vous assurer que votre système d’exploitation est pris en charge par Elastic, sinon vous risquez de rencontrer des problèmes étranges et imprévisibles. Une fois cela fait, vous pouvez commencer par installer Elasticsearch.

Vous pouvez télécharger Elasticsearch en tant que distribution autonome ou l’installer à l’aide des dépôts apt et yum. Nous installerons Elasticsearch sur une machine Ubuntu 16.04 exécutée sur AWS EC2 à l’aide de apt.

Tout d’abord, vous devez ajouter la clé d’authentification d’Elastic pour vérifier le package téléchargé (passez cette étape si vous avez déjà installé des packages d’Elastic) :

wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -

Pour Debian, vous devez ensuite installer le package apt-transport-https :

sudo apt-get install apt-transport-https

L’étape suivante consiste à ajouter la définition du dépôt à votre système :

echo "deb https://artifacts.elastic.co/packages/6.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-6.x.list

Il ne reste plus qu’à mettre à jour vos dépôts et à installer Elasticsearch :

sudo apt-get update
sudo apt-get install elasticsearch

Configuration d’Elasticsearch

La configuration d’Elasticsearch se fait à l’aide d’un fichier de configuration dont l’emplacement dépend de votre système d’exploitation. Dans ce fichier, vous pouvez configurer les paramètres généraux (par exemple, le nom du nœud), ainsi que les paramètres réseau (par exemple, l’hôte et le port), l’emplacement de stockage des données, la mémoire, les fichiers journaux, et bien plus encore.

Pour des fins de développement et de test, les paramètres par défaut suffiront, mais il est recommandé de faire des recherches sur les paramètres que vous devriez définir manuellement avant de passer en production.

Par exemple, et surtout si vous installez Elasticsearch sur le cloud, il est recommandé de lier Elasticsearch à une adresse IP privée ou à localhost :

sudo vim /etc/elasticsearch/elasticsearch.yml
network.host: "localhost"
http.port: 9200

Lancement d’Elasticsearch

Elasticsearch ne se lance pas automatiquement après l’installation et vous devrez le démarrer manuellement. La manière de lancer Elasticsearch dépend de votre système spécifique. Sur la plupart des systèmes Linux et Unix, vous pouvez utiliser cette commande :

sudo service elasticsearch start

Et voilà ! Pour confirmer que tout fonctionne correctement, il vous suffit de pointer curl ou votre navigateur vers http://localhost:9200, et vous devriez voir quelque chose comme la sortie suivante :

{
  "name" : "33QdmXw",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "mTkBe_AlSZGbX-vDIe_vZQ",
  "version" : {
    "number" : "6.1.2",
    "build_hash" : "5b1fea5",
    "build_date" : "2018-01-10T02:35:59.208Z",
    "build_snapshot" : false,
    "lucene_version" : "7.1.0",
    "minimum_wire_compatibility_version" : "5.6.0",
    "minimum_index_compatibility_version" : "5.0.0"
  },
  "tagline" : "You Know, for Search"
}

Pour déboguer le processus de lancement d’Elasticsearch, utilisez les fichiers journaux d’Elasticsearch situés (sur Debian) dans /var/log/elasticsearch/.

Création d’un index Elasticsearch

L’indexation est le processus d’ajout de données à Elasticsearch. En effet, lorsque vous alimentez Elasticsearch en données, celles-ci sont placées dans des index Apache Lucene. Cela a du sens car Elasticsearch utilise les index Lucene pour stocker et récupérer ses données. Bien que vous n’ayez pas besoin de connaître en détail Lucene, il est utile de comprendre son fonctionnement lorsque vous commencez à utiliser Elasticsearch sérieusement. Elasticsearch se comporte comme une API REST, vous pouvez donc utiliser la méthode POST ou PUT pour y ajouter des données. Vous utilisez PUT lorsque vous connaissez ou souhaitez spécifier l’ID de l’élément de données, ou POST si vous souhaitez qu’Elasticsearch génère un ID pour l’élément de données :

curl -XPOST 'localhost:9200/logs/my_app' -H 'Content-Type: application/json' -d' 
{
  "timestamp": "2018-01-24 12:34:56",
  "message": "Utilisateur connecté",
  "user_id": 4,
  "admin": false
}
'

curl -XPUT 'localhost:9200/app/users/4' -H 'Content-Type: application/json' -d '
{
  "id": 4,
  "username": "john",
  "last_login": "2018-01-25 12:34:56"
}
'

Et la réponse :

{
  "_index": "logs",
  "_type": "my_app",
  "_id": "ZsWdJ2EBir6MIbMWSMyF",
  "_version": 1,
  "result": "created",
  "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
  },
  "_seq_no": 0,
  "_primary_term": 1
}
{
  "_index": "app",
  "_type": "users",
  "_id": "4",
  "_version": 1,
  "result": "created",
  "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
  },
  "_seq_no": 0,
  "_primary_term": 1
}

Les données du document sont envoyées sous forme d’objet JSON. Vous vous demandez peut-être comment nous pouvons indexer des données sans définir la structure des données. Eh bien, avec Elasticsearch, comme avec n’importe quelle autre base de données NoSQL, il n’est pas nécessaire de définir la structure des données à l’avance. Cependant, pour garantir des performances optimales, vous pouvez définir des mappings Elasticsearch en fonction des types de données. Nous en parlerons plus tard.

Si vous utilisez l’un des émetteurs Beats (par exemple Filebeat ou Metricbeat) ou Logstash, ces parties de la pile ELK créeront automatiquement les index.

Pour afficher la liste des indices Elasticsearch, utilisez :

curl -XGET 'localhost:9200/_cat/indices?v&pretty'

La liste dans ce cas comprend les index que nous avons créés précédemment, un index Kibana et un index créé par un pipeline Logstash.

Interrogation dans Elasticsearch

Une fois que vous avez indexé vos données dans Elasticsearch, vous pouvez commencer à les rechercher et à les analyser. La requête la plus simple que vous pouvez effectuer consiste à récupérer un seul élément. Consultez notre article axé exclusivement sur les requêtes Elasticsearch.

Encore une fois, via l’API REST Elasticsearch, nous utilisons GET :

curl -XGET 'localhost:9200/app/users/4?pretty'

Et la réponse :

{
  "_index" : "app",
  "_type" : "users",
  "_id" : "4",
  "_version" : 1,
  "found" : true,
  "_source" : {
    "id" : 4,
    "username" : "john",
    "last_login" : "2018-01-25 12:34:56"
  }
}

Les champs commençant par un trait de soulignement sont tous des champs méta du résultat. L’objet _source est le document original qui a été indexé.

Nous utilisons également GET pour effectuer des recherches en appelant le point de terminaison _search :

curl -XGET 'localhost:9200/_search?q=logged'

Et le résultat :

{
  "took" : 173,
  "timed_out" : false,
  "_shards" : {
    "total" : 16,
    "successful" : 16,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 1,
    "max_score" : 0.2876821,
    "hits" : [
      {
        "_index" : "logs",
        "_type" : "my_app",
        "_id" : "ZsWdJ2EBir6MIbMWSMyF",
        "_score" : 0.2876821,
        "_source" : {
          "timestamp": "2018-01-24 12:34:56",
          "message": "Utilisateur connecté",
          "user_id": 4,
          "admin": false
        }
      }
    ]
  }
}

Le résultat contient plusieurs champs supplémentaires qui décrivent à la fois la recherche et le résultat. Voici un résumé rapide :

  • took : le temps en millisecondes que la recherche a pris
  • timed_out : si la recherche a expiré
  • _shards : le nombre de fragments Lucene recherchés, ainsi que leurs taux de réussite et d’échec
  • hits : les résultats réels, ainsi que des informations supplémentaires sur les résultats

La recherche que nous avons effectuée ci-dessus est connue sous le nom de recherche URI, et c’est la façon la plus simple d’interroger Elasticsearch. En fournissant simplement un mot, ES recherchera tous les champs de tous les documents pour ce mot. Vous pouvez construire des recherches plus spécifiques en utilisant des requêtes Lucene :

  • username:john – Recherche les documents où le champ username est égal à “john”
  • john* – Recherche les documents qui contiennent des termes commençant par john, suivis de zéro ou plusieurs caractères, comme “john,” “johnb” et “johnson”
  • john? – Recherche les documents qui contiennent des termes commençant par john, suivis d’un seul caractère. Correspond à “johnb” et “johns”, mais pas à “john.”

Il existe de nombreuses autres façons de rechercher, notamment l’utilisation de la logique booléenne, l’optimisation des termes, l’utilisation de recherches floues et de proximité, et l’utilisation des expressions régulières.

DSL de requête Elasticsearch

Les recherches par URI ne sont que le début. Elasticsearch propose également une recherche avec un corps de requête et un DSL de requête pour des recherches plus avancées. Il existe de nombreuses options disponibles dans ces types de recherches, et vous pouvez mélanger et combiner différentes options pour obtenir les résultats souhaités.

Il contient deux types de clauses : 1) des clauses de requête feuille qui recherchent une valeur dans un champ spécifique, et 2) des clauses de requête composite (qui peuvent contenir une ou plusieurs clauses de requête feuille).

Types de requêtes Elasticsearch

Il existe une large gamme d’options disponibles dans ces types de recherches, et vous pouvez mélanger et combiner différentes options pour obtenir les résultats souhaités. Les types de requête comprennent :

  • Requêtes géographiques,
  • Requêtes “Plus comme ça”,
  • Requêtes scriptées,
  • Requêtes plein texte,
  • Requêtes de forme,
  • Requêtes sur une étendue,
  • Requêtes au niveau des termes,
  • Requêtes spécialisées.

À partir d’Elasticsearch 6.8, la pile ELK a fusionné les requêtes Elasticsearch et les filtres Elasticsearch, mais Elasticsearch les différencie toujours par contexte. Le DSL distingue un contexte de filtre et un contexte de requête pour les clauses de requête. Les clauses dans un contexte de filtre testent les documents de manière booléenne : le document correspond-il au filtre, “oui” ou “non” ? Les filtres sont généralement plus rapides que les requêtes, mais les requêtes peuvent également calculer un score de pertinence en fonction de la proximité d’un document à la requête. Les filtres n’utilisent pas de score de pertinence. Cela détermine l’ordre et l’inclusion des documents :

curl -XGET 'localhost:9200/logs/_search?pretty' -H 'Content-Type: application/json' -d' 
{
  "query": {
    "match_phrase": {
      "message": "Utilisateur connecté"
    }
  }
}
'

Et le résultat :

{
  "took" : 28,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 1,
    "max_score" : 0.8630463,
    "hits" : [
      {
        "_index" : "logs",
        "_type" : "my_app",
        "_id" : "ZsWdJ2EBir6MIbMWSMyF",
        "_score" : 0.8630463,
        "_source" : {
          "timestamp" : "2018-01-24 12:34:56",
          "message" : "Utilisateur connecté",
          "user_id" : 4,
          "admin" : false
        }
      }
    ]
  }
}

Création d’un cluster Elasticsearch

La gestion d’un cluster Elasticsearch peut être chronophage, surtout si vous faites du bricolage en matière de ELK. Mais compte tenu des puissantes capacités de recherche et d’analyse d’Elasticsearch, de tels clusters sont indispensables. Nous proposons un article plus détaillé sur le sujet avec notre tutoriel sur les clusters Elasticsearch, nous utiliserons donc cela comme point de départ pour cette explication plus approfondie.

Qu’est-ce qu’un cluster Elasticsearch, précisément ? Les clusters Elasticsearch regroupent plusieurs nœuds Elasticsearch et/ou instances ensemble. Bien sûr, vous pouvez toujours choisir de maintenir une seule instance Elasticsearch ou un seul nœud à l’intérieur d’un cluster donné. L’intérêt principal d’un tel regroupement réside dans la répartition des tâches, de la recherche et de l’indexation du cluster sur ses nœuds. Les options de nœud comprennent les nœuds de données, les nœuds maîtres, les nœuds clients et les nœuds d’ingestion.

Installer des nœuds peut impliquer de nombreuses configurations, que notre tutoriel mentionné précédemment couvre. Mais voici l’installation de base d’un nœud de cluster Elasticsearch :

Tout d’abord, installez Java :

sudo apt-get install default-jre

Ensuite, ajoutez la clé d’authentification d’Elasticsearch :

wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -

Ensuite, installez la nouvelle itération d’Elasticsearch :

sudo apt-get update && apt-get install elasticsearch

Vous devrez créer et/ou configurer le fichier de configuration elasticsearch.yml propre à chaque nœud Elasticsearch (sudo vim /etc/elasticsearch/elasticsearch.yml). Ensuite, démarrez Elasticsearch, puis vérifiez l’état de votre cluster Elasticsearch. Les réponses ressembleront à ceci :

{
  "cluster_name" : "elasticsearch-cluster-demo",
  "compressed_size_in_bytes" : 255,
  "version" : 7,
  "state_uuid" : "50m3ranD0m54a531D",
  "master_node" : "IwEK2o1-Ss6mtx50MripkA",
  "blocks" : { },
  "nodes" : {
    "m4-aw350m3-n0D3" : {
      "name" : "es-node-1",
      "ephemeral_id" : "x50m33F3mr-A11DnuM83r",
      "transport_address" : "172.31.50.123:9200",
      "attributes" : { }
    },
  },
}

La santé du cluster Elasticsearch sera ensuite sur votre liste. Vérifiez périodiquement la santé de votre cluster avec l’appel d’API suivant :

curl -X GET "localhost:9200/_cluster/health?wait_for_status=yellow&local=false&level=shards&pretty"

Cet exemple montre le paramètre local comme false (qui est en réalité par défaut). Cela vous montrera l’état du nœud maître. Pour vérifier le nœud local, basculez sur true.

Le paramètre level montrera par défaut l’état de santé du cluster, mais les rangs au-delà incluent les indices et les fragments (comme dans l’exemple ci-dessus).

Il existe des paramètres optionnels supplémentaires pour les délais…

timeout master_timeout

…ou pour attendre que certaines événements se produisent :

wait_for_active_shards wait_for_events wait_for_no_initializing_shards wait_for_no_relocating_shards wait_for_nodes wait_for_status

Bien sûr, avec Logz.io, la création d’un cluster Elasticsearch (maintenant OpenSearch) est aussi simple que de lancer un essai gratuit. Et augmenter la capacité de votre cluster Elasticsearch ne nécessite rien de la part de l’utilisateur.

Suppression des données Elasticsearch

Supprimer des éléments d’Elasticsearch est aussi simple que d’ajouter des données à Elasticsearch. La méthode HTTP à utiliser cette fois-ci est, surprise, surprise : DELETE :

curl -XDELETE 'localhost:9200/app/users/4?pretty'

Pour supprimer un index, utilisez :

curl -XDELETE 'localhost:9200/logs?pretty'

Pour supprimer tous les indices (utilisez avec une extrême prudence), utilisez :

curl -XDELETE 'localhost:9200/_all?pretty'

La réponse dans les deux cas devrait être :

{ "acknowledged" : true }

Pour supprimer un document unique :

curl -XDELETE 'localhost:9200/index/type/document'

Quelle est la prochaine étape ?

Ce tutoriel aide les débutants à comprendre Elasticsearch et fournit donc uniquement les étapes de base des opérations CRUD dans Elasticsearch. Elasticsearch est un moteur de recherche, et en tant que tel, il offre une profondeur immense à ses fonctionnalités de recherche.

Bien sûr, si vous ne voulez pas faire cela vous-même, vous pouvez commencer un essai gratuit de Logz.io pour commencer à enregistrer des journaux avec OpenSearch – qui est actuellement très similaire à Elasticsearch – sans avoir à installer manuellement quoi que ce soit ou à le faire fonctionner sur votre propre infrastructure.

Pour passer à une alternative open source à ELK, consultez notre guide sur OpenSearch et OpenSearch Dashboards ou la documentation OpenSearch d’AWS.

Pour les prochaines étapes avec Elasticsearch, envisagez d’explorer la documentation officielle d’Elasticsearch ainsi que notre tutoriel sur Logstash et notre tutoriel sur Kibana.