як перемістити дані еластичного пошуку з одного сервера на інший


94

Як перемістити дані Elasticsearch з одного сервера на інший?

У мене є сервер A, що працює Elasticsearch 1.1.1 на одному локальному вузлі з декількома індексами. Я хотів би скопіювати ці дані на сервер B із запущеним Elasticsearch 1.3.4

Процедура поки що

  1. Вимкніть ES на обох серверах і
  2. scp всі дані до правильного каталогу даних на новому сервері. (дані, схоже, знаходяться за адресою / var / lib / elasticsearch / на моїх коробках debian)
  3. змінити дозволи та право власності на elasticsearch: elasticsearch
  4. запустити новий ES-сервер

Коли я дивлюся на кластер із плагіном ES head, ніяких індексів не відображається.

Здається, дані не завантажуються. Мені чогось не вистачає?


2
Під даними, якщо ви маєте на увазі індекси, ви можете просто перемістити папку індексів всередині папки elasticsearch / data / <clustername / / nodes / <node id> у нове відповідне розташування. Це структура каталогів elasticsearch у Windows. Не впевнений, що це те саме на Debian. Але ідея полягає в тому, що ви можете безпосередньо переміщувати каталоги індексів з одного кластера в інший, припускаючи, що сумісність не порушена.
bittusarkar

1
Ви впевнені, що ES 1.1.1 та ES 1.3.4 використовують однакову версію люцену? Це може спричинити проблему сумісності. Крім того, немає гарантії, що метадані 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 р.) Включена для повноти:

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

4
як застосувати базові аутентифікації?
Мохд Шахід

Остерігайтеся, що він ще не підтримує Elasticsearch 5: github.com/taskrabbit/elasticsearch-dump/issues/259
Ортомала Локні,

@OrtomalaLokni схоже, що підтримка 5.x зараз є: github.com/taskrabbit/elasticsearch-dump/pull/268
Бо

я встановив автентифікацію для elasticsearch, чи можете ви сказати мені, як передавати ім'я користувача та пароль у команді разом із місцем введення та виводу?
Gr8 Adakron

42

Використовуйте ElasticDump

1) yum встановити epel-release

2) yum встановити nodejs

3) yum встановити 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
Ортомала Локні,

2
Схоже, Elasticsearch 5 тепер підтримується github.com/taskrabbit/elasticsearch-dump/pull/268
hayduke

22

Для цього ви можете використовувати функцію знімка / відновлення, доступну в Elasticsearch. Після того, як ви налаштували сховище знімків на основі файлової системи, ви можете переміщати його між кластерами та відновлювати на іншому кластері


1
Перейдіть за цим посиланням для отримання додаткової інформації: qbox.io/blog/elasticsearch-data-snapshots-restore-tutorial
WaughWaugh

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
Акшай Патіл

5

Є також _reindexваріант

З документації:

За допомогою API переіндексування Elasticsearch, доступного у версії 5.x і пізнішої, ви можете віддалено підключити нове розгортання служби Elasticsearch до вашого старого кластеру 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

Звичайно. Зараз я працюю над перенесенням своїх даних на ESv5 із ESv1.7. Мій варіант не буде працювати для нього, оскільки багато речей змінилося в відображеннях.
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і папка, що відповідає цьому ідентифікатору, знаходиться data\nodes\0\indices(зазвичай всередині вашої папки elasticsearch, якщо ви не перемістили його).


1

Ми можемо використовувати elasticdumpабо multielasticdumpвзяти резервну копію та відновити її, Ми можемо перемістити дані з одного сервера / кластера на інший сервер / кластер.

Будь ласка, знайдіть детальну відповідь, яку я надав тут .


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 відновлення) у новому кластері або на сервері.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.