From 175d568ba23f3f58a09352cc24b804391cfb3a11 Mon Sep 17 00:00:00 2001 From: gcolpart Date: Wed, 12 Oct 2016 17:34:44 +0200 Subject: [PATCH] =?UTF-8?q?am=C3=A9lioration=20de=20la=20partie=20sauvegar?= =?UTF-8?q?de?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- HowtoElasticsearch.md | 252 ++++++++++++++++++++---------------------- 1 file changed, 119 insertions(+), 133 deletions(-) diff --git a/HowtoElasticsearch.md b/HowtoElasticsearch.md index f573bbb1..2d2a5af2 100644 --- a/HowtoElasticsearch.md +++ b/HowtoElasticsearch.md @@ -204,40 +204,146 @@ 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 ~~~ -## Backup +## Snapshost et sauvegardes -La sauvegarde se fait par snapshots, dans un ou plusiers dépôts. +### Configuration des snapshots -On crée le dépôt sur le filesystem : +* Documentation http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/modules-snapshots.html + +Il faut définir un répertoire pour stocker les snapshots : ~~~ # mkdir /home/backup-elasticsearch +# chmod 750 /home/backup-elasticsearch # chown elasticsearch: /home/backup-elasticsearch ~~~ -*Note :* en cas de cluster multi-nœuds, il faut penser que le filesystem doit être partagé (via NFS par exemple) 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. -Le dépôt doit être référencé dans la configuration `/etc/elasticsearch/elasticsearch.yml` : +On précise le répertoire des snapshots dans la configuration `/etc/elasticsearch/elasticsearch.yml` : ~~~ path.repo: ["/home/backup-elasticsearch"] ~~~ -Après restart d'Elasticsearch on lui fait créer le snapshot **evobackup** : +Il faut redémarrer Elasticsearch et créer un ensemble de snapshots (snapshots repository) ainsi : ~~~ -$ curl -XPUT 127.0.0.1:9200/_snapshot/evobackup -d '{"type": "fs", "settings": {"location": "/home/backup-elasticsearch/evobackup", "compress": true}}' +$ curl -XPUT 'http://localhost:9200/_snapshot/foo' -d '{ +"type": "fs", + "settings": { + "location": "/home/backup-elasticsearch", + "compress": true + } +}' +{"acknowledged":true} ~~~ -Enfin, dans un script qui tourne régulièrement, on provoque la fixation d'un snapshot : +On peut ainsi lister les infos : + +~~~ +$ curl -XGET 'http://localhost:9200/_snapshot/?pretty' +{ + "foo" : { + "type" : "fs", + "settings" : { + "compress" : "true", + "location" : "/home/backup-elasticsearch/foo" + } + } +} +~~~ + +Si l'on veut supprimer un ensemble de snapshots : + +~~~ +$ curl -s -XDELETE "localhost:9200/_snapshot/foo?pretty" +{"acknowledged":true} +~~~ + +### Gestion des snapshots + +Pour créer un snapshot dans l'ensemble **foo** : + +~~~ +$ curl -s -XPUT "localhost:9200/_snapshot/foo/snapshot_test?wait_for_completion=true" +$ ls -l /home/backup-elasticsearch +-rw-r--r-- 1 elasticsearch elasticsearch 34 Apr 11 01:35 index +drwxr-xr-x 22 elasticsearch elasticsearch 4096 Apr 11 01:35 indices +-rw-r--r-- 1 elasticsearch elasticsearch 3006 Apr 11 01:35 metadata-snapshot_test +-rw-r--r-- 1 elasticsearch elasticsearch 419 Apr 11 01:35 snapshot-snapshot_test +~~~ + +Si l'on tente de créer un snapshot déjà existant, on obtiendra : + +~~~ +{"error":"InvalidsnapshotNameException[[backup:snapshot_test] Invalid snapshot name [snapshot_test], snapshot with such name already exists]","status":400} +~~~ + +Lister les snapshots : + +~~~ +$ curl -XGET "localhost:9200/_snapshot/foo/_all?pretty=true" + +--- + "snapshots" : [ { + "snapshot" : "snapshot_201403190415", + "indices" : [...], + "state" : "SUCCESS", + "start_time" : "2014-03-19T03:15:03.380Z", + "start_time_in_millis" : 1395198903380, + "end_time" : "2014-03-19T03:16:33.381Z", + "end_time_in_millis" : 1395198993381, + "duration_in_millis" : 90001, +... + "snapshot" : "snapshot_201403201222", + "indices" : [...], + "state" : "SUCCESS", + "start_time" : "2014-03-20T11:22:07.441Z", + "start_time_in_millis" : 1395314527441, + "end_time" : "2014-03-20T11:22:56.176Z", + "end_time_in_millis" : 1395314576176, + "duration_in_millis" : 48735, + "failures" : [ ], + "shards" : { + "total" : 86, + "failed" : 0, + "successful" : 86 +~~~ + +Pour supprimer un snapshot : + +~~~ +$ curl -s -XDELETE "localhost:9200/_snapshot/foo/snapshot_test" +~~~ + +### Sauvegarde via snapshots + +On peut ainsi créer régulièrement des snapshots pour les sauvegardes. + +Pour créer un snapshot toutes les heures, et en conserver 24 en permanence (notion de snapshots "roulants") : ~~~{.bash} $ date=$(date +%H) -$ curl -s -X DELETE "127.0.0.1:9200/_snapshot/evobackup/h${date}" | grep -v acknowledged..true -$ curl -s -X PUT "127.0.0.1:9200/_snapshot/evobackup/h${date}?wait_for_completion=true" -o /tmp/es_snapshot_h${date}.log +$ curl -s -X DELETE "127.0.0.1:9200/_snapshot/foo/h${date}" | grep -v acknowledged..true +$ curl -s -X PUT "127.0.0.1:9200/_snapshot/foo/h${date}?wait_for_completion=true" -o /tmp/es_snapshot_h${date}.log ~~~ -Ici, on crée un snapshot portant le numéro de l'heure courante. Il est supprimé avant d'être recréé afin d'avoir des snapshots "roulants". +Plus classiquement pour avoir un snapshot par jour : + +~~~ +$ date=$(date +%Y-%m-%d) +$ curl -s -XDELETE "localhost:9200/_snapshot/foo/snapshot_${date}" | grep -v acknowledged..true +$ curl -s -XPUT "localhost:9200/_snapshot/foo/snapshot_${date}?wait_for_completion=true" -o /tmp/es_snapshot_${date}.log +~~~ + +On peut ensuite purger les snapshots vieux de plus de 10 jours ainsi : + +~~~ +$ cd /home/backup-elasticsearch/foo +$ for i in $(ls -1d snapshot-* | head -n -10 | sed s'/snapshot-snapshot_//g'); do curl -s -XDELETE "localhost:9200/_snapshot/foo/snaps +hot_${i}"; done +~~~ ## Principe de fonctionnement @@ -248,7 +354,7 @@ En plaçant à la fin d'une URI `?pretty=true` on pourra obtenir un JSON format ### Avec une base de données d'exemple -Nous allons utiliser une BDD d'exemple pour faire des tests. +Nous allons utiliser une base de données d'exemple pour faire des tests. Télécharger, , décompresser l'archive et exécuter le programme Java qui va injecter la BDD "movie_db" dans votre cluster ES. @@ -264,7 +370,7 @@ Pour consulter tout son contenu : $ curl http://localhost:9200/movie_db/_search?pretty=true ~~~ -### En créant une BDD +### En créant une base de données #### Opérations CRUD @@ -384,126 +490,6 @@ $ curl -X POST localhost:9200/planet/hacker/_search?pretty=true -d ' On obtiens 2 résultats, _jean-michel_ et _mark_. Pourtant le hobby de _jean-michel_ n'est pas _rollerblading_ mais _rollerblades_, alors comment Elastic Search l'a trouvé ? C'est parce qu’il comprend que _rollerblading_ et _rollerblades_ sont très similaires ! Cela grâce à l'analyseur de type « snowball » que nous avons indiqué lors de la création du type _hobbies_. Cela indique à ES qu'il s'agit non pas d'une chaîne de caractère banale mais du texte Anglais (Gestion des autres langues ?). -## snapshots - -http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/modules-snapshots.html - -Création d'un répertoire pour accueillir les snapshots : - -~~~ -# mkdir /home/backup-elasticsearch -# chown elasticsearch:elasticsearch /home/backup-elasticsearch -# chmod 750 /home/backup-elasticsearch -# vim /etc/elasticsearch/elasticsearch.yml - -path.repo: ["/home/backup-elasticsearch"] - -$ curl -XPUT 'http://localhost:9200/_snapshot/backup' -d '{ -"type": "fs", - "settings": { - "location": "/home/backup-elasticsearch", - "compress": true - } -}' -{"acknowledged":true} -~~~ - -ATTENTION, dans le cadre d'un cluster, chaque noeud écrira ses données -dans son répertoire local… et ne les effacera pas en cas de DELETE. -Il faut donc centraliser ce répertoire via un montage NFS ! - -Vérifier les infos du répertoire pour les snapshots : - -~~~ -$ curl -XGET 'http://localhost:9200/_snapshot/?pretty' - ---- -{ - "backup" : { - "type" : "fs", - "settings" : { - "compress" : "true", - "location" : "/home/backup-elasticsearch" - } - } -} -~~~ - -Supprimer les infos sur le répertoire des snapshots : - -~~~ -$ curl -s -XDELETE "localhost:9200/_snapshot/backup?pretty" - ---- -{"acknowledged":true} -~~~ - -Créer un snapshot : - -~~~ -$ curl -s -XPUT "localhost:9200/_snapshot/backup/snapshot_test?wait_for_completion=true" -$ ls -l /home/backup-elasticsearch --rw-r--r-- 1 elasticsearch elasticsearch 34 Apr 11 01:35 index -drwxr-xr-x 22 elasticsearch elasticsearch 4096 Apr 11 01:35 indices --rw-r--r-- 1 elasticsearch elasticsearch 3006 Apr 11 01:35 metadata-snapshot_test --rw-r--r-- 1 elasticsearch elasticsearch 419 Apr 11 01:35 snapshot-snapshot_test -~~~ - -Supprimer un snapshot : - -~~~ -$ curl -s -XDELETE "localhost:9200/_snapshot/backup/snapshot_test" -~~~ - -Si l'on tente de créer un snapshot déjà existant, on obtiendra : - -~~~ -{"error":"InvalidsnapshotNameException[[backup:snapshot_test] Invalid snapshot name [snapshot_test], snapshot with such name already exists]","status":400} -~~~ - -Lister les snapshots : - -~~~ -$ curl -XGET "localhost:9200/_snapshot/backup/_all?pretty=true" - ---- - "snapshots" : [ { - "snapshot" : "snapshot_201403190415", - "indices" : [...], - "state" : "SUCCESS", - "start_time" : "2014-03-19T03:15:03.380Z", - "start_time_in_millis" : 1395198903380, - "end_time" : "2014-03-19T03:16:33.381Z", - "end_time_in_millis" : 1395198993381, - "duration_in_millis" : 90001, -... - "snapshot" : "snapshot_201403201222", - "indices" : [...], - "state" : "SUCCESS", - "start_time" : "2014-03-20T11:22:07.441Z", - "start_time_in_millis" : 1395314527441, - "end_time" : "2014-03-20T11:22:56.176Z", - "end_time_in_millis" : 1395314576176, - "duration_in_millis" : 48735, - "failures" : [ ], - "shards" : { - "total" : 86, - "failed" : 0, - "successful" : 86 -~~~ - -Pour faire des backups on pourra utiliser un script comme celui-ci : - -~~~ -# Clean old snapshots (keep 10 snaps). -cd /home/backup-elasticsearch -for i in $(ls -1d snapshot-* | head -n -10 | sed s'/snapshot-snapshot_//g'); do curl -s -XDELETE "localhost:9200/_snapshot/backup/snaps -hot_${i}"; done -# Take a snapshot on master node. -date=$(date +%Y-%m-%d) -curl -s -XDELETE "localhost:9200/_snapshot/backup/snapshot_${date}" | grep -v acknowledged..true -curl -s -XPUT "localhost:9200/_snapshot/backup/snapshot_${date}?wait_for_completion=true" -o /tmp/es_snapshot_${date}.log -~~~ ## FAQ