cómo mover datos de elasticsearch de un servidor a otro

94

¿Cómo muevo los datos de Elasticsearch de un servidor a otro?

Tengo el servidor A que ejecuta Elasticsearch 1.1.1 en un nodo local con varios índices. Me gustaría copiar esos datos al servidor B que ejecuta Elasticsearch 1.3.4

Procedimiento hasta ahora

  1. Apague ES en ambos servidores y
  2. scp todos los datos al directorio de datos correcto en el nuevo servidor. (los datos parecen estar ubicados en / var / lib / elasticsearch / en mis cajas de Debian)
  3. cambiar los permisos y la propiedad a elasticsearch: elasticsearch
  4. iniciar el nuevo servidor ES

Cuando miro el clúster con el complemento ES head, no aparecen índices.

Parece que los datos no se cargan. ¿Me estoy perdiendo de algo?

Jabb
fuente
2
Por datos, si se refiere a índices, simplemente puede mover la carpeta de índices dentro de la carpeta elasticsearch / data / <clustername> / nodes / <node id> a la nueva ubicación correspondiente. Esta es la estructura de directorios de elasticsearch en Windows. Sin embargo, no estoy seguro de si es lo mismo en Debian. Pero la idea es que puede mover directorios de índice directamente de un clúster a otro asumiendo que la compatibilidad no está rota.
bittusarkar
1
¿Está seguro de que ES 1.1.1 y ES 1.3.4 usan la misma versión de lucene? Esto puede causar un problema de compatibilidad. Además, no hay garantía de que los metadatos de ES sean los mismos. Sugeriría hacer la copia programáticamente. Primero copie los esquemas de índice y luego importe los datos.
Zouzias

Respuestas:

125

La respuesta seleccionada hace que suene un poco más complejo de lo que es, lo siguiente es lo que necesita (instale npm primero en su sistema).

npm install -g elasticdump
elasticdump --input=http://mysrc.com:9200/my_index --output=http://mydest.com:9200/my_index --type=mapping
elasticdump --input=http://mysrc.com:9200/my_index --output=http://mydest.com:9200/my_index --type=data

Puede omitir el primer comando elasticdump para copias posteriores si las asignaciones permanecen constantes.

Acabo de realizar una migración de AWS a Qbox.io con lo anterior sin ningún problema.

Más detalles en:

https://www.npmjs.com/package/elasticdump

Página de ayuda (a partir de febrero de 2016) incluida para completar:

elasticdump: Import and export tools for elasticsearch

Usage: elasticdump --input SOURCE --output DESTINATION [OPTIONS]

--input
                    Source location (required)
--input-index
                    Source index and type
                    (default: all, example: index/type)
--output
                    Destination location (required)
--output-index
                    Destination index and type
                    (default: all, example: index/type)
--limit
                    How many objects to move in bulk per operation
                    limit is approximate for file streams
                    (default: 100)
--debug
                    Display the elasticsearch commands being used
                    (default: false)
--type
                    What are we exporting?
                    (default: data, options: [data, mapping])
--delete
                    Delete documents one-by-one from the input as they are
                    moved.  Will not delete the source index
                    (default: false)
--searchBody
                    Preform a partial extract based on search results
                    (when ES is the input,
                    (default: '{"query": { "match_all": {} } }'))
--sourceOnly
                    Output only the json contained within the document _source
                    Normal: {"_index":"","_type":"","_id":"", "_source":{SOURCE}}
                    sourceOnly: {SOURCE}
                    (default: false)
--all
                    Load/store documents from ALL indexes
                    (default: false)
--bulk
                    Leverage elasticsearch Bulk API when writing documents
                    (default: false)
--ignore-errors
                    Will continue the read/write loop on write error
                    (default: false)
--scrollTime
                    Time the nodes will hold the requested search in order.
                    (default: 10m)
--maxSockets
                    How many simultaneous HTTP requests can we process make?
                    (default:
                      5 [node <= v0.10.x] /
                      Infinity [node >= v0.11.x] )
--bulk-mode
                    The mode can be index, delete or update.
                    'index': Add or replace documents on the destination index.
                    'delete': Delete documents on destination index.
                    'update': Use 'doc_as_upsert' option with bulk update API to do partial update.
                    (default: index)
--bulk-use-output-index-name
                    Force use of destination index name (the actual output URL)
                    as destination while bulk writing to ES. Allows
                    leveraging Bulk API copying data inside the same
                    elasticsearch instance.
                    (default: false)
