Guía de Elasticdump - Mover y guardar índices de Elasticsearch

Elasticdump es una herramienta liviana que copia datos hacia y desde los índices de Elasticsearch. En esta guía, veremos cómo instalar y usar Elasticdump para facilitar su trabajo con Elasticsearch.

Introducción

Elasticsearch inicialmente comenzó como un motor de búsqueda personalizado. En estos días, ha ido más allá de ese rol singular, ya que es parte de pilas de agregación de registros, monitoreo de seguridad e incluso como un almacén de datos para realizar análisis exploratorios.

Los índices en Elasticsearch es donde se almacenan los datos y, a menudo, hay ocasiones en las que estos índices deben transportarse de un clúster a otro. Quizás solo necesitemos una copia de seguridad segura antes de mover datos a otro clúster o actualizar versiones. Elasticdump es una herramienta que ayuda a facilitar esta operación de copia de seguridad y restauración.

Elasticdump es una herramienta creada para mover y guardar índices de Elasticsearch.

En esta guía, veremos cómo usar Elasticdump y cómo crear y mover índices entre clústeres en su computadora local.

Note: To follow this tutorial, you need to have ventana acoplable instalada, as well as MNP.

¿Qué es Elasticdump y por qué usarlo?

Quienes estén familiarizados con Elasticsearch conocerán su característica "Snapshot and Restore" para facilitar estas operaciones. Sí, de hecho es una característica inteligente que ayuda a respaldar índices individuales o un grupo completo. Mientras explora esa opción para una pequeña cantidad de índices o clústeres, es posible que el uso de la característica "Instantánea y restauración" sea una exageración. Esto es aún más pronunciado cuando no hay un sistema para tomar instantáneas de forma incremental.

Aquí es donde Elasticdump puede ayudar: es una herramienta liviana que puede mover y guardar índices con un repositorio remoto requerido por "Snapshot and Restore" de Elasticsearch.

Esto es lo que puede hacer Elasticdump:

  • Copiar índices de un clúster a otro
  • Volcar índices a archivos planos.
  • Copia de seguridad de índices y asignaciones
  • Restaurar índices en diferentes versiones de Elasticsearch
  • Multielasticdump que viene junto con Elasticdump puede exportar múltiples índices en paralelo

Configuración de Elasticdump

Instalación

Elasticdump es un paquete de Node y se puede descargar directamente desde MNP. Necesitaremos tener instalado Node.js, junto con Node Package Manager (NPM).

Avancemos e instálelos, antes de descargar Elasticdump:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
$ sudo apt install nodejs npm # Install Node.js + NPM
$ sudo npm install n -g # Install helper package to get latest Node.js + NPM versions
/usr/local/bin/n -> /usr/local/lib/node_modules/n/bin/n
/usr/local/lib
└── [correo electrónico protegido]
$ sudo n latest # Get latest version of NPM

  installing : node-v16.2.0
       mkdir : /usr/local/n/versions/node/16.2.0
       fetch : https://nodejs.org/dist/v16.2.0/node-v16.2.0-linux-x64.tar.xz
   installed : v16.2.0 (with npm 7.13.0)

Note: the node command changed location and the old location may be remembered in your current shell.
         old : /usr/bin/node
         new : /usr/local/bin/node
To reset the command location hash either start a new shell or execute PATH="$PATH"

$ sudo npm install elasticdump -g # Install Elasticdump globally on your local machine

Esto instala Elasticdump globalmente y la instalación se puede verificar usando el siguiente comando:

1
2
$ elasticdump --version
6.71.0

