Mise à jour pour Elasticsearch et ELK (5.0)

This commit is contained in:
Jérémy Lecour 2016-10-24 10:48:48 +02:00 committed by Jérémy Lecour
parent d5cb30f8ff
commit c486414ba8
2 changed files with 103 additions and 119 deletions

View file

@ -5,20 +5,40 @@ categories: nosql pack
Cette documentation décrit l'installation et la configuration de la suite Elastic, anciennement nommée **ELK** (Elasticsearch + Logstash + Kibana). Cette documentation décrit l'installation et la configuration de la suite Elastic, anciennement nommée **ELK** (Elasticsearch + Logstash + Kibana).
# Elasticsearch ## Pré-requis
## Installation Les composants de la suite doivent être installés à partir du dépôt APT de la société Elastic (éditrice de la suite Elastic)
~~~ ~~~
# wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | apt-key add - # echo "deb https://artifacts.elastic.co/packages/5.x/apt stable main" >> /etc/apt/sources.list.d/elastic.list
# echo "deb http://packages.elastic.co/elasticsearch/2.x/debian stable main" >> /etc/apt/sources.list.d/elastic.list # wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
# apt install elasticsearch openjdk-7-jre
# systemctl enable elasticsearch && systemctl start elasticsearch
~~~ ~~~
Pour plus de détails, voir [HowtoElasticsearch#installation]() Pour Elasticsearch et Logstash, il faut avoir Java 1.8, disponible depuis les `jessie-backports`.
## Configuration ~~~
# apt install openjdk-8-jre
# update-alternatives --set java /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java
~~~
## Elasticsearch
Il existe un guide détaillé d'installation et configuation pour Elasticsearch : [HowtoElasticsearch#installation]().
### Installation
~~~
# apt install elasticsearch
~~~
### Démarrage
~~~
# systemctl enable elasticsearch
# systemctl start elasticsearch
~~~
### Configuration
Préciser *node.name* dans le fichier `/etc/elasticsearch/elasticsearch.yml` : Préciser *node.name* dans le fichier `/etc/elasticsearch/elasticsearch.yml` :
@ -26,69 +46,40 @@ Préciser *node.name* dans le fichier `/etc/elasticsearch/elasticsearch.yml` :
node.name: bar node.name: bar
~~~ ~~~
Pour plus détails, voir [HowtoElasticsearch#configuration](). ## Logstash
## Installation de quelques plugins
~~~
# /usr/share/elasticsearch/bin/plugin install mobz/elasticsearch-head
# /usr/share/elasticsearch/bin/plugin install lmenezes/elasticsearch-kopf
# chown -R elasticsearch:elasticsearch /usr/share/elasticsearch/plugins/
~~~
Pour plus détails, voir [HowtoElasticsearch#plugins]().
## Utile
* les logs sont dans `/var/log/elasticsearch/_cluster_name_.log`
* l'interface **Head** est disponible sur http://127.0.0.1:9200/_plugin/head/
* l'interface **Kopf** est disponible sur http://127.0.0.1:9200/_plugin/kopf/
# Logstash
Logstash est un service qui récupère des données depuis des sources variées (ports TCP/UDP, fichiers…), les transforme et les renvois vers des sorties variées (fichiers, Elasticsearch, syslog…). Logstash est un service qui récupère des données depuis des sources variées (ports TCP/UDP, fichiers…), les transforme et les renvois vers des sorties variées (fichiers, Elasticsearch, syslog…).
C'est un logiciel écrit en Ruby, qui tourne sur une JVM (grace à JRuby). C'est un logiciel écrit en Ruby, qui tourne sur une JVM (grace à JRuby).
Documentation officielle : <https://www.elastic.co/guide/en/logstash/2.4/index.html> Documentation officielle : <https://www.elastic.co/guide/en/logstash/5.0/index.html>
## Installation ### Installation
~~~ ~~~
# echo "deb http://packages.elastic.co/logstash/2.4/debian stable main" | tee -a /etc/apt/sources.list.d/elastic.list
# apt install logstash # apt install logstash
# systemctl enable logstash
# systemctl start logstash
~~~ ~~~
Dans `/etc/default/logstash` il faut penser à ajuster la ram allouée. Dans `/etc/default/logstash` il faut penser à ajuster la ram allouée.
### Configuration
À ce stade, aucun "pipeline" Logstash n'est configuré. À ce stade, aucun "pipeline" Logstash n'est configuré.
Voir <https://www.elastic.co/guide/en/logstash/current/configuration.html> Voir <https://www.elastic.co/guide/en/logstash/5.0/configuration.html>
## Démarrage ## Kibana
~~~
# systemctl start logstash
~~~
Pour que le démon soit géré automatiquement par systemd :
~~~
# systemctl enable logstash
~~~
# Kibana
Kibana est une interface de visualisation des donnes stockées dans Elasticsearch. Kibana est une interface de visualisation des donnes stockées dans Elasticsearch.
C'est un logiciel écrit principalement en NodeJS, où tout est embarqué dans un processus principal. C'est un logiciel écrit principalement en NodeJS, où tout est embarqué dans un processus principal.
Documentation officielle : <https://www.elastic.co/guide/en/kibana/4.6/index.html> Documentation officielle : <https://www.elastic.co/guide/en/kibana/5.0/index.html>
## Installation ### Installation
~~~ ~~~
# echo "deb http://packages.elastic.co/kibana/4.6/debian stable main" | tee -a /etc/apt/sources.list.d/elastic.list
# apt install kibana # apt install kibana
# /opt/kibana/bin/kibana plugin --install elastic/sense
# chown -R kibana: /opt/kibana
~~~ ~~~
~~~ ~~~
@ -104,24 +95,16 @@ Documentation officielle : <https://www.elastic.co/guide/en/kibana/4.6/index.htm
} }
~~~ ~~~
## Démarrage ### Démarrage
~~~
# systemctl start kibana
~~~
Pour que le démon soit géré automatiquement par systemd :
~~~ ~~~
# systemctl enable kibana # systemctl enable kibana
# systemctl start kibana
~~~ ~~~
## Utile L'interface principale est disponible sur <http://127.0.0.1:5601/>
* l'interface principale est disponible sur <http://127.0.0.1:5601/> ### Proxy
* l'interface **Sense** est disponible sur <http://127.0.0.1:5601/app/sense>
## Proxy
Kibana ne gère pas d'authentification. Pour le rendre accessible de manière sécurisée, il est conseillé de le placer derrière un reverse proxy, par exemple Nginx. Kibana ne gère pas d'authentification. Pour le rendre accessible de manière sécurisée, il est conseillé de le placer derrière un reverse proxy, par exemple Nginx.
@ -150,6 +133,6 @@ server {
} }
~~~ ~~~
# Conseils ## Conseils
* utiliser des certificats SSL (nativement géré par les logiciels) pour que les données circulent de manière chiffrée (surtout entre filebeat et logstash, car ça passe par Internet). * utiliser des certificats SSL (nativement géré par les logiciels) pour que les données circulent de manière chiffrée (surtout entre filebeat et logstash, car ça passe par Internet).