--timeout
                    Integer containing the number of milliseconds to wait for
                    a request to respond before aborting the request. Passed
                    directly to the request library. If used in bulk writing,
                    it will result in the entire batch not being written.
                    Mostly used when you don't care too much if you lose some
                    data when importing but rather have speed.
--skip
                    Integer containing the number of rows you wish to skip
                    ahead from the input transport.  When importing a large
                    index, things can go wrong, be it connectivity, crashes,
                    someone forgetting to `screen`, etc.  This allows you
                    to start the dump again from the last known line written
                    (as logged by the `offset` in the output).  Please be
                    advised that since no sorting is specified when the
                    dump is initially created, there's no real way to
                    guarantee that the skipped rows have already been
                    written/parsed.  This is more of an option for when
                    you want to get most data as possible in the index
                    without concern for losing some rows in the process,
                    similar to the `timeout` option.
--inputTransport
                    Provide a custom js file to us as the input transport
--outputTransport
                    Provide a custom js file to us as the output transport
--toLog
                    When using a custom outputTransport, should log lines
                    be appended to the output stream?
                    (default: true, except for `$`)
--help
                    This page

Examples:

# Copy an index from production to staging with mappings:
elasticdump \
  --input=http://production.es.com:9200/my_index \
  --output=http://staging.es.com:9200/my_index \
  --type=mapping
elasticdump \
  --input=http://production.es.com:9200/my_index \
  --output=http://staging.es.com:9200/my_index \
  --type=data

# Backup index data to a file:
elasticdump \
  --input=http://production.es.com:9200/my_index \
  --output=/data/my_index_mapping.json \
  --type=mapping
elasticdump \
  --input=http://production.es.com:9200/my_index \
  --output=/data/my_index.json \
  --type=data

# Backup and index to a gzip using stdout:
elasticdump \
  --input=http://production.es.com:9200/my_index \
  --output=$ \
  | gzip > /data/my_index.json.gz

# Backup ALL indices, then use Bulk API to populate another ES cluster:
elasticdump \
  --all=true \
  --input=http://production-a.es.com:9200/ \
  --output=/data/production.json
elasticdump \
  --bulk=true \
  --input=/data/production.json \
  --output=http://production-b.es.com:9200/

# Backup the results of a query to a file
elasticdump \
  --input=http://production.es.com:9200/my_index \
  --output=query.json \
  --searchBody '{"query":{"term":{"username": "admin"}}}'

------------------------------------------------------------------------------
Learn more @ https://github.com/taskrabbit/elasticsearch-dump`enter code here`
cazcade_neil
fuente
Intenté esto pero obtengo un "Error Emitido => conectar ECONNREFUSED" cada vez.
Vagabond
4
¿Cómo aplicar la autenticación básica?
Mohd Shahid
Tenga en cuenta que todavía no es compatible con Elasticsearch 5: github.com/taskrabbit/elasticsearch-dump/issues/259
Ortomala Lokni
@OrtomalaLokni parece que el soporte para 5.x ahora está en: github.com/taskrabbit/elasticsearch-dump/pull/268
Beau
He configurado la autenticación para elasticsearch, ¿puede decirme cómo pasar el nombre de usuario y la contraseña en el comando junto con la ubicación de entrada y salida?
The Gr8 Adakron
42

Utilice ElasticDump

1) yum instalar epel-release

2) yum instalar nodejs

3) yum instalar npm

4) npm instalar elasticdump

5) cd módulos_nodo / elasticdump / bin

6)

./elasticdump \

  --input=http://192.168.1.1:9200/original \

  --output=http://192.168.1.2:9200/newCopy \

  --type=data
Chris
fuente
Aquí es cuando los datos deben transferirse de una ubicación a otra pero en el mismo servidor. ¿Qué sucede si los datos deben transferirse a dos ubicaciones de servidor diferentes con dos direcciones IP diferentes?
Vagabond
2
@tramp son 2 direcciones IP diferentes
de Raad
1
Tenga en cuenta que todavía no es compatible con Elasticsearch 5: github.com/taskrabbit/elasticsearch-dump/issues/259
Ortomala Lokni
2
Parece que Elasticsearch 5 ahora es compatible github.com/taskrabbit/elasticsearch-dump/pull/268
hayduke
6

Probé en ubuntu para mover datos de ELK 2.4.3 a ELK 5.1.1

Los siguientes son los pasos

