RousselTMLEARNING

Article · Elasticsearch : de la découverte à l'expertise

Bonnes pratiques Elasticsearch

1. Dimensionner les index et les shards #

Le réglage le plus impactant.

Règles de dimensionnement #

Taille recommandée des shards
Trop de petits shards consomment de la mémoire ; trop gros, ils ralentissent la récupération.
  • Visez 10 à 50 Go par shard et moins de 20 shards par Go de heap JVM.
  • Un seul shard primaire suffit pour les petits index ; évitez le sur-sharding.
  • Utilisez des data streams avec rollover plutôt qu'un index unique géant.
curl -s localhost:9200/_cluster/health?pretty
curl -s 'localhost:9200/_cat/indices?v&s=store.size:desc&h=index,pri,rep,docs.count,store.size' | head
curl -s 'localhost:9200/_cat/shards?v&s=store:desc' | head
curl -s 'localhost:9200/_cat/allocation?v'
curl -s 'localhost:9200/_cluster/allocation/explain?pretty'      # pourquoi un shard n'est pas alloué

2. Mappings, templates et ILM #

Maîtriser le schéma et le cycle de vie.

Template et mapping explicite #

curl -X PUT localhost:9200/_index_template/logs-app -H 'Content-Type: application/json' -d '{
  "index_patterns": ["logs-app-*"],
  "data_stream": {},
  "template": {
    "settings": { "number_of_shards": 1, "number_of_replicas": 1, "index.lifecycle.name": "logs-30j", "index.codec": "best_compression" },
    "mappings": {
      "dynamic": "strict",
      "properties": {
        "@timestamp": { "type": "date" }, "level": { "type": "keyword" }, "message": { "type": "text" },
        "user_id": { "type": "keyword" }, "duration_ms": { "type": "long" }
      }
    }
  }
}'
Erreur Courante : Un mapping dynamique laissé libre crée des milliers de champs (explosion de mapping). Utilisez dynamic: strict et des types adaptés (keyword pour les filtres, text pour le plein texte).

Cycle de vie (ILM) #

curl -X PUT localhost:9200/_ilm/policy/logs-30j -H 'Content-Type: application/json' -d '{
  "policy": { "phases": {
    "hot":    { "actions": { "rollover": { "max_primary_shard_size": "50gb", "max_age": "1d" } } },
    "warm":   { "min_age": "7d",  "actions": { "shrink": { "number_of_shards": 1 }, "forcemerge": { "max_num_segments": 1 } } },
    "delete": { "min_age": "30d", "actions": { "delete": {} } }
  } }
}'
curl -s localhost:9200/_ilm/status
curl -s 'localhost:9200/logs-app-*/_ilm/explain?pretty' | head -30

3. Mémoire, sécurité et sauvegardes #

Stabilité de production.

JVM et système #

# jvm.options.d/heap.options : 50 % de la RAM maximum, jamais plus de ~30 Go
-Xms16g
-Xmx16g

sudo sysctl -w vm.max_map_count=262144
sudo swapoff -a                       # ou bootstrap.memory_lock: true
curl -s 'localhost:9200/_nodes/stats/jvm?filter_path=**.heap_used_percent&pretty'

Sécurité #

  • Activez TLS (transport et HTTP) et l'authentification ; utilisez des clés d'API à portée limitée.
  • N'exposez jamais le port 9200 sur Internet ; passez par un reverse proxy.
  • Un rôle d'écriture par pipeline d'ingestion, un rôle de lecture par équipe.
curl -u elastic -X POST localhost:9200/_security/api_key -H 'Content-Type: application/json' -d '{
  "name": "ingestion-app",
  "role_descriptors": { "writer": { "indices": [{ "names": ["logs-app-*"], "privileges": ["create_doc", "auto_configure"] }] } },
  "expiration": "90d"
}'

Sauvegardes (snapshots) #

curl -X PUT localhost:9200/_snapshot/depot -H 'Content-Type: application/json' -d '{ "type": "s3", "settings": { "bucket": "es-snapshots" } }'
curl -X PUT localhost:9200/_slm/policy/quotidien -H 'Content-Type: application/json' -d '{
  "schedule": "0 30 1 * * ?", "name": "<snap-{now/d}>", "repository": "depot",
  "config": { "indices": ["logs-*"] }, "retention": { "expire_after": "30d", "min_count": 5 } }'
curl -s localhost:9200/_snapshot/depot/_all?pretty | head -20
Bonne Pratique : Testez régulièrement la restauration : une sauvegarde jamais restaurée n'est pas une sauvegarde.

