18
0
Fork 0

amélioration de la partie sauvegarde

This commit is contained in:
gcolpart 2016-10-12 17:34:44 +02:00
parent 3102fac872
commit 175d568ba2
1 changed files with 119 additions and 133 deletions

View File

@ -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, <https://github.com/andrewvc/ee-datasets/archive/master.zip>, 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 quil 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