Un tutoriel Elasticsearch : Getting Started

#Note : Elastic a récemment annoncé qu’il mettrait en œuvre une licence fermée pour les nouvelles versions d’Elasticsearch et de Kibana au-delà de la version 7.9. Pour plus de détails, lisez les commentaires de notre PDG Tomer Levy sur Truly Doubling Down on Open Source.

Elasticsearch est le cœur vivant de ce qui est aujourd’hui la plateforme d’analyse de logs la plus populaire – la pile ELK (Elasticsearch, Logstash et Kibana). Le rôle d’Elasticsearch est si central qu’il est devenu synonyme du nom de la pile elle-même. Principalement destiné à la recherche et à l’analyse des journaux, Elasticsearch est aujourd’hui l’un des systèmes de base de données les plus populaires. Ce tutoriel sur Elasticsearch fournit aux nouveaux utilisateurs les connaissances et les outils nécessaires pour commencer à utiliser Elasticsearch. Il comprend des instructions d’installation et des instructions initiales d’indexation et de manipulation des données.

Qu’est-ce qu’Elasticsearch ?

Initialement publié en 2010, Elasticsearch (parfois surnommé ES) est un moteur de recherche et d’analyse moderne qui est basé sur Apache Lucene. Entièrement open source et 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 l’interroger.

Ce tutoriel sur Elasticsearch pourrait é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 – à tel point, en fait, que la façon la plus simple d’obtenir des données à partir d’ES est de les rechercher en utilisant 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.

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 coup d’œil à ce tutoriel Logstash pour vous assurer que vous êtes prêt. Vous devrez également vous assurer que votre système d’exploitation se trouve dans la matrice de support d’Elastic, sinon vous risquez de rencontrer des problèmes étranges et imprévisibles. Une fois que cela est fait, vous pouvez commencer par installer Elasticsearch.

Vous pouvez télécharger Elasticsearch en tant que distribution autonome ou l’installer en utilisant les dépôts apt et yum. Nous allons installer Elasticsearch sur une machine Ubuntu 16.04 fonctionnant sur AWS EC2 en utilisant apt.

D’abord, vous devez ajouter la clé de signature d’Elastic afin de pouvoir vérifier le paquet téléchargé (sautez cette étape si vous avez déjà installé des paquets à partir d’Elastic) :

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

Pour Debian, nous devons ensuite installer le paquet 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 updatesudo apt-get install elasticsearch

Configuration d’Elasticsearch

Les configurations d’Elasticsearch se font à 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’endroit où les données sont stockées, la mémoire, les fichiers journaux, et plus encore.

Pour le développement et les tests, les paramètres par défaut suffiront pourtant il est recommandé de faire quelques 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, c’est une bonne pratique pour lier Elasticsearch à une IP privée ou à localhost:

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

Exécution d’Elasticsearch

Elasticsearch ne sera pas exécuté automatiquement après l’installation et vous devrez le démarrer manuellement. La façon dont vous exécutez Elasticsearch dépendra de votre système spécifique. Sur la plupart des systèmes basés sur Linux et Unix, vous pouvez utiliser cette commande :

sudo service elasticsearch start

Et c’est tout ! Pour confirmer que tout fonctionne bien, il suffit de faire 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 d’exécution d’Elasticsearch, utilisez les fichiers journaux d’Elasticsearch situés (sur Deb) 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 des données dans Elasticsearch, celles-ci sont placées dans des index Apache Lucene. Cela est logique car Elasticsearch utilise les index Lucene pour stocker et récupérer ses données. Bien que vous n’ayez pas besoin d’en savoir beaucoup sur Lucene, il est utile de savoir comment il fonctionne lorsque vous commencez à vous intéresser sérieusement à Elasticsearch.
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 le ou souhaitez spécifier le id de l’élément de données, ou POST si vous voulez 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": "User logged in", "user_id": 4, "admin": false}'curl -X PUT '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 en définir la structure. Eh bien, avec Elasticsearch, comme avec toute autre base de données NoSQL, il n’est pas nécessaire de définir la structure des données au préalable. Cependant, pour garantir des performances optimales, vous pouvez définir des mappings Elasticsearch en fonction des types de données. Nous y reviendrons plus tard.

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

Pour voir une liste de vos index Elasticsearch, utilisez :

curl -XGET 'localhost:9200/_cat/indices?v&pretty'health status index uuid pri rep docs.count docs.deleted store.size pri.store.sizeyellow open logstash-2018.01.23 y_-PguqyQ02qOqKiO6mkfA 5 1 17279 0 9.9mb 9.9mbyellow open app GhzBirb-TKSUFLCZTCy-xg 5 1 1 0 5.2kb 5.2kbyellow open .kibana Vne6TTWgTVeAHCSgSboa7Q 1 1 2 0 8.8kb 8.8kbyellow open logs T9E6EdbMSxa8S_B7SDabTA 5 1 1 0 5.7kb 5.7kb

