bagaimana cara memindahkan data elasticsearch dari satu server ke server lainnya

98

Bagaimana cara memindahkan data Elasticsearch dari satu server ke server lainnya?

Saya memiliki server A yang menjalankan Elasticsearch 1.1.1 pada satu node lokal dengan beberapa indeks. Saya ingin menyalin data itu ke server B yang menjalankan Elasticsearch 1.3.4

Prosedur sejauh ini

  1. Matikan ES di kedua server dan
  2. scp semua data ke dir data yang benar di server baru. (data tampaknya terletak di / var / lib / elasticsearch / di kotak debian saya)
  3. ubah izin dan kepemilikan ke elasticsearch: elasticsearch
  4. mulai server ES baru

Ketika saya melihat cluster dengan plugin kepala ES, tidak ada indeks yang muncul.

Sepertinya datanya tidak dimuat. Apakah saya melewatkan sesuatu?

Jabb
sumber
2
Dengan data jika yang Anda maksud adalah indeks, Anda cukup memindahkan folder indeks di dalam folder elasticsearch / data / <clustername> / node / <node id> ke lokasi baru yang sesuai. Ini adalah struktur direktori elasticsearch di Windows. Tidak yakin apakah itu sama di Debian. Tetapi idenya adalah Anda dapat langsung memindahkan direktori indeks dari satu cluster ke cluster lain dengan asumsi kompatibilitas tidak rusak.
bittusarkar
1
Apakah Anda yakin bahwa ES 1.1.1 dan ES 1.3.4 menggunakan versi Lucene yang sama? Ini dapat menyebabkan masalah kompatibilitas. Selain itu, tidak ada jaminan bahwa metadata ES akan sama. Saya menyarankan untuk melakukan penyalinan secara terprogram. Salin skema indeks terlebih dahulu, lalu impor data.
Zouzias

Jawaban:

129

Jawaban yang dipilih membuatnya terdengar sedikit lebih kompleks daripada yang sebenarnya, berikut ini yang Anda butuhkan (instal npm terlebih dahulu di sistem Anda).

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

Anda dapat melewati perintah elasticdump pertama untuk salinan berikutnya jika pemetaan tetap konstan.

Saya baru saja melakukan migrasi dari AWS ke Qbox.io dengan yang di atas tanpa masalah.

Rincian lebih lanjut di:

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

Halaman bantuan (per Feb 2016) disertakan untuk kelengkapan:

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
sumber
Saya memang mencoba ini tetapi saya mendapatkan "Error Emitted => sambungkan ECONNREFUSED" setiap saat.
Vagabond
4
bagaimana cara menerapkan autentikasi dasar?
Mohd Shahid
Berhati-hatilah karena belum mendukung Elasticsearch 5: github.com/taskrabbit/elasticsearch-dump/issues/259
Ortomala Lokni
@OrtomalaLokni sepertinya dukungan untuk 5.x sekarang ada di: github.com/taskrabbit/elasticsearch-dump/pull/268
Beau
saya telah mengatur otentikasi untuk elasticsearch, dapatkah Anda memberi tahu saya cara memasukkan nama pengguna dan kata sandi dalam perintah bersama dengan lokasi input dan output?
The Gr8 Adakron
42

Gunakan ElasticDump

1) yum install epel-release

2) yum instal nodejs

3) yum install npm

4) npm instal 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
Chris
sumber
Ini adalah saat data perlu ditransfer dari satu lokasi ke lokasi lain tetapi di server yang sama. Bagaimana jika data perlu ditransfer ke dua lokasi server berbeda dengan dua alamat ip berbeda?
Vagabond
2
@tramp itu adalah 2 alamat IP yang berbeda
de Raad
1
Berhati-hatilah karena belum mendukung Elasticsearch 5: github.com/taskrabbit/elasticsearch-dump/issues/259
Ortomala Lokni
2
Sepertinya Elasticsearch 5 sekarang didukung github.com/taskrabbit/elasticsearch-dump/pull/268
hayduke
6

