Gestion des journaux · 20 min read · Feb 02, 2026

Installer ELK comme serveur de gestion de journaux centralisé sur CentOS 7

Ce tutoriel explique comment configurer un serveur de gestion de journaux centralisé en utilisant la pile ELK sur CentOS 7. Comme quiconque ne le sait pas déjà, ELK est la combinaison de 3 services : ElasticSearch, Logstash et Kibana. Pour construire un serveur de gestion de journaux centralisé complet en utilisant ce concept, il faudrait avoir chacun de ces paquets car ils servent chacun un but différent et sont liés les uns aux autres. En gros, cela fonctionne ensemble comme ceci :

  1. Pour chaque client que vous souhaitez gérer, il produira son propre journal des services associés.
  2. Pour le serveur qui sera utilisé pour gérer toutes les informations de journalisation de chaque client, il utilisera le paquet LogStash pour collecter et transformer les données en une valeur relative. Par définition, c’est un pipeline de traitement de données côté serveur open source qui ingère des données provenant de multiples sources simultanément, les transforme.
  3. Une fois les données collectées et transformées, le serveur de gestion utilisera ElasticSearch pour aider à analyser les données en une valeur pertinente. Vous pouvez utiliser un langage de requête général si vous souhaitez produire un rapport lié selon vos besoins.
  4. Une fois que les données pertinentes ont été vérifiées et analysées, c’est là que le paquet Kibana entre en jeu car il peut aider à visualiser et gérer les données pertinentes dans une vue appropriée ou les combiner dans un tableau de bord attrayant pour une compréhension facile.

L’image ci-dessous résume le processus de flux de travail :

1. Remarque préliminaire

Pour ce tutoriel, j’utilise CentOS Linux 7.4 dans la version 64 bits. Dans ce tutoriel, nous utiliserons 3 serveurs : le premier sera utilisé comme serveur de gestion et les 2 autres seront utilisés comme clients. Pour cet exercice, nous utiliserons le serveur de gestion pour surveiller un service MySQL existant qui a déjà été configuré et fonctionne sous chaque client. Comme MySQL est un service de base de données principalement utilisé à des fins OLTP, nous ferons en sorte que notre serveur de gestion consigne 2 processus de journalisation, à savoir la vérification de l’état du service MySQL lui-même et la transaction de requête lente. À la fin de ce tutoriel, nous verrons que toute information consignée à partir de n’importe quel service MySQL à l’intérieur du client dédié peut être vue, visualisée et analysée simultanément depuis le serveur de gestion en temps réel.

2. Phase d’installation

Pour la phase d’installation, nous commencerons par l’installation de FileBeat sur les deux serveurs de base de données MySQL qui agissent comme clients. Commençons le processus, ci-dessous les étapes :

 [root@mysql_db1 opt]# cd   
[root@mysql_db1 ~]# cd /opt/   
[root@mysql_db1 opt]# wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.2.1-x86_64.rpm   
--2018-06-09 10:50:46-- https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.2.1-x86_64.rpm   
Résolution des artifacts.elastic.co (artifacts.elastic.co)... 107.21.237.188, 107.21.253.15, 184.73.245.233, ...   
Connexion à artifacts.elastic.co (artifacts.elastic.co)|107.21.237.188|:443... connecté.   
Requête HTTP envoyée, attente de réponse... 200 OK   
Longueur : 12697093 (12M) [binary/octet-stream]   
Enregistrement dans : ‘filebeat-6.2.1-x86_64.rpm’   
  
100%[==============================================================================>] 12,697,093 2.20MB/s dans 6.9s   
  
2018-06-09 10:51:00 (1.75 MB/s) - ‘filebeat-6.2.1-x86_64.rpm’ enregistré [12697093/12697093]   
  
[root@mysql_db1 opt]# yum localinstall -y filebeat-6.2.1-x86_64.rpm   
Plugins chargés : fastestmirror, ovl   
Examen de filebeat-6.2.1-x86_64.rpm : filebeat-6.2.1-1.x86_64   
Marquage de filebeat-6.2.1-x86_64.rpm pour installation   
Résolution des dépendances   
--> Exécution de la vérification de transaction   
---> Package filebeat.x86_64 0:6.2.1-1 sera installé   
--> Résolution des dépendances terminée   
  
Dépendances résolues   
  
========================================================================================================================   
Package Arch Version Repository Size   
========================================================================================================================   
Installation :   
filebeat x86_64 6.2.1-1 /filebeat-6.2.1-x86_64 49 M   
  
Résumé de la transaction   
========================================================================================================================   
Installer 1 package   
  
Taille totale : 49 M   
Taille installée : 49 M   
Téléchargement des paquets :   
Exécution de la vérification de transaction   
Exécution du test de transaction   
Test de transaction réussi   
Exécution de la transaction   
Installation : filebeat-6.2.1-1.x86_64 1/1   
Vérification : filebeat-6.2.1-1.x86_64 1/1   
  
Installé :   
filebeat.x86_64 0:6.2.1-1   
  
Terminé !   

Une fois terminé, nous allons lister le module par défaut activé par le paquet FileBeat et activer le module mysql qui est nécessaire pour notre cas ici. Ci-dessous les étapes :

 [root@mysql_db1 opt]# filebeat modules list   
Activé :   
  
Désactivé :   
apache2   
auditd   
icinga   
kafka   
logstash   
mysql   
nginx   
osquery   
postgresql   
redis   
system   
traefik   
[root@mysql_db1 opt]# filebeat modules enable mysql   
Module mysql activé   

