Elasticsearch en Production : Guide Complet de Déploiement et Optimisation
Maîtrisez le déploiement d'Elasticsearch en production : architecture, configuration, monitoring, sécurité et optimisation des performances.
Publié le
16 décembre 2024
Lecture
22 min
Vues
0
Auteur
Florian Courouge
Elasticsearch
Search
Production
Monitoring
Performance
Security
Table des matières
📋 Vue d'ensemble rapide des sujets traités dans cet article
Cliquez sur les sections ci-dessous pour naviguer rapidement
Elasticsearch en Production : Guide Complet de Déploiement et Optimisation
Elasticsearch est un moteur de recherche et d'analyse distribué puissant, mais sa mise en production nécessite une planification minutieuse. Ce guide couvre tous les aspects critiques pour un déploiement réussi en production.
#!/bin/bash
# elasticsearch-backup.sh
ES_HOST="localhost:9200"
REPOSITORY="production_backup"
SNAPSHOT_NAME="manual-$(date +%Y%m%d-%H%M%S)"
LOG_FILE="/var/log/elasticsearch/backup.log"
log_message() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a $LOG_FILE
}
# Fonction de création de snapshot
create_snapshot() {
log_message "Starting snapshot creation: $SNAPSHOT_NAME"
curl -X PUT "$ES_HOST/_snapshot/$REPOSITORY/$SNAPSHOT_NAME?wait_for_completion=false" \
-H 'Content-Type: application/json' \
-d '{
"indices": "logs-*,metrics-*",
"ignore_unavailable": true,
"include_global_state": true,
"metadata": {
"taken_by": "automated_backup",
"taken_because": "scheduled_backup"
}
}'
if [ $? -eq 0 ]; then
log_message "Snapshot creation initiated successfully"
else
log_message "ERROR: Failed to initiate snapshot creation"
exit 1
fi
}
# Fonction de vérification du statut
check_snapshot_status() {
local snapshot_name=$1
local max_wait=3600 # 1 heure max
local wait_time=0
while [ $wait_time -lt $max_wait ]; do
status=$(curl -s "$ES_HOST/_snapshot/$REPOSITORY/$snapshot_name" | jq -r '.snapshots[0].state')
case $status in
"SUCCESS")
log_message "Snapshot completed successfully: $snapshot_name"
return 0
;;
"FAILED")
log_message "ERROR: Snapshot failed: $snapshot_name"
return 1
;;
"IN_PROGRESS")
log_message "Snapshot in progress: $snapshot_name"
sleep 60
wait_time=$((wait_time + 60))
;;
*)
log_message "Unknown snapshot status: $status"
sleep 30
wait_time=$((wait_time + 30))
;;
esac
done
log_message "ERROR: Snapshot timeout: $snapshot_name"
return 1
}
# Fonction de nettoyage des anciens snapshots
cleanup_old_snapshots() {
log_message "Cleaning up old snapshots"
# Garder seulement les 30 derniers snapshots
old_snapshots=$(curl -s "$ES_HOST/_snapshot/$REPOSITORY/_all" | \
jq -r '.snapshots | sort_by(.start_time) | .[:-30] | .[].snapshot')
for snapshot in $old_snapshots; do
log_message "Deleting old snapshot: $snapshot"
curl -X DELETE "$ES_HOST/_snapshot/$REPOSITORY/$snapshot"
done
}
# Exécution principale
main() {
log_message "Starting backup process"
# Vérifier l'état du cluster
cluster_status=$(curl -s "$ES_HOST/_cluster/health" | jq -r '.status')
if [ "$cluster_status" != "green" ] && [ "$cluster_status" != "yellow" ]; then
log_message "ERROR: Cluster status is $cluster_status, aborting backup"
exit 1
fi
# Créer le snapshot
create_snapshot
# Vérifier le statut
check_snapshot_status $SNAPSHOT_NAME
if [ $? -eq 0 ]; then
# Nettoyage si le snapshot a réussi
cleanup_old_snapshots
log_message "Backup process completed successfully"
else
log_message "ERROR: Backup process failed"
exit 1
fi
}
main "$@"
💡Troubleshooting et Maintenance
Diagnostic des Problèmes Courants
#!/bin/bash
# elasticsearch-diagnostics.sh
ES_HOST="localhost:9200"
echo "=== ELASTICSEARCH DIAGNOSTICS ==="
echo "Timestamp: $(date)"
echo
# 1. État du cluster
echo "=== CLUSTER HEALTH ==="
curl -s "$ES_HOST/_cluster/health?pretty"
echo
# 2. Allocation des shards
echo "=== SHARD ALLOCATION ==="
curl -s "$ES_HOST/_cat/allocation?v"
echo
# 3. Shards non assignés
echo "=== UNASSIGNED SHARDS ==="
curl -s "$ES_HOST/_cat/shards?h=index,shard,prirep,state,unassigned.reason" | grep UNASSIGNED
echo
# 4. Utilisation des nœuds
echo "=== NODE USAGE ==="
curl -s "$ES_HOST/_cat/nodes?v&h=name,heap.percent,ram.percent,cpu,load_1m,disk.used_percent"
echo
# 5. Index les plus volumineux
echo "=== LARGEST INDICES ==="
curl -s "$ES_HOST/_cat/indices?v&s=store.size:desc" | head -10
echo
# 6. Tâches en cours
echo "=== ACTIVE TASKS ==="
curl -s "$ES_HOST/_cat/tasks?v&detailed"
echo
# 7. Statistiques de performance
echo "=== PERFORMANCE STATS ==="
curl -s "$ES_HOST/_nodes/stats/jvm,indices" | jq '.nodes | to_entries[] | {
name: .value.name,
heap_used_percent: .value.jvm.mem.heap_used_percent,
gc_time: .value.jvm.gc.collectors.young.collection_time_in_millis,
indexing_rate: .value.indices.indexing.index_total,
search_rate: .value.indices.search.query_total
}'
Scripts de Maintenance
#!/bin/bash
# elasticsearch-maintenance.sh
ES_HOST="localhost:9200"
LOG_FILE="/var/log/elasticsearch/maintenance.log"
log_message() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a $LOG_FILE
}
# Force merge des index anciens
force_merge_old_indices() {
log_message "Starting force merge of old indices"
# Merger les index de plus de 2 jours
old_indices=$(curl -s "$ES_HOST/_cat/indices?h=index,creation.date.string" | \
awk -v date="$(date -d '2 days ago' '+%Y-%m-%d')" '$2 < date {print $1}')
for index in $old_indices; do
log_message "Force merging index: $index"
curl -X POST "$ES_HOST/$index/_forcemerge?max_num_segments=1&wait_for_completion=false"
done
}
# Nettoyage du cache
clear_caches() {
log_message "Clearing caches"
curl -X POST "$ES_HOST/_cache/clear"
}
# Optimisation des index
optimize_indices() {
log_message "Optimizing indices settings"
# Réduire le refresh interval pour les index anciens
curl -X PUT "$ES_HOST/logs-*/_settings" \
-H 'Content-Type: application/json' \
-d '{
"index": {
"refresh_interval": "60s"
}
}'
}
# Vérification de l'espace disque
check_disk_space() {
log_message "Checking disk space"
disk_usage=$(df -h /data | awk 'NR==2 {print $5}' | sed 's/%//')
if [ $disk_usage -gt 85 ]; then
log_message "WARNING: Disk usage is ${disk_usage}%"
# Déclencher le nettoyage d'urgence
emergency_cleanup
fi
}
# Nettoyage d'urgence
emergency_cleanup() {
log_message "Starting emergency cleanup"
# Supprimer les index les plus anciens
oldest_indices=$(curl -s "$ES_HOST/_cat/indices?h=index,creation.date.string&s=creation.date.string:asc" | head -5 | awk '{print $1}')
for index in $oldest_indices; do
log_message "Deleting old index: $index"
curl -X DELETE "$ES_HOST/$index"
done
}
# Exécution de la maintenance
main() {
log_message "Starting maintenance tasks"
check_disk_space
clear_caches
optimize_indices
force_merge_old_indices
log_message "Maintenance tasks completed"
}
main "$@"
💡Conclusion
Le déploiement d'Elasticsearch en production nécessite une approche méthodique qui couvre :
Architecture et Planification
•Dimensionnement approprié des nœuds
•Répartition des rôles
•Planification de la capacité
Configuration et Optimisation
•Tuning système et JVM
•Configuration des index et mappings
•Optimisation des performances
Sécurité
•Authentification et autorisation
•Chiffrement des communications
•Audit et monitoring
Opérations
•Monitoring continu
•Sauvegarde automatisée
•Maintenance préventive
Troubleshooting
•Diagnostic des problèmes
•Scripts de maintenance
•Procédures de récupération
Les techniques et scripts présentés dans cet article vous permettront de déployer et maintenir un cluster Elasticsearch robuste et performant en production. N'oubliez pas que chaque environnement est unique et nécessite des ajustements spécifiques.
Pour un accompagnement dans le déploiement de votre infrastructure Elasticsearch, contactez-moi pour une consultation personnalisée.
À propos de l'auteur
Florian Courouge - Expert DevOps et Apache Kafka avec plus de 5 ans d'expérience dans l'architecture de systèmes distribués et l'automatisation d'infrastructures.
Cet article vous a été utile ?
Découvrez mes autres articles techniques ou contactez-moi pour discuter de vos projets DevOps et Kafka.