如何将Elasticsearch数据从一台服务器移动到另一台服务器


94

如何将Elasticsearch数据从一台服务器移动到另一台服务器?

我有一个服务器A在具有多个索引的一个本地节点上运行Elasticsearch 1.1.1。我想将该数据复制到运行Elasticsearch 1.3.4的服务器B

到目前为止的程序

  1. 关闭两台服务器上的ES
  2. 将所有数据都保存到新服务器上的正确数据目录中。(数据似乎位于我的Debian盒子上的/ var / lib / elasticsearch /中)
  3. 将权限和所有权更改为elasticsearch:elasticsearch
  4. 启动新的ES服务器

当我用ES head插件查看集群时,没有索引出现。

似乎未加载数据。我想念什么吗?


2
对于数据,如果您指的是索引,则可以简单地将elasticsearch / data / <clustername> / nodes / <node id>文件夹中的indexs文件夹移动到新的对应位置。这是Windows上的elasticsearch目录结构。虽然不确定在Debian上是否相同。但您的想法是,只要不破坏兼容性,就可以将索引目录直接从一个群集移动到另一个群集。
bittusarkar 2014年

1
您确定ES 1.1.1和ES 1.3.4使用相同的Lucene版本吗?这可能会导致兼容性问题。另外,不能保证ES元数据相同。我建议以编程方式进行复制。首先复制索引架构,然后导入数据。
Zouzias 2014年

Answers:


125

选定的答案使它听起来比实际要复杂一些,这是您需要的(在系统上首先安装npm)。

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

如果映射保持不变,则可以跳过第一个elasticdump命令以获取后续副本。

我刚刚使用上述方法完成了从AWS到Qbox.io的迁移,没有任何问题。

更多详细信息,请访问:

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

包括完整的帮助页面(截至2016年2月):

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`

我确实尝试过此方法,但是每次都会收到“ Emitted => connect ECONNREFUSED”。
Vagabond

4
如何申请基本身份验证?
Mohd Shahid


@OrtomalaLokni似乎对5.x的支持现在在:github.com/taskrabbit/elasticsearch-dump/pull/268
Beau

我已经为Elasticsearch设置了身份验证,您能告诉我如何在命令中传递用户名和密码以及输入和输出位置吗?
Gr8 Adakron '17

42

使用ElasticDump

1)百胜安装epel-release

2)yum安装nodejs

3)百胜安装npm

4)npm安装elasticdump

5)cd node_modules / elasticdump / bin

6)

./elasticdump \

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

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

  --type=data

这是需要将数据从一个位置传输到另一位置但在同一服务器上的时候。如果需要将数据传输到具有两个不同IP地址的两个不同服务器位置怎么办?
Vagabond

2
@tramp这是2个不同的IP地址
de Raad

1
当心它还不支持Elasticsearch 5:github.com/taskrabbit/elasticsearch-dump/issues/259
Ortomala Lokni

2
看起来现在已支持Elasticsearch 5 github.com/taskrabbit/elasticsearch-dump/pull/268
hayduke


6

我尝试在ubuntu上将数据从ELK 2.4.3移至ELK 5.1.1

以下是步骤

$ 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

在主目录goto中

$ cd node_modules/elasticdump/

执行命令

如果您需要基本的HTTP身份验证,则可以这样使用:

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

从生产中复制索引:

$ ./bin/elasticdump --input="http://Source:9200/Sourceindex" --output="http://username:password@Destination:9200/Destination_index"  --type=data

很好 只要确保sudo apt-get install -y software-properties-common在add-apt-repository之前运行
Sahas

希望它值得+1
Akshay Patil

5

也有_reindex选择

从文档:

通过5.x及更高版本中可用的Elasticsearch重新索引API,您可以将新的Elasticsearch Service部署远程连接到旧的Elasticsearch集群。这将从旧群集中提取数据并将其索引到新群集中。重新索引本质上是从头开始重建索引,并且运行起来可能会占用更多资源。

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

4

如果可以将第二台服务器添加到群集,则可以执行以下操作:

  1. 将服务器B添加到与服务器A群集
  2. 索引副本数的增加
  3. ES将自动将索引复制到服务器B
  4. 关闭服务器A
  5. 减少索引副本的数量

仅当替换数等于节点数时,这才起作用。


3
我相信,当版本不同时,这将不起作用(这是OP的问题)
WoJ 2016年

当然。我现在正在将数据从ESv1.7迁移到ESv5。我的选择不适用于它,因为映射中发生了许多更改。
AndreyP

3

如果有人遇到相同的问题,当尝试从elasticsearch <2.0转储到> 2.0时,您需要执行以下操作:

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']"

1

我一直很成功,只需将索引目录/文件夹复制到新服务器并重新启动它即可。通过执行操作GET /_cat/indices,您将找到索引ID,并且与该ID匹配的文件夹位于其中data\nodes\0\indices(通常在您的elasticsearch文件夹中,除非您移动了它)。



0

如果仅需要将数据从一台Elasticsearch服务器传输到另一台服务器,则还可以使用elasticsearch-document-transfer

脚步:

  1. 在终端中打开目录并运行
    $ npm install elasticsearch-document-transfer.
  2. 建立档案 config.js
  3. 在中添加两个Elasticsearch服务器的连接详细信息 config.js
  4. 在以下位置设置适当的值 options.js
  5. 在终端中运行
    $ node index.js

0

您可以快照化群集的完整状态(包括所有数据索引)并在新群集或服务器中还原它们(使用还原API)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.