Как я могу скопировать данные Elasticsearch на новый сервер? - PullRequest
0 голосов
/ 11 октября 2019

Я установил Elasticsearch на новый сервер. У меня есть индекс, называемый метриками, куда меняются пользовательские метрики из моих приложений. Что я хочу сделать, это добавить метрики со своего старого сервера в этот индекс.

Я пытался использоватьasticdump на старом сервере следующим образом: elasticdump --input=http://oldserver:9200/metrics --output=metrics_dump.json --type=data, но после добавления в файл около 1 000 000 записей я получаю сообщение об ошибке (на старом сервере метрики имеется около 10 000 000 записей). Поэтому я подумал использовать прокрутку и сохранить записи в пакетном режиме: elasticdump --input=http://oldserver:9200/metrics --output=metrics_dump_1.json --type=data --searchBody='{ "sort": ["_doc"], "query": { "match_all": {} }, "size": 100000 }, но это не работает. Записи продолжают записываться в файл после отметки 100 000. Кроме того, при проверке первых строк в выходном файле я не вижу scroll_id, поэтому я подозреваю, что аргумент searchBody игнорируется.

Есть ли другой способ переместить эти данные? Мне не нужно терять новые записи из метрик нового сервера.

Ответы [ 2 ]

1 голос
/ 12 октября 2019

В дополнение к ответу, опубликованному @julodnik, одним из самых простых способов копирования данных является создание new кластера ES join старого / существующего кластера ES. Это можно сделать, настроив свойства в elasticsearch.yml в новом кластере так, чтобы они были похожи на существующий, особенно на главные узлы свойств (discovery.zen.ping.unicast.hosts) и имя кластера ('cluster.name`). Таким образом, новый кластер присоединится к существующему кластеру, и данные будут равномерно сбалансированы. Затем вы можете исключить старый кластер, используя

PUT _cluster/settings
{
  "transient" : {
    "cluster.routing.allocation.exclude._ip" : "IP_of_old_cluster"
  }
}

, прежде чем выключить его.

Другой вариант - настроить logstash для чтения индекса metrics и записи в ES. Вам необходимо настроить logstash.conf так, чтобы он читал весь индекс metrics. Что-то вроде

## SOURCE
input {
  elasticsearch {
    hosts => ["http://your_old_es_host:9200"]
    user => "elastic"
    password => "foopass"
    index => "metrics"
    scroll => "5m"
    size => 5000
    docinfo_fields => [ "_id" ]
    query => '{"query":
               {"match_all": {}
                }}'
  }
}

## TARGET
output {
  elasticsearch {
    hosts => ["http://your_new_es_host:9200"]
    index => "metrics-new"
    user => "elastic"
    password => "foopass"
  }
}
1 голос
/ 11 октября 2019

У вас есть несколько вариантов. Если вы можете остановить эластичный поиск на старом сервере, просто остановите его и скопируйте каталог данных. Это скопирует все.

Если нет, то вы можете использовать снимки . Сделайте снимок и восстановите данные на новом сервере. Вы можете указать, какие индексы должны быть зарезервированы и / или восстановлены. Пример создания снимка:

PUT /_snapshot/my_backup/snapshot_2?wait_for_completion=true
{
  "indices": "index_1,index_2",
  "ignore_unavailable": true,
  "include_global_state": false,
  "metadata": {
    "taken_by": "kimchy",
    "taken_because": "backup before upgrading"
  }
}

Пример восстановления снимка (после копирования папки снимков на новый сервер):

POST /_snapshot/my_backup/snapshot_1/_restore

Если вы уже не настроили какие-либо папки снимков, выпридется перенастроить и перезапустить эластичный поиск.

Третий вариант - скопировать данные с помощью reindex с использованием удаленного сервера.

POST _reindex
{
  "source": {
    "remote": {
      "host": "http://otherhost:9200",
      "username": "user",
      "password": "pass"
    },
    "index": "source",
    "query": {
      "match": {
        "test": "data"
      }
    }
  },
  "dest": {
    "index": "dest"
  }
}

Этот третий вариант должен работать без перезапуска эластичного поиска.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...