La liste dans ce cas comprend les index que nous avons créés ci-dessus, un index Kibana et un index créé par un pipeline Logstash.

Elasticsearch Query

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. Lisez notre article axé exclusivement sur les requêtes Elasticsearch.

Une fois encore, via l’API REST d’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'{"took":173,"timed_out":false,"_shards":{"total":16,"successful":16,"skipped":0,"failed":0},"hits":{"total":1,"max_score":0.2876821,"hits":}}

Le résultat contient un certain nombre de champs supplémentaires qui décrivent à la fois la recherche et le résultat. Voici un rapide récapitulatif:

  • took : Le temps en millisecondes que la recherche a pris
  • timed_out: If the search timed out
  • _shards : Le nombre de shards Lucene recherchés, et leurs taux de réussite et d’échec
  • hits : Les résultats réels, ainsi que les informations méta pour 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 seulement 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:johnb – Recherche les documents où le champ nom d’utilisateur est égal à « johnb »
  • john* – Recherche les documents qui contiennent des termes qui commencent par john et qui sont suivis de zéro ou plusieurs caractères tels que « john, » « johnb, » et « johnson »
  • john ? – Recherche les documents qui contiennent des termes commençant par john et suivis d’un seul caractère. Correspond à « johnb » et « johns » mais pas à « john. »

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

Elasticsearch Query DSL

Les recherches d’IURI ne sont qu’un début. Elasticsearch fournit également une recherche dans le corps de la requête avec un DSL de requête pour des recherches plus avancées. Il existe un large éventail d’options disponibles dans ces types de recherches, et vous pouvez mélanger différentes options pour obtenir les résultats dont vous avez besoin.

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

Types de requête d’Elasticsearch

Il existe un large éventail d’options disponibles dans ces types de recherches, et vous pouvez mélanger et faire correspondre différentes options pour obtenir les résultats dont vous avez besoin. Les types de requêtes comprennent :

  1. Les requêtes géographiques,
  2. Des requêtes « Plus comme ça »
  3. Des requêtes scriptées
  4. Des requêtes en texte intégral
  5. Des requêtes de forme
  6. Des requêtes d’étendue
  7. Des requêtes de niveau de terme
  8. Des requêtes spécialisées

A compter d’Elasticsearch 6.8, la pile ELK a fusionné les requêtes Elasticsearch et les filtres Elasticsearch, mais ES les différencie toujours par contexte. Le DSL fait la distinction entre 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 aussi généralement plus rapides que les requêtes, mais les requêtes peuvent également calculer un score de pertinence en fonction du degré de correspondance entre un document et 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": "User logged in" } }}'

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" : }}'

Création d’un cluster Elasticsearch

La maintenance d’un cluster Elasticsearch peut prendre du temps, surtout si vous faites du DIY ELK. Mais, étant donné les puissantes capacités de recherche et d’analyse d’Elasticsearch, de tels clusters sont indispensables. Nous avons une plongée plus profonde sur le sujet avec notre tutoriel sur les clusters Elasticsearch, nous allons donc l’utiliser comme tremplin pour cette promenade plus approfondie.

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

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

Avant toute chose, installez Java :

sudo apt-get install default-jre

Puis, ajoutez la clé de connexion d’Elasticsearch :

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

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

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

Vous devrez créer et/ou configurer le propre fichier de configuration de chaque nœud d’Elasticsearch elasticsearch.yml (sudo vim /etc/elasticsearch/elasticsearch.yml). À partir de là, démarrez Elasticsearch, puis vérifiez l’état de votre cluster Elasticsearch. Les réponses ressembleront à quelque chose comme 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 la prochaine sur votre liste. Vérifiez périodiquement la santé de votre cluster avec l’appel 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 étant false, (qui est en fait par défaut). Cela vous montrera l’état du nœud maître. Pour vérifier le nœud local, changez pour true.

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

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

timeout
master_timeout

…ou, pour attendre que certains é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

Suppression de données Elasticsearch

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

$ curl -XDELETE 'localhost:9200/app/users/4?pretty'{ "_index" : "app", "_type" : "users", "_id" : "4", "_version" : 2, "result" : "deleted", "_shards" : { "total" : 2, "successful" : 1, "failed" : 0 }, "_seq_no" : 1, "_primary_term" : 1}

Pour supprimer un index, utilisez:

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

Pour supprimer tous les index (à utiliser 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 seul document:

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

Que faire ensuite ?

Ce tutoriel aide les débutants avec Elasticsearch et en tant que tel fournit juste les étapes de base des opérations CRUD dans Elasticsearch. Elasticsearch est un moteur de recherche et, en tant que tel, présente une immense profondeur dans ses fonctionnalités de recherche.
Les versions récentes ont introduit de nouvelles fonctionnalités incroyables d’Elasticsearch et également des changements importants dans la structure de données sous-jacente.

C’est toujours une bonne idée d’explorer la documentation officielle d’Elasticsearch ainsi que notre tutoriel Logstash et notre tutoriel Kibana.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.