$ sudo apt-get update

$ sudo apt-get install -y python-software-properties python g++ make

$ sudo add-apt-repository ppa:chris-lea/node.js

$ sudo apt-get update

$ sudo apt-get install npm

$ sudo apt-get install nodejs

$ npm install colors

$ npm install nomnom

$ npm install elasticdump

en el directorio de inicio ir

$ cd node_modules/elasticdump/

ejecutar el comando

Si necesita autenticación http básica, puede usarla así:

--input=http://name:password@localhost:9200/my_index

Copie un índice de producción:

$ ./bin/elasticdump --input="http://Source:9200/Sourceindex" --output="http://username:password@Destination:9200/Destination_index"  --type=data
Akshay Patil
fuente
Esto es bueno. Solo asegúrese de ejecutar sudo apt-get install -y software-properties-commonantes de add-apt-repository
Sahas
espero que se merezca +1
Akshay Patil
5

También existe la _reindexopción

De la documentación:

A través de la API de reindexación de Elasticsearch, disponible en la versión 5.xy posterior, puede conectar su nueva implementación de Elasticsearch Service de forma remota a su antiguo clúster de Elasticsearch. Esto extrae los datos de su antiguo clúster y los indexa en el nuevo. La reindexación esencialmente reconstruye el índice desde cero y su ejecución puede requerir más recursos.

POST _reindex
{
  "source": {
    "remote": {
      "host": "https://REMOTE_ELASTICSEARCH_ENDPOINT:PORT",
      "username": "USER",
      "password": "PASSWORD"
    },
    "index": "INDEX_NAME",
    "query": {
      "match_all": {}
    }
  },
  "dest": {
    "index": "INDEX_NAME"
  }
}
mido
fuente
4

Si puede agregar el segundo servidor al clúster, puede hacer esto:

  1. Agregue el servidor B al clúster con el servidor A
  2. Incrementar el número de réplicas de índices
  3. ES copiará automáticamente los índices al servidor B
  4. Cerrar servidor A
  5. Disminuir el número de réplicas de índices.

Esto solo funcionará si el número de reemplazos es igual al número de nodos.

AndreyP
fuente
3
Creo que esto no funcionará cuando las versiones sean diferentes (como es el caso en la pregunta de OP)
WoJ
Por supuesto. Ahora estoy trabajando en la migración de mis datos a ESv5 desde ESv1.7. Mi opción no funcionará, ya que muchas cosas cambiaron en las asignaciones.
AndreyP
3

Si alguien encuentra el mismo problema, al intentar volcar desde elasticsearch <2.0 a> 2.0, debe hacer:

elasticdump --input=http://localhost:9200/$SRC_IND --output=http://$TARGET_IP:9200/$TGT_IND --type=analyzer
elasticdump --input=http://localhost:9200/$SRC_IND --output=http://$TARGET_IP:9200/$TGT_IND --type=mapping
elasticdump --input=http://localhost:9200/$SRC_IND --output=http://$TARGET_IP:9200/$TGT_IND --type=data --transform "delete doc.__source['_id']"
Regnoult
fuente
1

Siempre he tenido éxito simplemente copiando el directorio / carpeta de índice en el nuevo servidor y reiniciándolo. Encontrará la identificación del índice haciendo GET /_cat/indicesy la carpeta que coincide con esta identificación se encuentra data\nodes\0\indices(generalmente dentro de su carpeta elasticsearch a menos que la haya movido).

Bagazo
fuente
1

Podemos usar elasticdumpo multielasticdumppara realizar la copia de seguridad y restaurarla. Podemos mover datos de un servidor / clúster a otro servidor / clúster.

Encuentre una respuesta detallada que he proporcionado aquí .

Keshav Lodhi
fuente
0

Si simplemente necesita transferir datos de un servidor de elasticsearch a otro, también puede usar elasticsearch-document-transfer .

Pasos:

  1. Abra un directorio en su terminal y ejecute
    $ npm install elasticsearch-document-transfer.
  2. Crea un archivo config.js
  3. Agregue los detalles de conexión de ambos servidores de elasticsearch en config.js
  4. Establecer valores apropiados en options.js
  5. Corre en la terminal
    $ node index.js
masquerade817
fuente
0

Puede tomar una instantánea del estado completo de su clúster (incluidos todos los índices de datos) y restaurarlos (utilizando la API de restauración) en el nuevo clúster o servidor.

sgalinma
fuente