Saya mencoba ubuntu untuk memindahkan data dari ELK 2.4.3 ke ELK 5.1.1

Berikut langkah-langkahnya

$ 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

di direktori home, goto

$ cd node_modules/elasticdump/

jalankan perintahnya

Jika Anda membutuhkan http auth dasar, Anda dapat menggunakannya seperti ini:

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

Salin indeks dari produksi:

$ ./bin/elasticdump --input="http://Source:9200/Sourceindex" --output="http://username:password@Destination:9200/Destination_index"  --type=data
Akshay Patil
sumber
Ini bagus. Pastikan untuk menjalankan sudo apt-get install -y software-properties-commonsebelum add-apt-repository
Sahas
semoga layak mendapat +1
Akshay Patil
5

Ada juga _reindexopsi

Dari dokumentasi:

Melalui API indeks ulang Elasticsearch, tersedia dalam versi 5.x dan yang lebih baru, Anda dapat menghubungkan penerapan Layanan Elasticsearch baru dari jarak jauh ke klaster Elasticsearch lama Anda. Ini menarik data dari cluster lama Anda dan mengindeksnya ke cluster baru Anda. Mengindeks ulang pada dasarnya membangun kembali indeks dari awal dan dapat lebih intensif sumber daya untuk dijalankan.

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
sumber
4

Jika Anda dapat menambahkan server kedua ke cluster, Anda dapat melakukan ini:

  1. Tambahkan Server B ke cluster dengan Server A
  2. Penambahan jumlah replika untuk indeks
  3. ES secara otomatis akan menyalin indeks ke server B
  4. Tutup server A
  5. Penurunan jumlah replika untuk indeks

Ini hanya akan berfungsi jika jumlah pengganti sama dengan jumlah node.

AndreyP
sumber
3
Saya percaya ini tidak akan berfungsi ketika versinya berbeda (seperti yang terjadi dalam pertanyaan OP)
WoJ
Tentu. Saya sekarang sedang mengerjakan migrasi data saya ke ESv5 dari ESv1.7. Pilihan saya tidak akan berfungsi untuk itu, karena banyak hal yang berubah dalam pemetaan.
AndreyP
3

Jika ada yang mengalami masalah yang sama, saat mencoba membuang dari elasticsearch <2.0 ke> 2.0, Anda perlu melakukan:

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']"
Menyesal
sumber
1

Saya selalu berhasil dengan hanya menyalin direktori / folder indeks ke server baru dan memulai ulang. Anda akan menemukan id indeks dengan melakukan GET /_cat/indicesdan folder yang cocok dengan id ini data\nodes\0\indices(biasanya di dalam folder elasticsearch Anda kecuali Anda memindahkannya).

Marc
sumber
1

Kita dapat menggunakan elasticdumpatau multielasticdumpmengambil backup dan mengembalikannya, Kita dapat memindahkan data dari satu server / cluster ke server / cluster lain.

Temukan jawaban rinci yang telah saya berikan di sini .

Keshav Lodhi
sumber
0

Jika Anda hanya perlu mentransfer data dari satu server elasticsearch ke server lain, Anda juga dapat menggunakan elasticsearch-document-transfer .

Langkah:

  1. Buka direktori di terminal Anda dan jalankan
    $ npm install elasticsearch-document-transfer.
  2. Buat file config.js
  3. Tambahkan detail koneksi dari kedua server elasticsearch di config.js
  4. Tetapkan nilai yang sesuai di options.js
  5. Jalankan di terminal
    $ node index.js
penyamaran817
sumber
0

Anda dapat mengambil snapshot dari status lengkap cluster Anda (termasuk semua indeks data) dan memulihkannya (menggunakan API pemulihan) di cluster atau server baru.

sgalinma.dll
sumber
-1

Jika Anda tidak ingin menggunakan elasticdump seperti alat konsol. Anda dapat menggunakan skrip node.js berikutnya

Stepan Poperechnyi
sumber