Como en todo sistema de información, hay que tener una estrategia de copias de seguridad (backups) o mejor aún, tener dos. Si tienes un cluster de ElasticSearch, en producción, tienes que asegurarte un buen sistema de backups, y la mejor forma de hacer uno de ellos es usando la capacidad de ElasticSearch de generar copias de seguridad usando snapshots con rotación
Para este tip, usaremos la versión 5.6 de ElsaticSearch que es la que estoy usando con un cliente, con 3 máquinas en el cluster, aunque es valido para elasticsearch en la versión 6. Los matices entre versiones son necesario revisarlos, y por tanto el lector debe entender que esto, es un tip y que no me responsabilizo de su eficiacia. Cada administrador debe trabajar, ejecutar y verificar sus sistemasAbdelkarim Mateos
Contenidos
Lo primero es leerse la documentación de ElasticSearch respecto del trabajo con snapshots, para poder comprender y actuar creando nuestra estrategia de copias de seguridad. Es importante entender también, como funciona ElasticSearch con su sistema de versiones, sino queremos tener más de un quebradero de cabeza.
Entendemos que el servidor NFS esta preparado para ser usado por cada uno de los elementos de nuestros cluster para el punto de montaje remoto, y por tanto podemos montarlo. En este punto, se entiende que ya tienes operativo un servidor NFS, configurado un punto de montaje remoto NFS valido para los elementos del cluster.
[SERVIDOR_NFS]:[PATH_NFS_REMOTO] [PATH_PUNTO_MONTAJE] nfs bg,hard,timeo=1200,rsize=1048576,wsize=1048576 0 0
mount -a; df -h
Para que ElasticSearch funcione con este sistema, debemos también configurar todos los nodos del cluster editando el fichero de configuración /etc/elasticsearch/elasticsearch.yml y reiniciamos ES en cada uno de los elementos del cluster.
path.repo: ["[PATH_PUNTO_MONTAJE]/[DIRECTORIO]/"]
$ curl -XPUT 'http://[MASTERNODE]:9200/_snapshot/[NOMBRE_BACKUP]' -H 'Content-Type: application/json' -d '{ "type": "fs", "settings": { "location": "[PATH_PUNTO_MONTAJE]/[DIRECTORIO]", "compress": true } }' #Podemos usar mejor $ curl -XPUT 'http://[MASTERNODE]:9200/_snapshot/[NOMBRE_BACKUP]' -H 'Content-Type: application/json' -d '{"type": "fs", "settings": {"location": "[PATH_PUNTO_MONTAJE]/[DIRECTORIO]", "compress": true}}' # Debe devolver $ {"acknowledged":true}
Antes de abordar el sistema de backups con snapshots y rotación, vamos a comprender como funciona, y trabajar con algunos comandos que pueden ser de utilidad, pues a veces lo que queremos es un simple backup, para por ejemplo clonar nuestro cluster en desarrollo, etc.
$ curl -X GET "[MASTERNODE]:9200/_snapshot?pretty=true" # Debe devolver algo similar { "excelle_backup" : { "type" : "fs", "settings" : { "compress" : "true", "location" : "/backupremote2/elastic" } } }
Sin entrar en estrategias de rotación, queremos crear nuestro primer backup del cluster. Sencillo. Le vamos a llamar copia_completa
curl -XPUT "$[MASTERNODE]:9200/_snapshot/[NOMBRE_BACKUP]/copia_completa?wait_for_completion=true"
El comando devolverá el resultado en un json, que nos permitirá conocer el estado del snapshot.
{ "snapshot": { "snapshot": "copia_completa", "uuid": "9wRjNEkuSvmJMsZYgpBQQg", "version_id": 5061099, "version": "5.6.10", "indices": [".kibana", "excellenting"], "state": "SUCCESS", "start_time": "2018-08-23T08:02:22.144Z", "start_time_in_millis": 1535011342144, "end_time": "2018-08-23T08:19:16.983Z", "end_time_in_millis": 1535012356983, "duration_in_millis": 1014839, "failures": [], "shards": { "total": 10, "failed": 0, "successful": 10 } } }
En una primera instancia programé un sistema para rotar los backups, muy sencilla basándome en los comandos anteriores y apoyándome en jq, un preprocesador de ficheros json. Pero luego pensé en que sería mejor trabajar con Curator, que es una herramienta basada en Python, que contiene más herramientas necesarias en la gestión de los índices, pero como en tantas cosas de ElasticSearch, la documentación es una verdadero quebradero de cabeza, y lo que existe en Internet sobre el tema, es igual que siempre: las diferencias de versiones crean un batiburrillo de información de mala calidad. Asi que lo dejamos para otro artículo.
Para una salida rápida modifique y verifique un script de Karel Bemelmans que mantengo en mi GitLab. Es importante entender que este script no hace comprobaciones, sobre el resultado del backup o del borrado. Sin ellos, pudiera ser que estemos realizando un backup que no sirve en caso de ser necesario.
El script puede ser ejecutado en la consola shell o en una tarea cron, y esta configurado para guardar las últimas 30 copias.
#!/usr/bin/env bash # # Create backup of ElasticSearch cluster with snapshots # 23/08/18 abdelkarim.mateos@castris.com # # You need the jq binary # download from https://stedolan.github.io/jq/ # sudo apt-get install jq # yum install jq # Mode cron CRON=0 # Limit snapshots save on backup directory LIMIT=30 #Name of our snapshot repo MYBACKUP="excelle_backup" # Name of this host HOST=$(hostname) # Snapshot unique name time based SNAPDATE=$(date +%Y%m%d%H%M%S) # Make backup if [ "$CRON" = true ]; then curl -XPUT "${HOST}:9200/_snapshot/${MYBACKUP}/$SNAPDATE?wait_for_completion=true" else curl -XPUT "${HOST}:9200/_snapshot/${MYBACKUP}/$SNAPDATE?wait_for_completion=true&pretty=true" fi ## Remove old backups # Get list of snapshots SNAPSHOTS=$(curl -s -XGET "${HOST}:9200/_snapshot/${MYBACKUP}/_all" | jq -r ".snapshots[:-${LIMIT}][].snapshot") echo $SNAPSHOTS # Loop the list and delete those that exceed for SNAPSHOT in $SNAPSHOTS do echo "Deleting snapshot: $SNAPSHOT" if [[ $CRON ]]; then curl -s -XDELETE "${HOST}:9200/_snapshot/${MYBACKUP}/$SNAPSHOT" else curl -s -XDELETE "${HOST}:9200/_snapshot/${MYBACKUP}/$SNAPSHOT?pretty=true" fi done
Obtener la lista de los snapshots disponibles
$ curl -s -XGET "[MASTERNODE]:9200/_snapshot/[NOMBRE_BACKUP]/_all?pretty" { "snapshots" : [ { "snapshot" : "20180824085231", "uuid" : "0xWrcEgKTUKd_bLFtPyzMw", "version_id" : 5061099, "version" : "5.6.10", "indices" : [ ".kibana", "excellenting" ], "state" : "SUCCESS", "start_time" : "2018-08-24T06:52:31.545Z", "start_time_in_millis" : 1535093551545, "end_time" : "2018-08-24T06:52:34.471Z", "end_time_in_millis" : 1535093554471, "duration_in_millis" : 2926, "failures" : [ ], "shards" : { "total" : 10, "failed" : 0, "successful" : 10 } }, { "snapshot" : "20180824085459", "uuid" : "X_bpFybeQQyeNmnC5XU6Rg", "version_id" : 5061099, "version" : "5.6.10", "indices" : [ ".kibana", "excellenting" ], "state" : "SUCCESS", "start_time" : "2018-08-24T06:54:59.243Z", "start_time_in_millis" : 1535093699243, "end_time" : "2018-08-24T06:55:02.031Z", "end_time_in_millis" : 1535093702031, "duration_in_millis" : 2788, "failures" : [ ], "shards" : { "total" : 10, "failed" : 0, "successful" : 10 } }, { "snapshot" : "20180824085528", "uuid" : "-Jtx_MFkROKpRuN2s-jgvQ", "version_id" : 5061099, "version" : "5.6.10", "indices" : [ ".kibana", "excellenting" ], "state" : "SUCCESS", "start_time" : "2018-08-24T06:55:28.347Z", "start_time_in_millis" : 1535093728347, "end_time" : "2018-08-24T06:55:31.380Z", "end_time_in_millis" : 1535093731380, "duration_in_millis" : 3033, "failures" : [ ], "shards" : { "total" : 10, "failed" : 0, "successful" : 10 } } ] }
Te dejo un pequeño script para restaurar. Recuerda al leerlo, que primero hay que cerrar el indice, si este existe. Si no existe te dará error el cerrarlo pero no es importante.
#!/usr/bin/env bash # # Restore a snapshot from our repository # Name of snapshot to restore SNAPSHOT=${1?Need a value} HOST=$(hostname) # Name of my index INDEX="excellenting" #Name of our snapshot repo MYBACKUP="excelle_backup" # We need to close the index first curl -XPOST "$HOST:9200/${INDEX}/_close" # Restore the snapshot we want curl -XPOST "${HOST}:9200/_snapshot/${MYBACKUP}/${SNAPSHOT}/_restore" -d '{ "indices": "'"${INDEX}"'" }' # Re-open the index curl -XPOST "${HOST}:9200/${MYBACKUP}/_open"
Una versión actualizada de los script la encontraras en mi GitLab personal
Comparte este articulo en
¡Hola a todos! Vamos a sumergirnos en el fascinante mundo de Mod Security y aprender…
Ya son muchos años en el sector, muchos años pasando por varios paneles de control,…
La lista UCEPROTECT es una herramienta utilizada por muchos administradores de sistemas y proveedores de…
No es la primera vez que me encuentro con el agotamiento de la memoria en…
Descubre cómo solucionar problemas de acceso a servidores con Centos 7, Almalinux 8, Ubuntu 20.04…
Uno de los mensajes más alarmantes que puedes encontrarte es aquel que indica que tu…