Fait, maintenant éditons la configuration nécessaire pour le module mysql que nous avons activé tout à l’heure. Par défaut, une fois que nous avons activé le module mysql à partir du paquet filebeat, il créera automatiquement un fichier yaml à l’intérieur du répertoire modules.d. Pourtant, si le fichier n’a pas été créé, n’hésitez pas à créer un nouveau fichier yaml à l’intérieur du même emplacement. Ci-dessous les étapes :

 [root@mysql_db1 opt]# vi /etc/filebeat/modules.d/mysql.yml   
- module: mysql   
error:   
enabled: true   
var.paths: ["/var/lib/mysql/mysql-error.log*"]   
  
slowlog:   
enabled: true   
var.paths: ["/var/lib/mysql/log-slow-queries.log*"]   

Comme indiqué ci-dessus, nous avons décidé de consigner 2 processus de journalisation du service MySQL, à savoir la vérification de l’état de la base de données elle-même et le journal des requêtes lentes.

Maintenant, une fois que tout est fait, faisons quelques configurations dans le fichier de configuration principal pour filebeat sous le fichier filebeat.yml. Ci-dessous les configurations définies :

 [root@mysql_db1 opt]# vi /etc/filebeat/filebeat.yml   
#=========================== Prospecteurs de Filebeat =============================   
  
filebeat.prospectors:   
  
- type: log   
  
enabled: false   
paths:   
- /var/lib/mysql/mysql-error.log   
- /var/lib/mysql/log-slow-queries.log   
  
#============================= Modules de Filebeat ===============================   
  
