jak przenieść dane z elastycznego wyszukiwania z jednego serwera na drugi

98

Jak przenieść dane Elasticsearch z jednego serwera na inny?

Mam serwer A z uruchomionym Elasticsearch 1.1.1 na jednym węźle lokalnym z wieloma indeksami. Chciałbym skopiować te dane na serwer B, na którym działa Elasticsearch 1.3.4

Dotychczasowa procedura

  1. Zamknij ES na obu serwerach i
  2. scp wszystkie dane do odpowiedniego katalogu danych na nowym serwerze. (dane wydają się znajdować w / var / lib / flexiblesearch / na moich skrzynkach Debiana)
  3. Zmień uprawnienia i własność na flexiblesearch: flexiblesearch
  4. uruchom nowy serwer ES

Kiedy patrzę na klaster z wtyczką ES head, nie pojawiają się żadne indeksy.

Wygląda na to, że dane nie są ładowane. Czy coś mi brakuje?

Jabb
źródło
2
Przez dane, jeśli masz na myśli indeksy, możesz po prostu przenieść folder indeksów do folderu flexsearch / data / <clustername> / nodes / <node id> do nowej odpowiedniej lokalizacji. To jest struktura katalogów elastyczna wyszukiwarka w systemie Windows. Nie jestem jednak pewien, czy to samo dotyczy Debiana. Ale chodzi o to, że możesz bezpośrednio przenosić katalogi indeksu z jednego klastra do drugiego, zakładając, że zgodność nie jest zepsuta.
bittusarkar
1
Czy na pewno ES 1.1.1 i ES 1.3.4 używają tej samej wersji Lucene? Może to spowodować problem ze zgodnością. Nie ma również gwarancji, że metadane ES będą takie same. Sugerowałbym wykonanie kopii programowej. Najpierw skopiuj schematy indeksu, a następnie zaimportuj dane.
Zouzias

Odpowiedzi:

129

Wybrana odpowiedź sprawia, że ​​brzmi to nieco bardziej skomplikowane, niż jest w rzeczywistości, poniżej jest to, czego potrzebujesz (najpierw zainstaluj npm w swoim systemie).

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

Możesz pominąć pierwsze polecenie elastycznego zrzutu dla kolejnych kopii, jeśli mapowania pozostają stałe.

Właśnie przeprowadziłem migrację z AWS do Qbox.io z powyższym bez żadnych problemów.

Więcej szczegółów na:

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

Strona pomocy (stan na luty 2016) dołączona dla kompletności:

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
źródło
Próbowałem tego, ale za każdym razem otrzymuję komunikat „Error Emitted => connect ECONNREFUSED”.
Vagabond
4
jak zastosować podstawową autoryzację?
Mohd Shahid
Uważaj, nie obsługuje jeszcze Elasticsearch 5: github.com/taskrabbit/elasticsearch-dump/issues/259
Ortomala Lokni
@OrtomalaLokni wygląda na to, że wsparcie dla 5.x jest teraz dostępne: github.com/taskrabbit/elasticsearch-dump/pull/268
Beau
Ustawiłem uwierzytelnianie dla elastycznego wyszukiwania, czy możesz mi powiedzieć, jak przekazać nazwę użytkownika i hasło w poleceniu wraz z lokalizacją wejściową i wyjściową?
Gr8 Adakron
42

Użyj ElasticDump

1) yum install epel-release

2) yum install nodejs

3) yum install npm

4) npm zainstaluj elastyczny dump

5) cd node_modules / flexibledump / bin

6)

./elasticdump \

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

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

  --type=data
Chris
źródło
Dzieje się tak, gdy dane muszą zostać przeniesione z jednej lokalizacji do drugiej, ale na tym samym serwerze. A co, jeśli dane muszą zostać przesłane do dwóch różnych lokalizacji serwerów z dwoma różnymi adresami IP?
Vagabond,
2
@tramp to 2 różne adresy IP
de Raad
1
Uważaj, nie obsługuje jeszcze Elasticsearch 5: github.com/taskrabbit/elasticsearch-dump/issues/259
Ortomala Lokni
2
Wygląda na to, że Elasticsearch 5 jest teraz obsługiwany github.com/taskrabbit/elasticsearch-dump/pull/268
hayduke
6