View file

@ -3,7 +3,7 @@ title: Howto Elasticsearch
categories: web bdd nosql categories: web bdd nosql
... ...
* Documentation : <https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html> * Documentation : <https://www.elastic.co/guide/en/elasticsearch/reference/5.0/index.html>
* Forum : <https://discuss.elastic.co/c/elasticsearch> * Forum : <https://discuss.elastic.co/c/elasticsearch>
[Elasticsearch](https://www.elastic.co/fr/products/elasticsearch) est un serveur de base de données écrit en Java disposant dune interface REST HTTP. Elasticsearch est notammment utilisé dans [la stack Elastic avec Logstash et Kibana](HowtoELK). [Elasticsearch](https://www.elastic.co/fr/products/elasticsearch) est un serveur de base de données écrit en Java disposant dune interface REST HTTP. Elasticsearch est notammment utilisé dans [la stack Elastic avec Logstash et Kibana](HowtoELK).
@ -13,20 +13,45 @@ categories: web bdd nosql
Vu le développement actif d'Elasticsearch, nous préconisons l'installation des paquets Debian distribués par Elasticsearch : Vu le développement actif d'Elasticsearch, nous préconisons l'installation des paquets Debian distribués par Elasticsearch :
~~~ ~~~
# echo "deb http://packages.elastic.co/elasticsearch/2.x/debian stable main" >> /etc/apt/sources.list.d/elasticsearch.list # echo "deb https://artifacts.elastic.co/packages/5.x/apt stable main" >> /etc/apt/sources.list.d/elastic.list
# wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | apt-key add - # wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
# apt install elasticsearch openjdk-7-jre # apt install elasticsearch
~~~ ~~~
On vérifie qu'on a bien Java >= 1.7 activé : ### Java 1;8
Elasticsearch 5.x nécessite Java 1.8. Pour Jessie, il faut installer la machine virtuelle Java depuis les backports.
~~~ ~~~
$ java -version # cat /etc/apt/sources.list.d/backports.list
java version "1.7.0_111" deb http://mirror.evolix.org/debian jessie-backports main contrib non-free
OpenJDK Runtime Environment (IcedTea 2.6.7) (7u111-2.6.7-1~deb8u1)
OpenJDK 64-Bit Server VM (build 24.111-b01, mixed mode)
~~~ ~~~
Il vaut mieux aussi s'assurer que les backports aient une préférence basse, dans `/etc/apt/preferences.d/backports`
~~~
Package: *
Pin: release a=jessie-backports
Pin-Priority: 50
~~~
~~~
# apt install openjdk-8-jre
# update-alternatives --set java /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java
~~~
### Breaking changes
Si vous faites la mise à jour depuis une verison inférieure à 5.0, il faut penser à supprimer tous les plugins de type "site" comme _head_ ou _kopf_ qu'il faudra réinstaller différemment. :
~~~
# rm -rf /usr/share/elasticsearch/plugins/{kopf,head}
~~~
La liste complète des changements est diponible sur <https://www.elastic.co/guide/en/elasticsearch/reference/5.0/breaking-changes.html>.
### Démarrage
Pour activer le démarrage automatique : Pour activer le démarrage automatique :
~~~ ~~~
@ -35,19 +60,23 @@ Synchronizing state for elasticsearch.service with sysvinit using update-rc.d...
Executing /usr/sbin/update-rc.d elasticsearch defaults Executing /usr/sbin/update-rc.d elasticsearch defaults
Executing /usr/sbin/update-rc.d elasticsearch enable Executing /usr/sbin/update-rc.d elasticsearch enable
Created symlink from /etc/systemd/system/multi-user.target.wants/elasticsearch.service to /usr/lib/systemd/system/elasticsearch.service. Created symlink from /etc/systemd/system/multi-user.target.wants/elasticsearch.service to /usr/lib/systemd/system/elasticsearch.service.
# systemctl start elasticsearch # systemctl start elasticsearch
~~~ ~~~
## Configuration de base ## Configuration de base
Les paramètres système (répertoires utilisés, configuration JVM) se trouvent dans le fichier `/etc/default/elasticsearch`, Les paramètres système se trouvent dans le fichier `/etc/default/elasticsearch`, les paramètres liés à la JVM sont dans `/etc/elasticsearch/jvm.options` et les options applicatives (nom du cluster, nom du nœud, mémoire, réseau) se trouvent dans le fichier `/etc/elasticsearch/elasticsearch.yml`.
les options applicatives (nom du cluster, nom du nœud, mémoire, réseau) se trouvent dans le fichier `/etc/elasticsearch/elasticsearch.yml`.
Il faut activer le redémarrage automatique en cas de mise à jour (classique sous Debian). Il faut activer le redémarrage automatique en cas de mise à jour (classique sous Debian) dans `/etc/default/elasticsearch` :
On peut aussi définir un *tmpdir* spécifique (utile quand `/tmp` est en _noexec_) dans `/etc/default/elasticsearch` :
~~~ ~~~
RESTART_ON_UPGRADE=true RESTART_ON_UPGRADE=true
~~~
On peut aussi définir un **tmpdir** spécifique (utile quand `/tmp` est en `noexec`) dans `/etc/default/elasticsearch` :
~~~
ES_JAVA_OPTS="-Djava.io.tmpdir=/var/lib/elasticsearch/tmp" ES_JAVA_OPTS="-Djava.io.tmpdir=/var/lib/elasticsearch/tmp"
~~~ ~~~
@ -66,17 +95,6 @@ cluster.name: foo
node.name: bar node.name: bar
~~~ ~~~
## Journaux
On conseille de ne pas activer le logging stdout vers la console, mais de conserver seulement les logs dans `/var/log/elasticsearch/`. On peut faire cela via le fichier `/etc/elasticsearch/logging.yml` :
~~~{.diff}
-rootLogger: ${es.logger.level}, console, file
+rootLogger: ${es.logger.level}, file
~~~
Les journaux intéressants sont dans `/var/log/elasticsearch/_cluster_name_.log`
## Configuration réseau ## Configuration réseau
Par défaut, Elasticsearch écoute sur 127.0.0.1 sur TCP/9200 pour son interface REST HTTP. Par défaut, Elasticsearch écoute sur 127.0.0.1 sur TCP/9200 pour son interface REST HTTP.
@ -87,34 +105,15 @@ La directive de configuration suivante peut être positionnée pour qu'il écout
network.host: ["192.0.2.42", "198.51.100.42", "127.0.0.1"] network.host: ["192.0.2.42", "198.51.100.42", "127.0.0.1"]
~~~ ~~~
## Plugins Il est possible d'utiliser des adresses virtuelles, telles que `_site_`, `_local_`
Les plugins permettent différentes améliorations, notamment en terme de visualisation simple et conviviale d'une base de données. Tous les détails sont su <https://www.elastic.co/guide/en/elasticsearch/reference/5.0/modules-network.html#network-interface-values>.
On verra ici les plus utiles.
### Kopf - web admin interface for elasticsearch ### mode "production"
<https://github.com/lmenezes/elasticsearch-kopf> Lorsqu'Elasticsearch est configuré pour écouter sur une IP non locale, il passe en mode "production".
~~~ Il active alors un certain nombre de "bootstrap checks" qui bloquent le démarrage s'ils ne sont pas tous respectés. Les éventuels échecs sont lisibles dans le fichier de log (généralement dans `/var/log/elasticsearch/_cluster_name_.log`).
# /usr/share/elasticsearch/bin/plugin install lmenezes/elasticsearch-kopf
# chown -R elasticsearch:elasticsearch /usr/share/elasticsearch/plugins/
~~~
*Note :* cela nécessite un accès réseau vers https://github.com/
L'interface **Kopf** est ainsi disponible sur http://127.0.0.1:9200/_plugin/kopf/
### Head - web front end for an elastic search cluster
<https://github.com/mobz/elasticsearch-head>
~~~
# /usr/share/elasticsearch/bin/plugin install mobz/elasticsearch-head
# chown -R elasticsearch:elasticsearch /usr/share/elasticsearch/plugins/
~~~
L'interface **Head** est ainsi disponible sur http://127.0.0.1:9200/_plugin/head/
## Configuration avancée ## Configuration avancée
@ -141,11 +140,11 @@ On check sur la page `/_cat/health` si le status n'est pas en **red**.
/usr/lib/nagios/plugins/check_http -I 127.0.0.1 -u /_cat/health?h=st -p 9200 -r 'red' --invert-regex /usr/lib/nagios/plugins/check_http -I 127.0.0.1 -u /_cat/health?h=st -p 9200 -r 'red' --invert-regex
~~~ ~~~
## Snapshost et sauvegardes ## Snapshots et sauvegardes
### Configuration des snapshots ### Configuration des snapshots
* Documentation http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/modules-snapshots.html Documentation : <http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/modules-snapshots.html>
Il faut définir un répertoire pour stocker les snapshots : Il faut définir un répertoire pour stocker les snapshots :
@ -155,7 +154,7 @@ Il faut définir un répertoire pour stocker les snapshots :
# chown elasticsearch: /home/backup-elasticsearch # chown elasticsearch: /home/backup-elasticsearch
~~~ ~~~
*Note :* en cas de cluster multi-nœuds, le répertoire de snapshots doit impérativement être partagé entre chaque nœud, classiquement via NFS, car chaque nœud ne gère que ses propres données. *Note* : en cas de cluster multi-nœuds, le répertoire de snapshots doit impérativement être partagé entre chaque nœud, classiquement via NFS, car chaque nœud ne gère que ses propres données.
On précise le répertoire des snapshots dans la configuration `/etc/elasticsearch/elasticsearch.yml` : On précise le répertoire des snapshots dans la configuration `/etc/elasticsearch/elasticsearch.yml` :
@ -170,7 +169,7 @@ $ curl -XPUT 'http://localhost:9200/_snapshot/foo' -d '{
"type": "fs", "type": "fs",
"settings": { "settings": {
"location": "/home/backup-elasticsearch", "location": "/home/backup-elasticsearch",
"compress": true "compress": true
} }
}' }'
{"acknowledged":true} {"acknowledged":true}
@ -204,6 +203,7 @@ Pour créer un snapshot dans l'ensemble **foo** :
~~~ ~~~
$ curl -s -XPUT "localhost:9200/_snapshot/foo/snapshot_test?wait_for_completion=true" $ curl -s -XPUT "localhost:9200/_snapshot/foo/snapshot_test?wait_for_completion=true"
$ ls -l /home/backup-elasticsearch $ ls -l /home/backup-elasticsearch
-rw-r--r-- 1 elasticsearch elasticsearch 34 Apr 11 01:35 index -rw-r--r-- 1 elasticsearch elasticsearch 34 Apr 11 01:35 index
drwxr-xr-x 22 elasticsearch elasticsearch 4096 Apr 11 01:35 indices drwxr-xr-x 22 elasticsearch elasticsearch 4096 Apr 11 01:35 indices
@ -222,7 +222,7 @@ Lister les snapshots :
~~~ ~~~
$ curl -XGET "localhost:9200/_snapshot/foo/_all?pretty=true" $ curl -XGET "localhost:9200/_snapshot/foo/_all?pretty=true"
--- [...]
"snapshots" : [ { "snapshots" : [ {
"snapshot" : "snapshot_201403190415", "snapshot" : "snapshot_201403190415",
"indices" : [...], "indices" : [...],
@ -232,7 +232,7 @@ $ curl -XGET "localhost:9200/_snapshot/foo/_all?pretty=true"
"end_time" : "2014-03-19T03:16:33.381Z", "end_time" : "2014-03-19T03:16:33.381Z",
"end_time_in_millis" : 1395198993381, "end_time_in_millis" : 1395198993381,
"duration_in_millis" : 90001, "duration_in_millis" : 90001,
... [...]
"snapshot" : "snapshot_201403201222", "snapshot" : "snapshot_201403201222",
"indices" : [...], "indices" : [...],
"state" : "SUCCESS", "state" : "SUCCESS",
@ -284,10 +284,10 @@ hot_${i}"; done
## cluster ## cluster
<https://www.elastic.co/guide/en/elasticsearch/reference/2.4/modules-cluster.html> <https://www.elastic.co/guide/en/elasticsearch/reference/5.0/modules-cluster.html>
Si l'on compare à d'autres services (MySQL, PostgreSQL, MongoDB..) la gestion d'un cluster Elasticsearch est vraiment simple. Si l'on compare à d'autres services (MySQL, PostgreSQL, MongoDB) la gestion d'un cluster Elasticsearch est vraiment simple.
Il faut lancer plusieurs instances Elasticsearch sur un réseau avec le même **cluster.name** et un **node.name** différent, et il suffitd'indiquer une (ou plusieurs) adresse(s) IP qui va permettre à l'instance de communiquer avec un (ou plusieurs) autre(s) nœud(s) : Il faut lancer plusieurs instances Elasticsearch sur un réseau avec le même **cluster.name** et un **node.name** différent, et il suffit d'indiquer une (ou plusieurs) adresse(s) IP qui va permettre à l'instance de communiquer avec un (ou plusieurs) autre(s) nœud(s) :
~~~ ~~~
cluster.name: foo cluster.name: foo
@ -438,6 +438,7 @@ Recréons un index de test :
~~~ ~~~
$ curl -X DELETE localhost:9200/planet $ curl -X DELETE localhost:9200/planet
{"acknowledged":true} {"acknowledged":true}
$ curl -X PUT localhost:9200/planet -d ' $ curl -X PUT localhost:9200/planet -d '
{ {
"mappings": { "mappings": {