あるサーバーから別のサーバーにelasticsearchデータを移動する方法


94

Elasticsearchデータをあるサーバーから別のサーバーに移動するにはどうすればよいですか?

複数のインデックスを持つ1つのローカルノードでElasticsearch 1.1.1実行しているサーバーAがあります。そのデータをElasticsearch 1.3.4を実行しているサーバーBにコピーしたい

これまでの手順

  1. 両方のサーバーでESをシャットダウンし、
  2. すべてのデータを新しいサーバーの正しいデータディレクトリにscpします。(データは私のdebianボックスの/ var / lib / elasticsearch /にあるようです)
  3. 権限と所有権をelasticsearch:elasticsearchに変更します
  4. 新しいESサーバーを起動します

ESヘッドプラグインでクラスターを見ると、インデックスが表示されません。

データが読み込まれていないようです。何か不足していますか?


2
インデックスを意味する場合は、データによって、簡単にelasticsearch / data / <clustername> / nodes / <node id>フォルダー内のインデックスフォルダーを新しい対応する場所に移動できます。これは、Windowsのelasticsearchディレクトリ構造です。Debianでも同じかどうかはわかりません。ただし、互換性が損なわれていないことを前提として、インデックスディレクトリを1つのクラスターから別のクラスターに直接移動できます。
bittusarkar 2014年

1
ES 1.1.1とES 1.3.4で同じバージョンのLuceneを使用しますか?これにより、互換性の問題が発生する可能性があります。また、ESメタデータが同じである保証はありません。プログラムでコピーすることをお勧めします。最初にインデックススキーマをコピーしてから、データをインポートします。
Zouzias

回答:


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`

私はこれを試しましたが、毎回 "エラーが発生しました=> ECONNREFUSEDに接続しました"が表示されます。
Vagabond 2016年

4
基本認証を適用する方法?
Mohd Shahid

Elasticsearch 5はまだサポートされていないことに注意してください:github.com/taskrabbit/elasticsearch-dump/issues/259
Ortomala Lokni

@OrtomalaLokniは5.xのサポートのように見えます:github.com/taskrabbit/elasticsearch-dump/pull/268
Beau

elasticsearchに認証を設定しました。コマンドでユーザー名とパスワードを入力場所と出力場所とともに渡す方法を教えてください。
Gr8アダクロン2017

42

ElasticDumpを使用する

1)yum install epel-release

2)yum install nodejs

3)yum install npm

4)npm install 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

これは、データをある場所から別の場所に転送する必要があるが、同じサーバー上にある場合です。2つの異なるIPアドレスを持つ2つの異なるサーバーロケーションにデータを転送する必要がある場合はどうなりますか?
Vagabond 2016

2
@trampは2つの異なるIPアドレスです
de Raad

1
Elasticsearch 5はまだサポートされていないことに注意してください。github.com
taskrabbit /

2
Elasticsearch 5がサポートされるようになりましたgithub.com/taskrabbit/elasticsearch-dump/pull/268
hayduke


6

ELK 2.4.3からELK 5.1.1にデータを移動するためにubuntuを試してみました

手順は次のとおりです

$ 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-commonadd-apt-repositoryの前に実行するようにしてください
Sahas

+1に値することを願っています
Akshay Patil 2017

5

_reindexオプションもあります

ドキュメントから:

バージョン5.x以降で利用可能なElasticsearch reindex 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

クラスタに2台目のサーバーを追加できる場合は、次のようにしてください。

  1. サーバーAのクラスターにサーバーBを追加する
  2. インデックスのレプリカ数を増やす
  3. ESは自動的にインデックスをサーバーBにコピーします
  4. サーバーAを閉じる
  5. インデックスのレプリカ数を減らす

これは、置換の数がノードの数と等しい場合にのみ機能します。


3
バージョンが異なる場合、これは機能しないと思います(OPの質問の場合と同様)
WoJ

承知しました。現在、ESv1.7からESv5へのデータの移行に取り組んでいます。多くのことがマッピングで変更されたので、私のオプションはそれでは機能しません。
AndreyP 2017

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フォルダー内に移動しない限り)あります。


1

elasticdumpまたはmultielasticdumpを使用して、バックアップを取り、それを復元できます。あるサーバー/クラスターから別のサーバー/クラスターにデータを移動できます。

私が ここで提供した詳細な回答を見つけてください


0

単に1つの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を使用して)新しいクラスターまたはサーバーに復元できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.