Próbowałem na Ubuntu przenieść dane z ELK 2.4.3 do ELK 5.1.1

Oto kroki

$ 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

w katalogu domowym goto

$ cd node_modules/elasticdump/

wykonać polecenie

Jeśli potrzebujesz podstawowego uwierzytelniania http, możesz go użyć w następujący sposób:

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

Skopiuj indeks z produkcji:

$ ./bin/elasticdump --input="http://Source:9200/Sourceindex" --output="http://username:password@Destination:9200/Destination_index"  --type=data
Akshay Patil
źródło
To jest dobre. Po prostu upewnij się, że uruchomiłeś sudo apt-get install -y software-properties-commonprzed add-apt-repository
Sahas
mam nadzieję, że zasługuje na +1
Akshay Patil
5

Jest też taka _reindexopcja

Z dokumentacji:

Za pomocą interfejsu API reindeksowania usługi Elasticsearch, dostępnego w wersji 5.xi nowszych, można zdalnie podłączyć nowe wdrożenie usługi Elasticsearch do starego klastra Elasticsearch. To pobiera dane ze starego klastra i indeksuje je do nowego. Ponowne zindeksowanie zasadniczo odbudowuje indeks od podstaw, a jego uruchomienie może wymagać więcej zasobów.

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
źródło
4

Jeśli można dodać drugi serwer do klastra, można to zrobić:

  1. Dodaj serwer B do klastra z serwerem A
  2. Zwiększ liczbę replik dla indeksów
  3. ES automatycznie skopiuje indeksy na serwer B
  4. Zamknij serwer A
  5. Zmniejsz liczbę replik dla indeksów

Działa to tylko wtedy, gdy liczba zastąpień jest równa liczbie węzłów.

AndreyP
źródło
3
Wierzę, że to nie zadziała, gdy wersje będą różne (jak to ma miejsce w pytaniu OP)
WoJ
Pewnie. Obecnie pracuję nad migracją moich danych do ESv5 z ESv1.7. Moja opcja nie zadziała, ponieważ wiele rzeczy zmieniło się w mapowaniach.
AndreyP
3

Jeśli ktoś napotka ten sam problem, podczas próby zrzucenia z pliku flexiblesearch <2.0 do> 2.0, musisz zrobić:

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
źródło
1

Zawsze odnosiłem sukcesy po prostu kopiując katalog / folder indeksu na nowy serwer i restartując go. Identyfikator indeksu znajdziesz, wykonując, GET /_cat/indicesa folder pasujący do tego identyfikatora znajduje się data\nodes\0\indices(zwykle w folderze Elasticsearch, chyba że go przeniosłeś).

Marc
źródło
1

Możemy użyć elasticdumplub multielasticdumpwykonać kopię zapasową i przywrócić ją, Możemy przenieść dane z jednego serwera / klastra na inny serwer / klaster.

Proszę znaleźć szczegółową odpowiedź, której udzieliłem tutaj .

Keshav Lodhi
źródło
0

Jeśli chcesz po prostu przenieść dane z jednego serwera elastycznego wyszukiwania na inny, możesz również skorzystać z funkcji flexsearch-document-transfer .

Kroki:

  1. Otwórz katalog w swoim terminalu i uruchom
    $ npm install elasticsearch-document-transfer.
  2. Utwórz plik config.js
  3. Dodaj szczegóły połączenia obu serwerów Elasticsearch w config.js
  4. Ustaw odpowiednie wartości w options.js
  5. Uruchom w terminalu
    $ node index.js
maskarada817
źródło
0

Możesz wykonać migawkę pełnego stanu klastra (w tym wszystkich indeksów danych) i przywrócić je (za pomocą interfejsu API przywracania) w nowym klastrze lub serwerze.

sgalinma
źródło
-1

Jeśli nie chcesz używać elastycznego zrzutu jak narzędzia konsoli. Możesz użyć następnego skryptu node.js.

Stepan Poperechnyi
źródło