filebeat.config.modules:   
path: ${path.config}/modules.d/*.yml   
reload.enabled: false   
  
#==================== Paramètre de modèle Elasticsearch ==========================   
  
setup.template.settings:   
index.number_of_shards: 3   
  
#================================ Général =====================================   
  
setup.kibana:   
  
#----------------------------- Sortie Logstash --------------------------------   
output.logstash:   
hosts: ["172.17.0.6:5044"]   

Remarquez ci-dessus que nous avons défini une adresse IP pour l’hôte logstash qui est 172.17.0.6. Cette IP est l’adresse de notre serveur de gestion centralisé qui collectera directement les données de journalisation. J’ai défini l’IP codée en dur car je n’ai pas effectué de modifications alternatives dans le fichier /etc/hosts et je n’ai pas utilisé de serveur DNS pour ce tutoriel. Pourtant, n’hésitez pas à utiliser le nom d’hôte du serveur de gestion si vous avez effectué des modifications alternatives.

Comme tout a été configuré selon le plan, lançons les services filebeat. Ci-dessous les étapes :

 [root@mysql_db1 opt]# filebeat setup -e   
2018-06-09T11:04:37.277Z INFO instance/beat.go:468 Chemin d'accueil : [/usr/share/filebeat] Chemin de configuration : [/etc/filebeat] Chemin de données : [/var/lib/filebeat] Chemin des journaux : [/var/log/filebeat]   
2018-06-09T11:04:37.277Z INFO instance/beat.go:475 UUID du Beat : 98503460-035e-4476-8e4d-10470433dba5   
2018-06-09T11:04:37.277Z INFO instance/beat.go:213 Configuration du Beat : filebeat; Version : 6.2.1   
2018-06-09T11:04:37.277Z INFO pipeline/module.go:76 Nom du Beat : lara   
2018-06-09T11:04:37.278Z ERROR instance/beat.go:667 Sortie : Chargement du modèle demandé mais la sortie Elasticsearch n'est pas configurée/activée   
Sortie : Chargement du modèle demandé mais la sortie Elasticsearch n'est pas configurée/activée   
  
[root@mysql_db1 opt]# filebeat -e &   
[1] 22010   
[root@mysql_db1 opt]# 2018-06-09T12:45:18.812Z INFO instance/beat.go:468 Chemin d'accueil : [/usr/share/filebeat] Chemin de configuration : [/etc/filebeat] Chemin de données : [/var/lib/filebeat] Chemin des journaux : [/var/log/filebeat]   
2018-06-09T12:45:18.813Z INFO instance/beat.go:475 UUID du Beat : 98503460-035e-4476-8e4d-10470433dba5   
2018-06-09T12:45:18.813Z INFO instance/beat.go:213 Configuration du Beat : filebeat; Version : 6.2.1   
2018-06-09T12:45:18.813Z INFO pipeline/module.go:76 Nom du Beat : lara   
2018-06-09T12:45:18.813Z INFO [monitoring] log/log.go:97 Démarrage de la journalisation des métriques toutes les 30s   
2018-06-09T12:45:18.813Z INFO instance/beat.go:301 filebeat commence à s'exécuter.   
2018-06-09T12:45:18.814Z INFO registrar/registrar.go:71 Aucun fichier de registre trouvé sous : /var/lib/filebeat/registry. Création d'un nouveau fichier de registre.   
2018-06-09T12:45:18.819Z INFO registrar/registrar.go:108 Chargement des données du registraire à partir de /var/lib/filebeat/registry   
2018-06-09T12:45:18.819Z INFO registrar/registrar.go:119 États chargés à partir du registraire : 0   
2018-06-09T12:45:18.819Z WARN beater/filebeat.go:261 Filebeat est incapable de charger les pipelines Ingest Node pour les modules configurés car la sortie Elasticsearch n'est pas configurée/activée. Si vous avez déjà chargé les pipelines Ingest Node ou utilisez des pipelines Logstash, vous pouvez ignorer cet avertissement.   
2018-06-09T12:45:18.820Z INFO crawler/crawler.go:48 Chargement des prospecteurs : 1   
2018-06-09T12:45:18.821Z INFO log/prospector.go:111 Chemins configurés : [/var/lib/mysql/log-slow-queries.log*]   
2018-06-09T12:45:18.822Z INFO log/prospector.go:111 Chemins configurés : [/var/lib/mysql/mysql-error.log*]   
2018-06-09T12:45:18.822Z INFO crawler/crawler.go:82 Chargement et démarrage des prospecteurs terminés. Prospecteurs activés : 0   
2018-06-09T12:45:18.822Z INFO cfgfile/reload.go:127 Rechargement de la configuration démarré   
2018-06-09T12:45:18.840Z INFO log/prospector.go:111 Chemins configurés : [/var/lib/mysql/log-slow-queries.log*]   
2018-06-09T12:45:18.840Z INFO log/prospector.go:111 Chemins configurés : [/var/lib/mysql/mysql-error.log*]   
2018-06-09T12:45:18.840Z INFO cfgfile/reload.go:258 Démarrage de 1 coureur ...   
2018-06-09T12:45:18.840Z INFO cfgfile/reload.go:219 Chargement des fichiers de configuration terminé.   
2018-06-09T12:45:18.841Z INFO log/harvester.go:216 Le récolteur a démarré pour le fichier : /var/lib/mysql/mysql-error.log   
2018-06-09T12:45:18.841Z INFO log/harvester.go:216 Le récolteur a démarré pour le fichier : /var/lib/mysql/log-slow-queries.log   
2018-06-09T12:45:20.841Z ERROR pipeline/output.go:74 Échec de la connexion : dial tcp 172.17.0.6:5044 : getsockopt : connexion refusée   
2018-06-09T12:45:22.842Z ERROR pipeline/output.go:74 Échec de la connexion : dial tcp 172.17.0.6:5044 : getsockopt : connexion refusée   
2018-06-09T12:45:26.842Z ERROR pipeline/output.go:74 Échec de la connexion : dial tcp 172.17.0.6:5044 : getsockopt : connexion refusée   
  
[root@mysql_db1 ~]# tail -f /var/log/filebeat/filebeat   
2018-06-09T10:53:28.853Z INFO instance/beat.go:468 Chemin d'accueil : [/usr/share/filebeat] Chemin de configuration : [/etc/filebeat] Chemin de données : [/var/lib/filebeat] Chemin des journaux : [/var/log/filebeat]   
2018-06-09T10:53:28.853Z INFO instance/beat.go:475 UUID du Beat : 98503460-035e-4476-8e4d-10470433dba5   

Remarquez qu’une fois que vous démarrez le service filebeat, une erreur apparaît dans le journal. Cela est dû au fait que le serveur de gestion qui a été assigné n’était pas encore configuré. Pour la phase initiale, vous pouvez ignorer le journal d’erreurs car il se rétablira automatiquement une fois que notre serveur de gestion aura été configuré et commencé à collecter.

Comme la configuration pour le client est terminée, vous pouvez continuer à répliquer les étapes sur l’autre serveur MySQL qui agit également comme client.

En avançant, nous allons continuer avec la configuration du serveur de gestion lui-même.

3. Phase d’installation (côté serveur de gestion centralisé)

Maintenant que nous avons terminé la configuration pour la préparation côté client, lançons la configuration nécessaire pour le serveur de gestion lui-même. Comme mentionné brièvement, il y a 3 paquets principaux qui doivent être installés et configurés pour le serveur de gestion, à savoir ElasticSearch, LogStash et Kibana.

Pour cette phase, nous allons commencer par l’installation et la configuration nécessaires pour ElasticSearch, ci-dessous les étapes :

 [root@elk_master ~]# cd /opt/   
[root@elk_master opt]# ls   
[root@elk_master opt]# wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.2.1.tar.gz   
--2018-06-09 12:47:59-- https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.2.1.tar.gz   
Résolution des artifacts.elastic.co (artifacts.elastic.co)... 107.21.237.188, 54.235.82.130, 107.21.253.15, ...   
Connexion à artifacts.elastic.co (artifacts.elastic.co)|107.21.237.188|:443... connecté.   
Requête HTTP envoyée, attente de réponse... 200 OK   
Longueur : 29049089 (28M) [binary/octet-stream]   
Enregistrement dans : ‘elasticsearch-6.2.1.tar.gz’   
  
100%[==============================================================================>] 29,049,089 2.47MB/s dans 16s   
  
2018-06-09 12:48:21 (1.76 MB/s) - ‘elasticsearch-6.2.1.tar.gz’ enregistré [29049089/29049089]   
  
[root@elk_master opt]#   
[root@elk_master opt]#   
[root@elk_master opt]# tar -zxvf elasticsearch-6.2.1.tar.gz   
  
[root@elk_master opt]# ln -s /opt/elasticsearch-6.2.1 /opt/elasticsearch   
[root@elk_master opt]# ll   
total 28372   
lrwxrwxrwx 1 root root 24 Jun 9 12:49 elasticsearch -> /opt/elasticsearch-6.2.1   
drwxr-xr-x 8 root root 143 Feb 7 19:36 elasticsearch-6.2.1   
-rw-r--r-- 1 root root 29049089 May 15 04:56 elasticsearch-6.2.1.tar.gz   

Une fois l’installation d’elasticsearch terminée, continuons la partie configuration. Pour la configuration, nous allons assigner le répertoire /data/data pour stocker les données de journalisation collectées qui ont été analysées. Le répertoire lui-même sera également utilisé pour stocker l’index qui sera utilisé par elasticSearch lui-même pour des requêtes plus rapides. Pour le répertoire /data/logs, il sera utilisé par elasticSearch lui-même pour ses propres besoins de journalisation. Ci-dessous les étapes :

 [root@elk_master opt]# mkdir -p /data/data   
[root@elk_master opt]# mkdir -p /data/logs   
[root@elk_master opt]#   
[root@elk_master opt]# cd elasticsearch   
[root@elk_master elasticsearch]# ls   
bin config lib LICENSE.txt logs modules NOTICE.txt plugins README.textile   
[root@elk_master elasticsearch]# cd config/   
[root@elk_master config]# vi elasticsearch.yml   
# ---------------------------------- Cluster -----------------------------------   
cluster.name: log_cluster   
#   
# ------------------------------------ Node ------------------------------------   
#   
node.name: elk_master   
#   
# ----------------------------------- Paths ------------------------------------   
#   
path.data: /data/data   
path.logs: /data/logs   
#   
network.host: 172.17.0.6   

Fait, pour qu’ElasticSearch fonctionne, il nécessite que Java soit configuré. Ci-dessous les étapes pour installer et configurer Java sur le serveur.

 [root@elk_master config]# wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/jdk-8u131-linux-x64.rpm"   
--2018-06-09 12:57:05-- http://download.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/jdk-8u131-linux-x64.rpm   
Résolution de download.oracle.com (download.oracle.com)... 23.49.16.62   
Connexion à download.oracle.com (download.oracle.com)|23.49.16.62|:80... connecté.   
Requête HTTP envoyée, attente de réponse... 302 Déplacé temporairement   
Emplacement : https://edelivery.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/jdk-8u131-linux-x64.rpm [suivant]   
--2018-06-09 12:57:10-- https://edelivery.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/jdk-8u131-linux-x64.rpm   
Résolution de edelivery.oracle.com (edelivery.oracle.com)... 104.103.48.174, 2600:1417:58:181::2d3e, 2600:1417:58:188::2d3e   
Connexion à edelivery.oracle.com (edelivery.oracle.com)|104.103.48.174|:443... connecté.   
Requête HTTP envoyée, attente de réponse... 302 Déplacé temporairement   
Emplacement : http://download.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/jdk-8u131-linux-x64.rpm?AuthParam=1528549151_b1fd01d854bc0423600a83c36240028e [suivant]   
--2018-06-09 12:57:11-- http://download.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/jdk-8u131-linux-x64.rpm?AuthParam=1528549151_b1fd01d854bc0423600a83c36240028e   
Connexion à download.oracle.com (download.oracle.com)|23.49.16.62|:80... connecté.   
Requête HTTP envoyée, attente de réponse... 200 OK   
Longueur : 169983496 (162M) [application/x-redhat-package-manager]   
Enregistrement dans : ‘jdk-8u131-linux-x64.rpm’   
  
100%[==============================================================================>] 169,983,496 2.56MB/s dans 64s   
  
2018-06-09 12:58:15 (2.54 MB/s) - ‘jdk-8u131-linux-x64.rpm’ enregistré [169983496/169983496]   
  
[root@elk_master config]# yum localinstall -y jdk-8u131-linux-x64.rpm   
  
[root@elk_master config]# vi /root/.bash_profile   
export JAVA_HOME=/usr/java/jdk1.8.0_131   
PATH=$JAVA_HOME/bin:$PATH:$HOME/bin   
export PATH   
  
[root@elk_master config]# . /root/.bash_profile   
[root@elk_master config]# java -version   
java version "1.8.0_131"   
Java(TM) SE Runtime Environment (build 1.8.0_131-b11)   
Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mode mixte)   

Fait, maintenant elasticSearch a été installé et configuré sur le serveur. Pourtant, en raison de certaines politiques de sécurité, elasticSearch est interdit d’être exécuté par l’utilisateur root, nous allons donc créer un utilisateur supplémentaire pour être le propriétaire du service elasticSearch et l’exécuter. Ci-dessous les étapes pour créer l’utilisateur dédié à cela :

 [root@elk_master config]# useradd -s /bin/bash shahril   
[root@elk_master config]# passwd shahril   
Changement de mot de passe pour l'utilisateur shahril.   
Nouveau mot de passe :   
MOT DE PASSE FAIBLE : Le mot de passe échoue à la vérification du dictionnaire - il est trop simpliste/systématique   
Retapez le nouveau mot de passe :   
passwd : tous les jetons d'authentification mis à jour avec succès.   
  
[root@elk_master config]# chown -R shahril:shahril /data/   
[root@elk_master config]# sysctl -w vm.max_map_count=262144   
vm.max_map_count = 262144   

Une fois terminé, connectez-vous en tant qu’utilisateur et vous pouvez démarrer les services elasticSearch.

 [root@elk_master config]# su - shahril   
Dernière connexion : Sam Juin 9 13:03:07 UTC 2018 sur pts/1   
[shahril@elk_master ~]$   
[shahril@elk_master ~]$   
[shahril@elk_master ~]$   
[shahril@elk_master ~]$ /opt/elasticsearch/bin/elasticsearch &   
[1] 7295   
[shahril@elk_master ~]$ [2018-06-09T13:06:26,667][INFO ][o.e.n.Node ] [elk_master] initialisation ...   
[2018-06-09T13:06:26,721][INFO ][o.e.e.NodeEnvironment ] [elk_master] utilisant [1] chemins de données, montages [[/ (rootfs)]], espace utilisable net [394.3 Go], espace total net [468.2 Go], types [rootfs]   
[2018-06-09T13:06:26,722][INFO ][o.e.e.NodeEnvironment ] [elk_master] taille de tas [990.7 Mo], pointeurs d'objet ordinaires compressés [true]   
[2018-06-09T13:06:26,723][INFO ][o.e.n.Node ] [elk_master] nom du nœud [elk_master], ID du nœud [xjNoA9mMSGiXYmFPRNlXBg]   
[2018-06-09T13:06:26,723][INFO ][o.e.n.Node ] [elk_master] version[6.2.1], pid[7295], build[7299dc3/2018-02-07T19:34:26.990113Z], OS[Linux/3.10.0-693.17.1.el7.x86_64/amd64], JVM[Oracle Corporation/Java HotSpot(TM) 64-Bit Server VM/1.8.0_131/25.131-b11]   
[2018-06-09T13:06:26,723][INFO ][o.e.n.Node ] [elk_master] arguments JVM [-Xms1g, -Xmx1g, -XX:+UseConcMarkSweepGC, -XX:CMSInitiatingOccupancyFraction=75, -XX:+UseCMSInitiatingOccupancyOnly, -XX:+AlwaysPreTouch, -Xss1m, -Djava.awt.headless=true, -Dfile.encoding=UTF-8, -Djna.nosys=true, -XX:-OmitStackTraceInFastThrow, -Dio.netty.noUnsafe=true, -Dio.netty.noKeySetOptimization=true, -Dio.netty.recycler.maxCapacityPerThread=0, -Dlog4j.shutdownHookEnabled=false, -Dlog4j2.disable.jmx=true, -Djava.io.tmpdir=/tmp/elasticsearch.U6ilAwt9, -XX:+HeapDumpOnOutOfMemoryError, -XX:+PrintGCDetails, -XX:+PrintGCDateStamps, -XX:+PrintTenuringDistribution, -XX:+PrintGCApplicationStoppedTime, -Xloggc:logs/gc.log, -XX:+UseGCLogFileRotation, -XX:NumberOfGCLogFiles=32, -XX:GCLogFileSize=64m, -Des.path.home=/opt/elasticsearch, -Des.path.conf=/opt/elasticsearch/config]   
[2018-06-09T13:06:27,529][INFO ][o.e.p.PluginsService ] [elk_master] module chargé [aggs-matrix-stats]   
[2018-06-09T13:06:27,529][INFO ][o.e.p.PluginsService ] [elk_master] module chargé [analysis-common]   
[2018-06-09T13:06:27,529][INFO ][o.e.p.PluginsService ] [elk_master] module chargé [ingest-common]   
[2018-06-09T13:06:27,530][INFO ][o.e.p.PluginsService ] [elk_master] module chargé [lang-expression]   
[2018-06-09T13:06:27,530][INFO ][o.e.p.PluginsService ] [elk_master] module chargé [lang-mustache]   
[2018-06-09T13:06:27,530][INFO ][o.e.p.PluginsService ] [elk_master] module chargé [lang-painless]   
[2018-06-09T13:06:27,530][INFO ][o.e.p.PluginsService ] [elk_master] module chargé [mapper-extras]   
[2018-06-09T13:06:27,530][INFO ][o.e.p.PluginsService ] [elk_master] module chargé [parent-join]   
[2018-06-09T13:06:27,530][INFO ][o.e.p.PluginsService ] [elk_master] module chargé [percolator]   
[2018-06-09T13:06:27,531][INFO ][o.e.p.PluginsService ] [elk_master] module chargé [rank-eval]   
[2018-06-09T13:06:27,532][INFO ][o.e.p.PluginsService ] [elk_master] module chargé [reindex]   
[2018-06-09T13:06:27,532][INFO ][o.e.p.PluginsService ] [elk_master] module chargé [repository-url]   
[2018-06-09T13:06:27,533][INFO ][o.e.p.PluginsService ] [elk_master] module chargé [transport-netty4]   
[2018-06-09T13:06:27,533][INFO ][o.e.p.PluginsService ] [elk_master] aucun plugin chargé   

Excellent, maintenant elasticSearch est opérationnel sans aucun problème, vous remarquerez que des ports supplémentaires sont établis sur le serveur liés au service elasticSearch. Vous pouvez vérifier les ports listés comme suit :

 [root@elk_master config]# netstat -apn|grep -i :9   
tcp 0 0 172.17.0.6:9200 0.0.0.0:* LISTEN 7295/java   
tcp 0 0 172.17.0.6:9300 0.0.0.0:* LISTEN 7295/java   

Maintenant, passons à la configuration et à l’installation des services logstash. Ci-dessous les étapes nécessaires pour le processus d’installation :

 [root@elk_master opt]# wget https://artifacts.elastic.co/downloads/logstash/logstash-6.2.1.rpm   
--2018-06-09 13:07:51-- https://artifacts.elastic.co/downloads/logstash/logstash-6.2.1.rpm   
Résolution des artifacts.elastic.co (artifacts.elastic.co)... 107.21.253.15, 23.21.67.46, 107.21.237.188, ...   
Connexion à artifacts.elastic.co (artifacts.elastic.co)|107.21.253.15|:443... connecté.   
Requête HTTP envoyée, attente de réponse... 200 OK   
Longueur : 140430729 (134M) [binary/octet-stream]   
Enregistrement dans : ‘logstash-6.2.1.rpm’   
  
100%[==============================================================================>] 140,430,729 2.19MB/s dans 60s   
  
2018-06-09 13:08:57 (2.24 MB/s) - ‘logstash-6.2.1.rpm’ enregistré [140430729/140430729]   
  
[root@elk_master opt]# yum localinstall -y logstash-6.2.1.rpm   
Plugins chargés : fastestmirror, ovl   
Examen de logstash-6.2.1.rpm : 1:logstash-6.2.1-1.noarch   
Marquage de logstash-6.2.1.rpm pour installation   
Résolution des dépendances   
--> Exécution de la vérification de transaction   
---> Package logstash.noarch 1:6.2.1-1 sera installé   
--> Résolution des dépendances terminée   
  
Dépendances résolues   
  
========================================================================================================================   
Package Arch Version Repository Size   
========================================================================================================================   
Installation :   
logstash noarch 1:6.2.1-1 /logstash-6.2.1 224 M   
  
Résumé de la transaction   
========================================================================================================================   
Installer 1 package   
  
Taille totale : 224 M   
Taille installée : 224 M   
Téléchargement des paquets :   
Exécution de la vérification de transaction   
Exécution du test de transaction   
Test de transaction réussi   
Exécution de la transaction   
Installation : 1:logstash-6.2.1-1.noarch 1/1   
Utilisation du fichier startup.options fourni : /etc/logstash/startup.options   
Script de démarrage système créé avec succès pour Logstash   
Vérification : 1:logstash-6.2.1-1.noarch 1/1   
  
Installé :   
logstash.noarch 1:6.2.1-1   
  
Terminé !   

Une fois l’installation terminée, appliquez la configuration nécessaire comme suit :

 [root@elk_master opt]# vi /etc/logstash/conf.d/02-mysql-log.conf   
  
input {   
beats {   
port => 5044   
host => "0.0.0.0"   
}   
}   
  
filter {   
if [fileset][module] == "mysql" {   
if [fileset][name] == "error" {   
grok {   
match => { "message" => ["%{LOCALDATETIME:[mysql][error][timestamp]} (\[%{DATA:[mysql][error][level]}\] )?%{GREEDYDATA:[mysql][error][message]}",   
"%{TIMESTAMP_ISO8601:[mysql][error][timestamp]} %{NUMBER:[mysql][error][thread_id]} \[%{DATA:[mysql][error][level]}\] %{GREEDYDATA:[mysql][error][message1]}",   
"%{GREEDYDATA:[mysql][error][message2]}"] }   
pattern_definitions => {   
"LOCALDATETIME" => "[0-9]+ %{TIME}"   
}   
remove_field => "message"   
}   
mutate {   
rename => { "[mysql][error][message1]" => "[mysql][error][message]" }   
}   
mutate {   
rename => { "[mysql][error][message2]" => "[mysql][error][message]" }   
}   
date {   
match => [ "[mysql][error][timestamp]", "ISO8601", "YYMMdd H:m:s" ]   
remove_field => "[mysql][error][time]"   
}   
}   
else if [fileset][name] == "slowlog" {   
grok {   
match => { "message" => ["^# User@Host: %{USER:[mysql][slowlog][user]}(\[[^\]]+\])? @ %{HOSTNAME:[mysql][slowlog][host]} \[(IP:[mysql][slowlog][ip])?\](\s*Id:\s* %{NUMBER:[mysql][slowlog][id]})?\n# Query_time: %{NUMBER:[mysql][slowlog][query_time][sec]}\s* Lock_time: %{NUMBER:[mysql][slowlog][lock_time][sec]}\s* Rows_sent: %{NUMBER:[mysql][slowlog][rows_sent]}\s* Rows_examined: %{NUMBER:[mysql][slowlog][rows_examined]}\n(SET timestamp=%{NUMBER:[mysql][slowlog][timestamp]};\n)?%{GREEDYMULTILINE:[mysql][slowlog][query]}"] }   
pattern_definitions => {   
"GREEDYMULTILINE" => "(.|\n)*"   
}   
remove_field => "message"   
}   
date {   
match => [ "[mysql][slowlog][timestamp]", "UNIX" ]   
}   
mutate {   
gsub => ["[mysql][slowlog][query]", "\n# Time: [0-9]+ [0-9][0-9]:[0-9][0-9]:[0-9][0-9](\\.[0-9]+)?$", ""]   
}   
}   
}   
  
output {   
elasticsearch {   
hosts => "172.17.0.6"   
manage_template => false   
index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"   
}   
}   

Notez que dans la configuration ci-dessus, nous avons défini l’entrée à être prise à partir du service filebeat côté client qui utilise le port 5044. Nous avons également défini une annotation appropriée pour logstash afin d’aligner les données brutes prises de chaque côté client. Cela est nécessaire afin qu’il soit plus facile d’être visualisé et analysé du côté d’elasticSearch.

Ensuite, nous devons installer le module filebeats pour logstash afin que logstash puisse capturer et explorer les données brutes du côté client.

 [root@elk_master opt]# /usr/share/logstash/bin/logstash-plugin install logstash-input-beats   
Validant logstash-input-beats   
Installation réussie   

Comme l’installation et la configuration nécessaires pour logstash sont terminées, nous pouvons démarrer les services directement. Ci-dessous les étapes :

 [root@elk_master opt]# service logstash restart   
Redirection vers /bin/systemctl restart logstash.service   
  
[root@elk_master opt]# service logstash status   
Redirection vers /bin/systemctl status logstash.service   
? logstash.service - logstash   
Chargé : chargé (/etc/systemd/system/logstash.service; désactivé; prédéfini du fournisseur : désactivé)   
Actif : actif (en cours d'exécution) depuis Sam 2018-06-09 13:17:40 UTC; 5s ago   
PID principal : 8106 (java)   
CGroup: /docker/2daaf895e0efa67ef70dbabd87b56d53815e94ff70432f692385f527e2dc488b/system.slice/logstash.service   
??8106 /bin/java -Xms256m -Xmx1g -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFracti...   
  
Jun 09 13:17:40 elk_master systemd[1]: Démarré logstash.   
Jun 09 13:17:40 elk_master systemd[1]: Démarrage de logstash...   
[root@elk_master opt]#   
  
[root@elk_master opt]# tail -f /var/log/logstash/logstash-plain.log   
[2018-06-09T13:17:59,496][INFO ][logstash.outputs.elasticsearch] URLs de pool Elasticsearch mises à jour {:changes=>{:removed=>[], :added=>[http://172.17.0.6:9200/]}}   
[2018-06-09T13:17:59,498][INFO ][logstash.outputs.elasticsearch] Exécution d'une vérification de santé pour voir si une connexion Elasticsearch fonctionne {:healthcheck_url=>http://172.17.0.6:9200/, :path=>"/"}   
[2018-06-09T13:17:59,976][WARN ][logstash.outputs.elasticsearch] Connexion restaurée à l'instance ES {:url=>"http://172.17.0.6:9200/"}   
[2018-06-09T13:18:00,083][INFO ][logstash.outputs.elasticsearch] Version de sortie ES déterminée {:es_version=>nil}   
[2018-06-09T13:18:00,083][WARN ][logstash.outputs.elasticsearch] Cluster 6.x et supérieur détecté : le champ d'événement `type` ne sera pas utilisé pour déterminer le type de document {:es_version=>6}   
[2018-06-09T13:18:00,095][INFO ][logstash.outputs.elasticsearch] Nouvelle sortie Elasticsearch {:class=>"LogStash::Outputs::ElasticSearch", :hosts=>["//172.17.0.6"]}   
[2018-06-09T13:18:00,599][INFO ][logstash.inputs.beats ] Entrées Beats : Démarrage de l'écouteur d'entrée {:address=>"0.0.0.0:5044"}   
[2018-06-09T13:18:00,652][INFO ][logstash.pipeline ] Pipeline démarré avec succès {:pipeline_id=>"main", :thread=>"#"}   
[2018-06-09T13:18:00,663][INFO ][org.logstash.beats.Server] Démarrage du serveur sur le port : 5044   
[2018-06-09T13:18:00,660][INFO ][logstash.agent ] Pipelines en cours d'exécution {:count=>1, :pipelines=>["main"]}   
[2018-06-09T13:18:24,060][INFO ][o.e.c.m.MetaDataCreateIndexService] [elk_master] [filebeat-6.2.1-2018.06.04] création d'index, cause [auto(bulk api)], templates [], shards [5]/[1], mappings []   
[2018-06-09T13:18:24,189][INFO ][o.e.c.m.MetaDataCreateIndexService] [elk_master] [filebeat-6.2.1-2018.06.09] création d'index, cause [auto(bulk api)], templates [], shards [5]/[1], mappings []   
[2018-06-09T13:18:24,288][INFO ][o.e.c.m.MetaDataCreateIndexService] [elk_master] [filebeat-6.2.1-2018.06.08] création d'index, cause [auto(bulk api)], templates [], shards [5]/[1], mappings []   
[2018-06-09T13:18:24,591][INFO ][o.e.c.m.MetaDataMappingService] [elk_master] [filebeat-6.2.1-2018.06.04/yPD91Ww0SD2ei4YI-FgLgQ] create_mapping [doc]   
[2018-06-09T13:18:24,781][INFO ][o.e.c.m.MetaDataMappingService] [elk_master] [filebeat-6.2.1-2018.06.08/Qnv0gplFTgW0z1C6haZESg] create_mapping [doc]   
[2018-06-09T13:18:24,882][INFO ][o.e.c.m.MetaDataMappingService] [elk_master] [filebeat-6.2.1-2018.06.09/dihjTJw3SjGncXYln2MXbA] create_mapping [doc]   
[2018-06-09T13:18:24,996][INFO ][o.e.c.m.MetaDataMappingService] [elk_master] [filebeat-6.2.1-2018.06.09/dihjTJw3SjGncXYln2MXbA] update_mapping [doc]   

Comme vous pouvez le voir, maintenant le service logstash a démarré avec succès et commence à collecter les données de chaque côté client. En alternative, vous pouvez utiliser la commande curl pour voir l’état et les mises à jour du côté logstash. Ci-dessous les exemples :

 [root@elk_master opt]# curl -kL http://172.17.0.6:9200/_cat/indices?v   
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size   
yellow open filebeat-6.2.1-2018.06.09 dihjTJw3SjGncXYln2MXbA 5 1 6 0 35.2kb 35.2kb   
yellow open filebeat-6.2.1-2018.06.04 yPD91Ww0SD2ei4YI-FgLgQ 5 1 350 0 186.4kb 186.4kb   
yellow open filebeat-6.2.1-2018.06.08 Qnv0gplFTgW0z1C6haZESg 5 1 97 0 89.4kb 89.4kb   

Dernier point mais non des moindres, nous devrons configurer et installer les services kibana pour compléter le serveur de gestion centralisé. Juste une note, comme kibana est utilisé pour faciliter le processus de collecte et d’analyse des données via la visualisation, ce n’est pas un paquet aussi important qu’elasticSearch ou logstash si vous configurez le serveur sous une machine plus petite. Pourtant, pour continuer, ci-dessous les étapes d’installation et de configuration :

 [root@elk_master opt]# wget https://artifacts.elastic.co/downloads/kibana/kibana-6.2.1-linux-x86_64.tar.gz   
--2018-06-09 13:21:41-- https://artifacts.elastic.co/downloads/kibana/kibana-6.2.1-linux-x86_64.tar.gz   
Résolution des artifacts.elastic.co (artifacts.elastic.co)... 107.21.237.188, 107.21.237.95, 107.21.253.15, ...   
Connexion à artifacts.elastic.co (artifacts.elastic.co)|107.21.237.188|:443... connecté.   
Requête HTTP envoyée, attente de réponse... 200 OK   
Longueur : 83465500 (80M) [binary/octet-stream]   
Enregistrement dans : ‘kibana-6.2.1-linux-x86_64.tar.gz’   
  
100%[==============================================================================>] 83,465,500 2.76MB/s dans 41s   
  
2018-06-09 13:22:28 (1.94 MB/s) - ‘kibana-6.2.1-linux-x86_64.tar.gz’ enregistré [83465500/83465500]   
  
[root@elk_master opt]# tar -zxvf kibana-6.2.1-linux-x86_64.tar.gz   
[root@elk_master opt]# ln -s /opt/kibana-6.2.1-linux-x86_64 /opt/kibana   
  
[root@elk_master opt]# vi kibana/config/kibana.yml   
  
server.host: "172.17.0.6"   
server.port: 5601   
elasticsearch.url: "http://172.17.0.6:9200"   

Notez ci-dessus que j’ai lié kibana avec notre service ElasticSearch à l’intérieur de la configuration et assigné un port qui sera utilisé par le service Kibana une fois démarré. Maintenant que tout est déjà en place, nous pouvons démarrer les services finaux. Ci-dessous les étapes :

 [root@elk_master opt]# /opt/kibana/bin/kibana --version   
6.2.1   
  
[root@elk_master opt]# /opt/kibana/bin/kibana &   
[1] 8640   
[root@elk_master opt]# log [13:26:20.034] [info][status][plugin:[email protected]] Statut changé de non initialisé à vert - Prêt   
log [13:26:20.073] [info][status][plugin:[email protected]] Statut changé de non initialisé à jaune - En attente d'Elasticsearch   
log [13:26:20.193] [info][status][plugin:[email protected]] Statut changé de non initialisé à vert - Prêt   
log [13:26:20.200] [info][status][plugin:[email protected]] Statut changé de non initialisé à vert - Prêt   
log [13:26:20.212] [info][status][plugin:[email protected]] Statut changé de non initialisé à vert - Prêt   
log [13:26:20.233] [info][listening] Serveur en cours d'exécution à http://172.17.0.6:5601   
log [13:26:20.276] [info][status][plugin:[email protected]] Statut changé de jaune à vert - Prêt   
  
[root@elk_master opt]# netstat -apn|grep -i :5601   
tcp 0 0 172.17.0.6:5601 0.0.0.0:* LISTEN 8640/node   

Super, maintenant tout est opérationnel comme montré ci-dessus en utilisant la commande netstat. Maintenant, voyons le tableau de bord de Kibana et faisons la configuration. Allez à l’URL http://172.17.0.6:5601/app, vous verrez que le tableau de bord sera affiché comme ci-dessous.

Tableau de bord Kibana

Ensuite, sur le tableau de bord, cliquez sur l’onglet Gestion, puis définissez le modèle d’index, pour notre cas, le modèle d’index est défini comme notre nom de fichier de journal généré. Tapez les informations puis cliquez sur suivant.

Ajouter un modèle d'index

Après cela, tapez les variables qui seront utilisées comme séries temporelles. Une fois terminé, cliquez sur Créer le modèle d’index. Ci-dessous un exemple :

Créer un modèle d'index

Excellent, maintenant le serveur de gestion est prêt à être utilisé. Passons à l’étape de test.

4. Phase de test

Avant de commencer le test, faisons l’hypothèse des résultats finaux attendus. Pour ce test, nous allons essayer d’exécuter une requête de base de données qui dépassera le temps de requête longue assigné du côté client qui est le serveur MySQL. Une fois que nous exécutons, notre serveur de gestion centralisé devrait automatiquement afficher le résultat des informations de requête lente sous forme de graphique via le tableau de bord Kibana. Maintenant que tout est clair, commençons le test, ci-dessous les étapes :

Connectez-vous à l’un des serveurs clients et exécutez la requête SQL lente comme ci-dessous :

 [root@mysql_db1 ~]# mysql --login-path=root -P 3306 --prompt='TEST>'   
Bienvenue dans le moniteur MySQL. Les commandes se terminent par ; ou \g.   
Votre ID de connexion MySQL est 193   
Version du serveur : 5.7.21-log Serveur communautaire MySQL (GPL)   
  
Copyright (c) 2000, 2018, Oracle et/ou ses filiales. Tous droits réservés.   
  
Oracle est une marque déposée d'Oracle Corporation et/ou de ses   
filiales. D'autres noms peuvent être des marques de leurs propriétaires respectifs.   
  
Tapez 'help;' ou '\h' pour obtenir de l'aide. Tapez '\c' pour effacer l'instruction d'entrée actuelle.   
  
TEST>select sleep(5);   
+----------+   
| sleep(5) |   
+----------+   
| 0 |   
+----------+   
1 ligne dans l'ensemble (5.01 sec)   
  
TEST>select sleep(6);   
+----------+   
| sleep(6) |   
+----------+   
| 0 |   
+----------+   
1 ligne dans l'ensemble (6.00 sec)   
  
TEST>select sleep(10) 'exécuter pendant 10 secondes';   
+--------------------+   
| exécuter pendant 10 secondes |   
+--------------------+   
| 0 |   
+--------------------+   
1 ligne dans l'ensemble (10.00 sec)   
  
TEST>select sleep(3) 'tester à nouveau';   
+------------+   
| tester à nouveau |   
+------------+   
| 0 |   
+------------+   
1 ligne dans l'ensemble (3.00 sec)   
  
TEST>exit   
Au revoir   

Comme indiqué ci-dessus, nous avons réussi à produire certaines requêtes lentes qui ont été automatiquement consignées dans chaque journal de requêtes lentes du client. Maintenant, allons sur le tableau de bord et voyons si les informations de données ont été correctement collectées par le serveur centralisé et converties en graphique de visualisation.

Les données de journal ont été indexées

Super, comme indiqué ci-dessus, il y a une liste d’informations de journal qui ont été correctement collectées et visualisées via le tableau de bord kibana. Vous pouvez utiliser l’onglet gauche pour filtrer quel type de colonne vous souhaitez afficher ou masquer, ci-dessous un exemple :-

Navigation du tableau de bord Kibana

En utilisant le champ de texte en haut du tableau de bord, vous pouvez taper une requête SQL liée pour afficher certaines informations ou parties des données nécessaires.

Recherche de données de journal avec SQL

Excellent, comme montré ci-dessus, la requête SQL lente que nous avons produite initialement à partir de l’un de nos serveurs clients est automatiquement affichée sous notre tableau de bord Kibana comme prévu.

Share: X/Twitter LinkedIn

Recevez de nouveaux articles dans votre boîte de réception.

Aucun spam. Désabonnez-vous à tout moment.