Configuración de un clúster de búsqueda elástica (opcional) {#configuración de un clúster de búsqueda elástica opcional}

Para probar Elasticdump, deberá tener al menos un clúster de Elasticsearch con una configuración de un solo nodo. Si ya tiene un clúster de Elasticsearch ejecutándose, [puede omitir este paso]{.underline}.

Para otros, los siguientes comandos activarán un contenedor de Elasticsearch por usted. Asegúrese de tener Docker o Docker Desktop instalado y ejecutándose en su máquina. Puede descargar su instalador adecuado desde aquí.

Una vez que su servidor Docker esté en funcionamiento, creemos un directorio, que contendrá el volumen para almacenar los datos de Elasticsearch. Si no se hace esto, el volumen de Elasticsearch sería efímero y sus datos se perderán si el contenedor deja de funcionar:

1
2
3
$ mkdir -p data/ES9200
$ mkdir -p data/ES9400
$ vol_location=`pwd`

Ahora puede activar su contenedor de Elasticsearch ingresando el siguiente comando:

1
$ docker run -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -v ${vol_location}/data/es9200:/usr/share/elasticsearch/data --name=es_source -d docker.elastic.co/elasticsearch/elasticsearch:7.13.0

Analicemos un poco este comando.

Le hemos ordenado a Docker que publique (bandera -p) el puerto 9200 en su máquina host en el puerto 9200 en su contenedor, y luego se ejecuta el mismo proceso para 9300. También hemos asignado una variable de entorno (indicador -e) que indica que será una configuración de un solo nodo.

Luego, adjuntamos el volumen (marca -v) al directorio creado en la configuración anterior, asignado al directorio de datos dentro del contenedor, en el que se almacenarán los datos.

Finalmente, el indicador --name es para dar un buen nombre al contenedor, mientras que el indicador -d es para hacer que el contenedor se ejecute en segundo plano, y docker.elastic.co/elasticsearch/elasticsearch:7.13.0 es el nombre de la imagen.

Copiaremos los datos de este clúster de Elasticsearch a otro clúster mediante Elasticdump. Para que esto suceda, puede crear otro clúster conocido como es_target emitiendo el siguiente comando:

1
$ docker run -p 9400:9200 -p 9500:9300 -e "discovery.type=single-node" -v ${vol_location}/data/es9400:/usr/share/elasticsearch/data --name=es_target -d docker.elastic.co/elasticsearch/elasticsearch:7.13.0

Nota: El servicio no se ejecutará en un puerto que ya esté siendo utilizado por otro servicio.

Puede verificar si sus contenedores de clústeres de Elasticsearch funcionan bien emitiendo el siguiente comando:

1
2
3
4
5
6
$ docker ps
CONTAINER ID        IMAGE                                                  COMMAND                  CREATED
STATUS              PORTS                                                                                  NAMES
c0aa983abb21        docker.elastic.co/elasticsearch/elasticsearch:7.13.0   "/bin/tini -- /usr/l…"   9 hours ago
Up 2 hours          0.0.0.0:9400->9200/tcp, 9400->9200/tcp, 0.0.0.0:9500->9300/tcp, 9500->9300/tcp   es_target
eb30714b5302        docker.elastic.co/elasticsearch/elasticsearch:7.13.0   "/bin/tini -- /usr/l…"   10 hours ago        Up 3 hours          0.0.0.0:9200->9200/tcp, 9200->9200/tcp, 0.0.0.0:9300->9300/tcp, 9300->9300/tcp   es_source

¡Los contenedores que ha creado se ven bien! Profundicemos en el uso de Elasticdump.

Trabajando con Elasticdump

Con un contenedor listo, podemos comenzar a trabajar con Elasticdump.

Restauración del índice

Los grupos están listos, pero parecen vacíos. Vamos a crear un índice y cargar datos en uno de los clústeres. El clúster es_source se ejecuta en el puerto 9200 y se puede acceder a él a través de http://localhost:9200. Ejecute los siguientes comandos para descargar el mapeo y los datos que se cargarán:

1
2
$ wget https://raw.githubusercontent.com/wikihtp/moving-elasticsearch-indices-with-elasticdump/main/logs_mapping.json
$ wget https://raw.githubusercontent.com/wikihtp/moving-elasticsearch-indices-with-elasticdump/main/logs_data.json

Intentemos cargar estos archivos en el clúster es_source bajo el índice log-2021-06-01 usando Elasticdump:

1
2
$ elasticdump --input=logs_mapping.json --output=http://localhost:9200/log-2021-06-01 --type=mapping
$ elasticdump --input=logs_data.json --output=http://localhost:9200/logindex --type=data

Aquí hay tres indicadores: --input corresponde al archivo JSON que hemos descargado, --output corresponde al extremo del clúster y --type corresponde al mapeo o datos que definen qué exportar.

Elasticdump toma la entrada como estos archivos y escribe la salida en el índice log-2021-06-01 como:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
$ elasticdump --input=logs_mapping.json --output=http://localhost:9200/log-2021-06-01 --type=mapping
Sat, 05 Jun 2021 12:30:52 GMT | starting dump
Sat, 05 Jun 2021 12:30:52 GMT | got 1 objects from source file (offset: 0)
Sat, 05 Jun 2021 12:30:59 GMT | sent 1 objects to destination elasticsearch, wrote 1
Sat, 05 Jun 2021 12:30:59 GMT | got 0 objects from source file (offset: 1)
Sat, 05 Jun 2021 12:30:59 GMT | Total Writes: 1
Sat, 05 Jun 2021 12:30:59 GMT | dump complete

$ elasticdump --input=logs_data.json --output=http://localhost:9200/log-2021-06-01 --type=data
Sat, 05 Jun 2021 12:31:23 GMT | starting dump
Sat, 05 Jun 2021 12:31:24 GMT | got 100 objects from source file (offset: 0)
Sat, 05 Jun 2021 12:31:26 GMT | sent 100 objects to destination elasticsearch, wrote 100
Sat, 05 Jun 2021 12:31:26 GMT | got 100 objects from source file (offset: 100)
Sat, 05 Jun 2021 12:31:27 GMT | sent 100 objects to destination elasticsearch, wrote 100
Sat, 05 Jun 2021 12:31:27 GMT | got 100 objects from source file (offset: 200)
Sat, 05 Jun 2021 12:31:28 GMT | sent 100 objects to destination elasticsearch, wrote 100
Sat, 05 Jun 2021 12:31:28 GMT | got 0 objects from source file (offset: 300)
Sat, 05 Jun 2021 12:31:28 GMT | got 0 objects from source file (offset: 300)
Sat, 05 Jun 2021 12:31:28 GMT | Total Writes: 300
Sat, 05 Jun 2021 12:31:28 GMT | dump complete

Verifiquemos si la restauración se completó con éxito:

1
2
$ curl localhost:9200/_cat/indices
yellow open log-2021-06-01 UD4SRzu-TjCNdVZatdOQsA 1 1 300 0 305.5kb 305.5kb

Hay 300 documentos en Elasticsearch que constituyen un tamaño total de 305.5kb.

Copia del índice entre clústeres {#copia del índice entre clústeres}

La sintaxis que se ve arriba es similar en el uso de Elasticdump para diferentes escenarios. Copiemos ahora el índice creado previamente en un nuevo índice en otro clúster:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
$ elasticdump --input=http://localhost:9200/log-2021-06-01 --output=http://localhost:9400/log-2021-06-01
Sat, 05 Jun 2021 10:05:24 GMT | starting dump
Sat, 05 Jun 2021 10:05:24 GMT | got 100 objects from source elasticsearch (offset: 0)
Sat, 05 Jun 2021 10:05:28 GMT | sent 100 objects to destination elasticsearch, wrote 100
Sat, 05 Jun 2021 10:05:28 GMT | got 100 objects from source elasticsearch (offset: 100)
Sat, 05 Jun 2021 10:05:28 GMT | sent 100 objects to destination elasticsearch, wrote 100
Sat, 05 Jun 2021 10:05:28 GMT | got 100 objects from source elasticsearch (offset: 200)
Sat, 05 Jun 2021 10:05:30 GMT | sent 100 objects to destination elasticsearch, wrote 100
Sat, 05 Jun 2021 10:05:30 GMT | got 0 objects from source elasticsearch (offset: 300)
Sat, 05 Jun 2021 10:05:30 GMT | Total Writes: 300
Sat, 05 Jun 2021 10:05:30 GMT | dump complete

Elasticdump creará un nuevo índice para usted si el índice de salida no existe. Verifiquemos nuevamente si el índice se ha creado correctamente.

1
2
$ curl localhost:9400/_cat/indices
yellow open log-2021-06-01 UD4SRzu-TjCNdVZatdOQsA 1 1 300 0 305.5kb 305.5kb

Conclusión

Tan simple como suena, la herramienta Elasticdump es una herramienta imprescindible para cualquier persona que trabaje con Elasticsearch. rch.