4. Requêtes et ingestion performantes #

Bulk, filtres et pagination.

Bonnes habitudes #

# Ingestion : _bulk par lots de 5 à 15 Mo
curl -s -H 'Content-Type: application/x-ndjson' -XPOST localhost:9200/_bulk --data-binary @lot.ndjson | jq '.errors'

# Filtres (cachés, sans score) plutôt que must pour les conditions exactes
curl -s localhost:9200/logs-app-*/_search -H 'Content-Type: application/json' -d '{
  "size": 20, "_source": ["@timestamp","level","message"],
  "query": { "bool": { "filter": [ { "term": { "level": "error" } }, { "range": { "@timestamp": { "gte": "now-15m" } } } ] } },
  "sort": [{ "@timestamp": "desc" }]
}'
# Pagination profonde : search_after + PIT
curl -s -XPOST 'localhost:9200/logs-app-*/_pit?keep_alive=1m'
À éviterPréférer
from: 100000search_after avec PIT
wildcard en préfixe *texteAnalyseur adapté (n-gram) ou champ dédié
Mettre à jour un document en boucleRéindexer en bulk, modèle append-only
Un index par jour sans rolloverData streams et ILM

Schéma de référence et vérification rapide #

Visualiser le principe et le contrôler en ligne de commande.

Schéma de référence #

Phases ILM d'Elasticsearch
Adaptez les durées à votre besoin métier.
curl -s 'localhost:9200/_cat/indices/logs-*?v&h=index,health,pri,store.size&s=index'

📄 Bonnes pratiques Elasticsearch : mappings, shards, cycle de vie et exploitation →

Mon suivi

  • ⏱ Durée estimée : ≈ 12 min

Connectez-vous pour suivre votre progression et prendre des notes. Se connecter

✉️ Poser une question

Glossaire de la formation

Observabilité

La capacité à connaître l'état interne d'un système à partir des données qu'il émet.Ces données sont classées en 3 piliers : logsmétriquestracesprofil...

Elastic Common Schema (ECS)

Une spécification open source qui permet de structurer vos données de manière homogène dans l'écosystème Elastic.

RBAC (Role-Based Access Control)

Contrôle d'accès basé sur les rôles. Les permissions sont attribuées à des rôles spécifiques (ex: admin, lecteur) plutôt qu'directement aux utilisateu...

Authentification

Processus permettant de vérifier et valider l'identité d'un utilisateur ou d'un système (ex: login/mot de passe, jeton, biométrie).

Autorisation

Processus intervenant après l'authentification pour déterminer si l'entité a les droits et privilèges nécessaires pour accéder à une ressource.

API Key

Clé d'API. Code alphanumérique unique utilisé pour identifier, authentifier et autoriser l'accès à une interface de programmation (API).

Architecture

Conception globale et structurelle d'un système informatique, définissant ses différents composants, leurs relations et les principes guidant son évol...

Repository

Dépôt de stockage centralisé. Peut désigner un dépôt de code source (ex: Git) ou un dépôt d'artefacts et binaires (ex: Harbor, Nexus, Artifactory).

Articles recommandés

Comprendre la notion de score

Le concept de score va permettre à Elasticsearch de classer vos documents par pertinence lors d u...

Comprendre Elastic Common Schema(ECS)

Comme toujours dans nos missions de conseil, nous recommandons aux entreprises d'uniformiser, de ...

Grail : Dynatrace Data Lakehouse

Désormais vous disposez dans Dynatrace (SaaS) d'un Data Lakehouse nommé Grail dont vous pouvez co...

C'est quoi l'observabilité

La capacité à connaître l'état interne d'un système à partir des données que cette dernière émet...

Les types de transactions dans les base de données

Cet article détaille les différences entre trois concepts essentiels dans l'exécution des instruc...

Différences entre Technologies et Services dans Dynatrace

Dans Dynatrace, les concepts de 'Technologie' et de 'Services' aident à organiser et surveiller l...

Dynatrace : Différences entre SQL Modifications, SQL Queries or Procedures, et SQL Transactions

Cet article détaille les différences entre trois concepts essentiels dans l'exécution des instruc...

Types de consommation de licence

Comprendre l'évolution de la facturation dans Dynatrace : la différence entre l'ancien modèle de ...

Les Types de Services Dynatrace : Comprendre et Optimiser Votre Surveillance Applicative

Découvrez les différents types de services que Dynatrace peut surveiller, leur rôle, et comment l...